プログラミングと旅と映画の日々

食品の営業からSEに転職した文系エンジニアです。 プログラミングと趣味の株に関してブログを書いていこうと思います。

【Docker】githubへのビルドコンテキストのpushに伴うAutomated buildを実践【入門】

githubへのビルドコンテキストのpushに伴うAutomated buildを実践してみる

f:id:takanori5:20181028132956p:plain

Automated buildの設定方法

前回の記事
takanori5.hatenablog.com

Automated buildを実践

前回の設定に基づき、githubにビルドコンテキストをpush
それに伴うAutomated buildを見ていきます。

githubへのビルドコンテキストのpush

まずは空のリポジトリにDockerfileを作成していきます。
適当なDockerfileを作成

$ cat Dockerfile
FROM dockersamples/static-site
ENV AUTHOR="takanori5"

これをgithubにpush して見ます。

$ git push origin HEAD
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 270 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'master' on GitHub by visiting:
remote:      https://github.com/takanorihozumi/DockerAutomatedBuild/pull/new/master
remote:
To https://github.com/takanorihozumi/DockerAutomatedBuild.git
 * [new branch]      HEAD -> master

すると、もともと以下のような状態だったDockerhubのリポジトリ
f:id:takanori5:20181111141916p:plain
以下のように追加されていることがわかります。
まだステータスがQueuedですね
f:id:takanori5:20181111142033p:plain
しばらく待ちステータスがSuccessとなればビルド完了です。
f:id:takanori5:20181111142213p:plain

試しにDockerhubからイメージを取得して見ます。
取得できました!

 docker pull takanori5/dockerautomatedbuild
Using default tag: latest
latest: Pulling from takanori5/dockerautomatedbuild
fdd5d7827f33: Already exists
a3ed95caeb02: Already exists
716f7a5f3082: Already exists
7b10f03a0309: Already exists
aff3ab7e9c39: Already exists
Digest: sha256:29e35b7bdda590d8a3e6f78e22871e5aff1f90ce5bd6e52de2497313bb574617
Status: Downloaded newer image for takanori5/dockerautomatedbuild:latest

【Docker】Automated Build(自動build)の設定方法【入門】

DockerのAutomated Build(自動build)の設定方法

f:id:takanori5:20181028132956p:plain
Automated Build(自動build)を設定していきます。

まずはgithubやbitbucketなどのホスティングサービスとリンク設定を行います。

githubとdockerhubをリンクする方法

まずはdocker hubにいきます
右上の
Create>Create Automated buildを選択します。
f:id:takanori5:20181111131155p:plain

クリックすると、githubとリンクしていない場合は
以下のような画面が出ます。
f:id:takanori5:20181111131329p:plain

ではLink accountsをクリックしましょう!!
f:id:takanori5:20181111131639p:plain

githubとリンクしたい場合はlink githubをクリック!!
f:id:takanori5:20181111131807p:plain
2つの選択肢が出現しました。

上はpublicとprivate両方のリポジトリに権限を与えるもの
下はpublicのみ参照権限を与えるものです。
特に理由がないなら推奨されている上の連携方法を選びましょう。
githubリポジトリを持っていない場合事前に用意しておきましょう!)
f:id:takanori5:20181111132039p:plain
上の画面にてAuthorize dockerをクリックすれば連携完了となります。
f:id:takanori5:20181111132259p:plain
簡単ですね!

続いてautomated buildの設定を行います。

Dockerhubのautomated buildの設定方法

右上のCreate>Create automated buildをクリックします
すると以下の画面が出ます。
f:id:takanori5:20181111133138p:plain

create auto build githubをクリック
するとgithubリポジトリが連携されており一覧表示されていますね。
f:id:takanori5:20181111133326p:plain
設定したりリポジトリをクリック!
f:id:takanori5:20181111133422p:plain

ここで設定を行うことで
設定したリポジトリに変更があった際にイメージを自動ビルドします。
入力値はとりあえずデフォルト値のままCreateをクリックします。

リポジトリが作成され、設定内容が表示されました。
簡単ですね。
f:id:takanori5:20181111135444p:plain

webhookタブで設定を行うと、ビルドが行われた際に
設定した先に通知を行うことも可能です。
いいですね!
f:id:takanori5:20181111135721p:plain

【Docker】Automated Build(自動build)とは【入門】

DockerのAutomated Buildとは

f:id:takanori5:20181028132956p:plain

Automated Build

githubなどのホスティングサービスでビルドコンテキストを管理して
リポジトリ上のビルドコンテキスト(Dockerfileやその他ビルドに必要なファイル群)が変更された際に
自動でビルドを実行する仕組みのこと。

f:id:takanori5:20181111125508p:plain

【Docker】コンテナのリンクオプションとは【入門】

Dockerコンテナのリンクオプションとは

f:id:takanori5:20181028132956p:plain
こんにちは

本日はDockerのリンク機能についてみていきます。

リンクオプションの使い方

以下のコマンドで実行可能

docker run --link <コンテナ名orコンテナID> :<リンク先コンテナの別名>...

リンクオプションを付けた場合の動作

リンクオプションを付けてコンテナを起動した場合、

  • リンク先のコンテナにエイリアスで通信できるようになる(リンクしなくてもIPで通信は可能)
  • リンク先の環境変数や、リンク先コンテナのネットワークに対する環境変数が自動で追加される

実践

これから行うコンテナの構成図と概要

リバースプロキシコンテナとstatic siteコンテナの2つの構成を表す。
リバースプロキシコンテナからstatic siteコンテナにエイリアスでアクセスできるようにしていく

f:id:takanori5:20181110142101p:plain
*ちなみに、このようにブラウザからサーバの間にリバースプロキシを挟むことで
複数のウェブサーバーに負荷を分散させたり、身元を隠すことが可能です。

まず、nginxの設定ファイルを作成します

nginxのconfファイル作成
$ vim reverser_proxy.conf

$ cat reverser_proxy.conf
server {
 listern 8080;
 server_name localhost;

 location / {
  proxy_pass http://ss;
 }
}

この設定により、リバースプロキシコンテナの8080ポートにアクセスがきた場合に
ssというhostにリクエストを転送する動作となる

次にこの作成した設定ファイルをnginxの設定ファイルのディレクトリに配置して
新しいイメージを作成するDockerファイルを作成していきます!!

Dockerfileの作成
$ vim Dockerfile
$ cat Dockerfile
FROM nginx:latest
COPY /reverse_proxy.conf /etc/nginx/conf.d/reverse_proxy.conf
RUN apt-get update && apt-get install -y inetutuils-ping

COPY /reverse_proxy.conf /etc/nginx/conf.d/reverse_proxy.conf
で先ほど作成したconfをnginxの設定ファイルのディレクトリに配置
RUN apt-get update && apt-get install -y inetutuils-ping
その後pingで通信確認するのに必要なパッケージを取得しています。

ではDockerfileをビルドします。

imagebuild
$docker build -t reverse_proxy .
$ docker build -t reverse_proxy .
Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM nginx:latest
 ---> dbfc48660aeb
Step 2/3 : COPY /reverse_proxy.conf /etc/nginx/conf.d/reverse_proxy.conf
 ---> Using cache
 ---> 4ba07543c8af
Step 3/3 : RUN apt-get update && apt-get install -y inetutils-ping
 ---> Running in 818d2f64318c
Ign:1 http://cdn-fastly.deb.debian.org/debian stretch InRelease
Get:2 http://security-cdn.debian.org/debian-security stretch/updates InRelease [94.3 kB]
Get:3 http://cdn-fastly.deb.debian.org/debian stretch-updates InRelease [91.0 kB]
Get:4 http://cdn-fastly.deb.debian.org/debian stretch Release [118 kB]
Get:5 http://cdn-fastly.deb.debian.org/debian stretch-updates/main amd64 Packages [5152 B]
Get:6 http://security-cdn.debian.org/debian-security stretch/updates/main amd64 Packages [454 kB]
Get:7 http://cdn-fastly.deb.debian.org/debian stretch Release.gpg [2434 B]
Get:8 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 Packages [7099 kB]
Fetched 7864 kB in 17s (448 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  netbase
The following NEW packages will be installed:
  inetutils-ping netbase
0 upgraded, 2 newly installed, 0 to remove and 1 not upgraded.
Need to get 242 kB of archives.
After this operation, 390 kB of additional disk space will be used.
Get:1 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 netbase all 5.4 [19.1 kB]
Get:2 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 inetutils-ping amd64 2:1.9.4-2+b1 [223 kB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 242 kB in 0s (249 kB/s)
Selecting previously unselected package netbase.
(Reading database ... 7027 files and directories currently installed.)
Preparing to unpack .../archives/netbase_5.4_all.deb ...
Unpacking netbase (5.4) ...
Selecting previously unselected package inetutils-ping.
Preparing to unpack .../inetutils-ping_2%3a1.9.4-2+b1_amd64.deb ...
Unpacking inetutils-ping (2:1.9.4-2+b1) ...
Setting up netbase (5.4) ...
Setting up inetutils-ping (2:1.9.4-2+b1) ...
Removing intermediate container 818d2f64318c
 ---> 6f5bab86233d
Successfully built 6f5bab86233d
Successfully tagged reverse_proxy:latest

build成功です!
docker imagesで念のため確認しておきます。
大丈夫そうですね!

$ docker images
REPOSITORY               TAG                   IMAGE ID            CREATED              SIZE
reverse_proxy            latest                6f5bab86233d        About a minute ago   127MB

続いてstatic siteコンテナを起動しておきます。

static siteコンテナの起動
$ docker run --name static-site -e AUTHOR="Takanori5" -d dockersamples/static-site
Unable to find image 'dockersamples/static-site:latest' locally
latest: Pulling from dockersamples/static-site
fdd5d7827f33: Pull complete
a3ed95caeb02: Pull complete
716f7a5f3082: Pull complete
7b10f03a0309: Pull complete
aff3ab7e9c39: Pull complete
Digest: sha256:daa686c61d7d239b7977e72157997489db49f316b9b9af3909d9f10fd28b2dec
Status: Downloaded newer image for dockersamples/static-site:latest
6be1be9837e6b1ff70952a4c1fca4035ec4aeae6279ff4b18d441950e9ba1355

*-eは引数の環境変数を設定するオプション
 このページではAUTHORという環境変数に名前を設定しておくとそれが静的ページに表示される仕組みとなっています。

次に、先ほど作成したリバースプロキシイメージから
コンテナを起動します

リバースプロキシイメージからコンテナを起動
$ docker run --name reverse_proxy  -p 8080:8080 --link static-site:ss -d reverse_proxy
226d3824bfdb0b5a02498e8354740c8b4542598ae3a7a339c5d60b2ae6902c39

このコンテナは8080番ポートを外部に公開し、
staticsiteコンテナにリンクして、エイリアスとしてssという名前を付けています。

起動中のプロセスを一度確認します。

$ docker ps
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                            NAMES
4b70064342f6        reverse_proxy               "nginx -g 'daemon of…"   5 seconds ago       Up 4 seconds        80/tcp, 0.0.0.0:8080->8080/tcp   reverse-proxy
6be1be9837e6        dockersamples/static-site   "/bin/sh -c 'cd /usr…"   12 minutes ago      Up 11 minutes       80/tcp, 443/tcp                  static-site

2つのコンテナが起動できました。

コンテナの動作確認

では、2つのコンテナの動作確認をしていきます!!

まずはブラウザでローカルホストの8080にアクセスしてみます。
http://localhost:8080/
f:id:takanori5:20181110153119p:plain
このWebページはリバースプロキシを経由してstaticsiteコンテナにアクセスすることで取得しています。
では、リバースプロキシコンテナにシェル接続してリンクによる設定を確認してみます。

$ docker exec -it reverse-proxy /bin/bash
root@4b70064342f6:/#

まずは、どのようにしてstaticsiteやssというエイリアス名で通信先を特定できたのか確認します。
hostファイルを見ます。

root@4b70064342f6:/# cat /etc/hosts
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.17.0.4	ss 6be1be9837e6 static-site
172.17.0.5	4b70064342f6

172.17.0.4 ss 6be1be9837e6 static-site
ここで名前解決していますね。
これがリンク機能の一つです。
続いてenvコマンドで環境変数の設定を見ていきます。

/# env |grep SS_
SS_ENV_NGINX_VERSION=1.9.12-1~jessie
SS_PORT_443_TCP_ADDR=172.17.0.4
SS_PORT_80_TCP=tcp://172.17.0.4:80
SS_PORT_443_TCP=tcp://172.17.0.4:443
SS_ENV_AUTHOR=Takanori5
SS_PORT_80_TCP_PROTO=tcp
SS_PORT=tcp://172.17.0.4:80
SS_PORT_443_TCP_PORT=443
SS_PORT_80_TCP_ADDR=172.17.0.4
SS_NAME=/reverse-proxy/ss
SS_PORT_443_TCP_PROTO=tcp
SS_PORT_80_TCP_PORT=80

author変数に値が設定されていますね!
この環境変数はreverse-proxyコンテナに明示的に指定していませんが、
リンク先コンテナに指定しているものなので
リンク機能により自動で設定がされています!
便利ですね!!

これらがリンクの機能です!
コンテナ名の名前解決はリンクを使わなくても
Dockerのネットワークを作ることで実現できるので
ここで見たように環境変数を注入したい時だけ使うといいみたいです。

今回は以上です。

【Docker】起動中のコンテナのシェルへの接続方法【入門】

起動中のDockerコンテナのシェルへの接続方法

f:id:takanori5:20181028132956p:plain
以下の二つの方法で接続可能

docker attach コンテナ名
docker exec -it コンテナ名 /bin/bash

docker attach コンテナ名

コンテナで起動しているPID=1のプロセスの標準入出力(STDIN/STDOUT)に接続(attach)する。

docker exec -it コンテナ名 /bin/bash

dockerコンテナで任意のコマンドを実行させる。

  • itオプションについては意味合いは以下の通り

i 標準入力(STDIN)を開いたままにする
t 擬似ttyに接続する。ディスプレイ(STDOUT)をつなぐイメージ

execの方が 不意にコンテナが止めてしまったりといったことが起きづらいためこちらを推奨

【Docker】コンテナのライフサイクル【入門】

コンテナのライフサイクル

f:id:takanori5:20181028132956p:plain
コンテナとはDockerイメージのファイルシステムを元に作られる一種の仮想環境。
コンテナはホストマシンの1プロセスとして動作する
docker runコマンドでは
createdからのrunningまでをまとめて行なっている

f:id:takanori5:20181103164146p:plain

【Docker】Docker fileのCOPY命令で設定ファイルを保存【入門】

Docker fileのCOPY命令ADD命令

f:id:takanori5:20181028132956p:plain
COPY命令はホストマシン上のファイルをイメージ内にコピーする命令です。

nginxイメージ内に修正した設定ファイルの内容を保存していきたいと思います。

まずはnginxコンテナを立ち上げていきます。

$ docker run --name tmp-nginx --rm -d nginx
960e083f54488cf5815e4bd3bb6830b4135d27e2bfb6bbfadd28b7e8dcf4be5e

-rm オプションはdocker imagestop時にコンテナを自動削除するオプションです。

コンテナからホストへのコピー
$docker cp <コンテナID>:/etc/my.cnf my.cnf
ホストからコンテナへのコピー
$docker cp my.cnf <コンテナID>:/etc/my.cnf

では、やってみます

$ docker cp tmp-nginx:/etc/nginx/conf.d/default.conf ./
$ ls
default.conf

copyできました。
では設定ファイルに修正を加えます。

$ vim default.conf
#port番号を80から8080に変更します。
server {
    listen       8080;
    server_name  localhost;
...
}

以下のようなDockerfileを作成して、COPY命令を書きます。

nginxのイメージを元にしてCOPY命令を書きます。

$ cat Dockerfile
FROM nginx:latest
COPY default.conf /etc/nginx/conf.d/default.conf

ではbuildします。

$ docker build -t nginx:ver1 .
Sending build context to Docker daemon  4.096kB
Step 1/2 : FROM nginx:latest
 ---> dbfc48660aeb
Step 2/2 : COPY default.conf /etc/nginx/conf.d/default.conf
 ---> 9179d15926aa
Successfully built 9179d15926aa
Successfully tagged nginx:ver1

build成功。これを元にコンテナを起動します。

$ docker run --name web -p 8080:8080 --rm nginx:ver1
172.17.0.1 - - [02/Nov/2018:07:32:24 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36" "-"

8080ポートで接続できました。