こんにちは。takapy(@takapy0210)です。
本記事は、転職カウントダウンカレンダー 3日目の記事です。
はじめに
本記事は昨日書いた記事の続編です。
本記事では、Automated Build、Docker Machine、AWS上でDockerホスト起動などについてまとめてみようと思います。
Automated Build(自動ビルド)について
自動ビルドとは、GithubやBitbucketといったソースコードのホスティングサービスでビルドコンテキスト(Dockerfileやその他のビルドに必要なファイル群)を管理し、リポジトリ上のビルドコンテキストの内容が変更された場合にDockerHubが自動的にビルドを実行する仕組みのことです。
DockerHub上での設定
下記手順でGithubアカウントと連携させます。
右上のユーザをクリックし、Account Settingを押下します。
Linked AccountsからGithubと連携設定を行います。
新しくリポジトリを作成する際にGithubのリポジトリと紐づけます。
これでリポジトリの作成は終了です。
関連する機能として、リポジトリに新しいイメージが反映された時点で、外部のアプリケーションに通知を行う、Webhooksという機能があります。ビルドが完了した時点で指定のURLにPOSTリクエストを送信してくれるので、例えばslackなどと連携しておけば、ビルド完了時に通知を受け取る、という設定も可能になります。
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リポジトリが
このように変化し、自動的にビルドされていることが確認できます。
自動ビルドしたイメージを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のインストール
インストールされていない方は、下記記事を参考にしてインストールしてみてください。
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/ にアクセスしてみます。
起動していることが確認できました。
コンテナを停止したい場合は下記コマンドです。
$ docker-machine stop aws-sandbox
また、Dockerホストを削除したい場合は下記コマンドです。
$ docker-machine rm aws-sandbox
参考
ゼロからはじめる Dockerによるアプリケーション実行環境構築
【図解】Dockerの全体像を理解する -後編- - Qiita
以上。