ギークなエンジニアを目指す男

機械学習系の知識を蓄えようとするブログ

【初心者向け】実際に動かしながらDockerを学ぶ〜中編〜

f:id:taxa_program:20190218142843p:plain:w350

こんにちは。takapy(@takapy0210)です。

本記事は、転職カウントダウンカレンダー 3日目の記事です。

www.takapy.work

はじめに

本記事は昨日書いた記事の続編です。

www.takapy.work

本記事では、Automated Build、Docker Machine、AWS上でDockerホスト起動などについてまとめてみようと思います。

Automated Build(自動ビルド)について

自動ビルドとは、GithubやBitbucketといったソースコードのホスティングサービスでビルドコンテキスト(Dockerfileやその他のビルドに必要なファイル群)を管理し、リポジトリ上のビルドコンテキストの内容が変更された場合にDockerHubが自動的にビルドを実行する仕組みのことです。

f:id:taxa_program:20190218144752p:plain
Automated Build(自動ビルド)の仕組み

DockerHub上での設定

下記手順でGithubアカウントと連携させます。

右上のユーザをクリックし、Account Settingを押下します。

f:id:taxa_program:20190218145526p:plain:w520
Account Settingを押下

Linked AccountsからGithubと連携設定を行います。

f:id:taxa_program:20190218145646p:plain

新しくリポジトリを作成する際にGithubのリポジトリと紐づけます。

f:id:taxa_program:20190218150400p:plain

これでリポジトリの作成は終了です。

関連する機能として、リポジトリに新しいイメージが反映された時点で、外部のアプリケーションに通知を行う、Webhooksという機能があります。ビルドが完了した時点で指定のURLにPOSTリクエストを送信してくれるので、例えばslackなどと連携しておけば、ビルド完了時に通知を受け取る、という設定も可能になります。

f:id:taxa_program:20190218151217p:plain
Webhooksの設定画面

Webhooksで設定するパラメータは公式リファレンスをご参照下さい。

自動ビルドを実行してみる

まずは、自動ビルドの対象となるGithubリポジトリをcloneし、そのディレクトリへ移動します。

$ git clone https://github.com/takapy0210/automated-build-test.git
$ cd automated-build-test/

次にこのディレクトリ内に下記のようなDockerfileを作成します。ここでは、静的なWebサイトを表示させるdockersamples/static-siteを利用します。

FROM dockersamples/static-site
ENV AUTHOR="takapy"

GithubにPushしていきます。

$ git add Dockerfile
$ git commit -m "Initial commit"
$ git push origin master

すると、下記状態だったDockerHubリポジトリが

f:id:taxa_program:20190218152424p:plain
Githubへpush前

このように変化し、自動的にビルドされていることが確認できます。

f:id:taxa_program:20190218152523p:plain
Githubへpush後

自動ビルドしたイメージをPullしてみる

$ docker pull takapy0210/automated-build-test-dhub
$ docker images
REPOSITORY                             TAG                 IMAGE ID            CREATED             SIZE
takapy0210/automated-build-test-dhub   latest              82bfe99e62b0        12 minutes ago      191MB

イメージを取得することができました!

Docker Machineについて

Docker MachineとはDocker Engineを搭載した仮想マシンの作成、起動、停止、再起動などをコマンドラインから実行できるツールです。ローカルPCだけでなく、リモートのクラウドプロバイダ上でDockerホストを立ち上げて管理することも可能です。

Mac OSの場合は、仮想化ソフト(Virtual Box)をドライバーに使用して、Docker Engineを搭載した仮想マシンを管理するのがDocker Machineです。

Virtual Boxのインストール

インストールされていない方は、下記記事を参考にしてインストールしてみてください。

pc-karuma.net

Dockerホストの作成

docker-machineによって起動したDocker Engineが動作している仮想マシンのことをDockerホストと呼びます。

# 現在存在しているDockerホストの一覧を表示
$ docker-machine ls

# Dockerホストの起動
$ docker-machine create --driver virtualbox default

--driver virtualboxコマンドは、仮想化のdriverにvirtualboxを利用していることを示し、defaultの部分でDockerホストの名前を指定しています。このdefaultの部分は任意の名称にすることができます。

Dockerホストの起動後、ホスト一覧を確認してみるとdefaultというDockerホストが起動していることが確認できます。

$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
default   -        virtualbox   Running   tcp://192.168.99.100:2376           v18.09.2

Dockerホストへの接続

envコマンドにより、操作対象のDockerホストを設定するための設定コマンドが表示できます。例えば、上記で起動させたdefaultホストへ接続したいとなった場合、下記コマンドで設定コマンドを確認します。

$ docker-machine env default
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/takapy/.docker/machine/machines/default"
export DOCKER_MACHINE_NAME="default"
# Run this command to configure your shell:
# eval $(docker-machine env default)

上記で表示されたeval $(docker-machine env default)というコマンドで、defaultホストへ接続することができます。

$ eval $(docker-machine env default)
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
default   *        virtualbox   Running   tcp://192.168.99.100:2376           v18.09.2

ACTIVEのカラムに*が付いていることが分かります。これは現在どのホストがACTIVEかを表しています。

試しにhello-worldコンテナを実行してみます。

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

正しく起動できていそうです。

ここでは、今まで扱ってきたDocker for Mac上の仮想マシンでコンテナが動いている訳ではなく、今回新しく作成したdefaultホスト上で動作しています。

Dockerホストへssh接続

ssh接続し、defaultホストでどのような処理が行われたのか確認してみます。

$ docker-machine ssh default
docker@default:~$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
e666b635d319        hello-world         "/hello"            3 minutes ago       Exited (0) 3 minutes ago                       ecstatic_jang

上記を見る限り、hello-worldコンテナが3分前に動作していたことが分かります。sshをログアウトするにはexitコマンドです。

docker@default:~$ exit

Dockerホスト上でWebページを表示

Dockerホスト上のIPアドレスを確認してみます。

$ docker-machine ip default
192.168.99.100

Dockerホスト上でnginxを起動させます。

$ docker run -d -p 8000:80 nginx

上記IPアドレスの8000ポート(http://192.168.99.100:8000/)にアクセスしてみると、nginxのデフォルトページが表示されると思います。

明示的にDockerホストを停止、起動させる場合は下記コマンドでできます。

$ docker-machine stop default
$ docker-machine start default

ACTIVEのホストを解除する

現在の状態はこのようになっています。

$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
default   *        virtualbox   Running   tcp://192.168.99.100:2376           v18.09.2

Dcokerホストへの接続時と同様に、設定した環境変数を削除するコマンドを確認します。

$ docker-machine env -u
unset DOCKER_TLS_VERIFY
unset DOCKER_HOST
unset DOCKER_CERT_PATH
unset DOCKER_MACHINE_NAME
# Run this command to configure your shell:
# eval $(docker-machine env -u)

上記にあるようにeval $(docker-machine env -u)のコマンドでACTIVEを解除することができます。

$ eval $(docker-machine env -u)
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
default   -        virtualbox   Running   tcp://192.168.99.100:2376           v18.09.2

AWSへのDockerホストのプロビジョニング

docker-machineコマンドでEC2を作成してみます。

まずは、credentialsファイルを作成します。XXXXXXXXの部分にはIAMユーザのアクセスキーIDとシークレットキーIDを指定します。

ホームディレクトリの下にディレクトリを作成し、その中にcredentialsファイルを作成します。

$ mkdir ~/.aws

credentialsファイルの中身

[default]
aws_access_key_id = XXXXXXXX
aws_secret_access_key = XXXXXXXX

下記コマンドでEC2上でdockerホストを起動することができます。

$ docker-machine create --driver amazonec2 --amazonec2-open-port 8000 --amazonec2-region ap-northeast-1 aws-sandbox

$ docker-machine ls
NAME          ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
aws-sandbox   -        amazonec2    Running   tcp://54.64.74.32:2376              v18.09.2
default       -        virtualbox   Running   tcp://192.168.99.100:2376           v18.09.2

EC2上のホストをACTIVEにします。

$ docker-machine env aws-sandbox
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://54.64.74.32:2376"
export DOCKER_CERT_PATH="/Users/takapy/.docker/machine/machines/aws-sandbox"
export DOCKER_MACHINE_NAME="aws-sandbox"
# Run this command to configure your shell:
# eval $(docker-machine env aws-sandbox)

$ eval $(docker-machine env aws-sandbox)
$ docker-machine ls
NAME          ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
aws-sandbox   *        amazonec2    Running   tcp://54.64.74.32:2376              v18.09.2
default       -        virtualbox   Running   tcp://192.168.99.100:2376           v18.09.2

コンテナを起動してみます。ここではkitematic/hello-world-nginxイメージを使用して、webserverという名前のコンテナを起動します。

$ docker run -d -p 8000:80 --name webserver kitematic/hello-world-nginx

IPアドレスを確認してみます。

$ docker-machine ip aws-sandbox
54.64.74.32

http://54.64.74.32:8000/ にアクセスしてみます。

f:id:taxa_program:20190218171056p:plain

起動していることが確認できました。

コンテナを停止したい場合は下記コマンドです。

$ docker-machine stop aws-sandbox

また、Dockerホストを削除したい場合は下記コマンドです。

$ docker-machine rm aws-sandbox

参考

ゼロからはじめる Dockerによるアプリケーション実行環境構築

【図解】Dockerの全体像を理解する -後編- - Qiita

以上。