本題の前に
位置付け・前提
本記事は、社内ワークショップ のために用意したものです。そのため、次の前提で進めることをご理解ください。
また、本稿はこちらの続きとなります。
コンテナ技術 ハンズオン Vol.1 Docker操作編
コンテナ技術 ハンズオン Vol.2 Dockerイメージ編
目的や前提なども上記の内容に準拠します。
docker ハンズオン環境
今回も Play with Docker を活用してハンズオンを行います。
※要:Docker Hub アカウント
注意点として、この環境は4時間の制限があります。4時間経過すると環境が削除されてしまう点を注意して下さい。
もちろんローカル環境でも構いません。
ハンズオンの前に
前回の問題(宿題)
前回のハンズオンで最後に出した問題はこちら。
Q1. CentOS を最新状態にアップデートして、nginx をインストール&起動した状態のDockerイメージ「nginx1」を作成してください。
Q2. 起動しているコンテナはホストのどのディレクトリにあるでしょうか。
Q3. dockerイメージはどこにあるでしょうか。
Q4. dockerのプロセスはどれか。
うまく ググれカス 答えられましたでしょうか。
前回の問題の解答
解答1. CentOS を最新状態にアップデートして、nginx をインストール&起動した状態のDockerイメージ「nginx1」を作成する方法
FROM centos
RUN /bin/yum update -y
RUN yum install https://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.8.1-1.el7.ngx.x86_64.rpm -y
RUN sudo yum clean all
ENTRYPOINT /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf
EXPOSE 80
yum のパッケージデータベースに無いので、こちらのURLから直接インストールするのがポイントです。
この dockerfile があるディレクトリで下記のコマンドを実行します。
docker build -t nginx1 .
これで nginx の Docker イメージが出来上がりました。下記のように確認できればOKです。
$ docker run -it -d -p 80:80 --name httpsvr nginx1
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
93832ab2a64d nginx1:1.0 "/bin/sh -c '/usr/sb…" 24 seconds ago Up 23 seconds 0.0.0.0:80->80/tcp httpsvr
80番ポートに接続してみられます。
解答2. 起動しているインスタンスを一括停止するコマンド
以下のように対象インスタンスをたくさん並べる方法があります。
docker stop {コンテナID|NAMES} {コンテナID|NAMES} ...
以下のように対象インスタンスをすべて一発で停止する方法があります。
docker stop $(docker ps -q)
これ一発で完了です。誤操作すると困るので、数が多くなるとIDを指定した方が無難かも知れません
解答3. 起動しているインスタンスを一括削除するコマンド
おなじように対象インスタンスをたくさん並べる方法があります。
docker rm -f {コンテナID|NAMES} {コンテナID|NAMES} ...
-f で強制停止&削除となります。
こちらも以下のように対象インスタンスをすべて一発で停止する方法があります。
docker rm $(docker ps -q -a)
これ一発で完了です。誤操作すると困るので、数が多くなるとIDを指定した方が無難かも知れません
解答4. 起動しているイメージを一括削除するコマンド
おなじように対象となるイメージをたくさん並べる方法があります。
docker rm -f {イメージID|REPOSITORY} {イメージID|REPOSITORY} ...
-f で利用しているインスタンスの強制停止よび削除も併せて行います。
こちらも以下のように全イメージをすべて一発で削除する方法があります。
docker rmi $(docker images -q)
これ一発で完了です。ただ、このコマンドは自分の検証環境以外ではかなり危険です。
誤操作すると困るので、数が多くなるとIDを指定した方が無難かも知れません
ハンズオン
今回のゴール
Docker Compose でコンテナを制御・ビルドできるようになる
今回やらないこと
- Docker のリソースを制御できるようになる
- Docekr のトラブルシューティングができるようになる
- kubernetes などのオーケストレーションツールは使いません。
これから進める中で必ず理解しておいて欲しいこと
Docker-compose自体の知識は、こちらを読んで獲得してください。
本ハンズオンは、上記のスライドの内容を理解している前提で進めます。
非常に分かり易い資料ありがとうございます。> Masahito Zembutsu様 (Qiita)
Docker Compose
Docker Compose とは
端的に言えば、下記のツールとなります。
Docker Compose の利用意義
Docker Compose の実例
とても複雑な構成のコンテナたちを build して、run できます。
Docker Compose のメリット
Docker Compose で複数のコンテナを連動させて運用していくハンズオンを行っていきます。
はじめての Docker Compose
こちらで試した WordPress + MySQL のコンテナを Docker-compose で起動してみます。
再び WordPressインスタンスの作成 - コンテナ技術 ハンズオン Vol.1 Docker操作編 - Qiita
Docker Compose では次のようにYAML形式のファイルを利用します。
version: '3.1' # YAMLバージョンの指定(ほぼ固定)
services:
db: # コンテナの名前
image: mysql:5.7 # ベースとするイメージ
restart: always # ダウンしたら再起動する
environment: # 以下で環境変数を指定する
MYSQL_ROOT_PASSWORD: wppassword
MYSQL_DATABASE: wp
MYSQL_USER: wpuser1
MYSQL_PASSWORD: password
wp: # コンテナの名前
image: wordpress # ベースとするイメージ
ports: # 通信ポートの紐付け
- 8081:80 # {ホストOSの通信ポート}:{コンテナの通信ポート}
links: # コンテナ同士の紐付け(IPアドレス無しで通信可)
- db:mysql # {コンテナ名}:{別名}
depends_on: # 依存関係(どのコンテナが動作することを前提とするか)
- db
restart: always # ダウンしたら再起動する
environment: # 以下で環境変数を指定する
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_PASSWORD: password
ここでは、MySQL と WordPress を一気にイメージ化できる設定となります。
この docker-compose.yml があるディレクトリで、下記のコマンドを実行します。
docker-compose up -d
バックグラウンドでイメージ生成した後、コンテナ実行することができます。ちなみに、-d を外してフォアグラウンド実行すると、つらつらと実行ログが出力されたのち、アクセスログを確認できる状態になります。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f5f83c1f8db5 wordpress "docker-entrypoint.s…" 6 minutes ago Up 48 seconds 0.0.0.0:8081->80/tcp dc1_wp_1
d1218cd9cc6b mysql:5.7 "docker-entrypoint.s…" 7 minutes ago Up 49 seconds 3306/tcp, 33060/tcp dc1_db_1
docker-compose でもコンテナ(インスタンス)の起動状態を確認できます。
$ docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------
wp_db_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
wp_wp_1 docker-entrypoint.sh apach ... Up 0.0.0.0:8081->80/tcp
docker ps コマンドとは若干違う、簡潔な表示になっています。
次にインスタンスを停止するには、下記のコマンドで実行します。
docker-compose stop
この状態だとインスタンスが残ります。下記コマンドで確認しましょう。
docker-compose ps
停止するしているインスタンスを再開するには、下記のコマンドで実行します。
docker-compose start
次にインスタンスを停止・削除するには、下記のコマンドで実行します。
docker-compose down
これでインスタンスもイメージも消えました。下記コマンドで確認しましょう。
$ docker-compose ps
Name Command State Ports
------------------------------
$ docker images ls
REPOSITORY TAG IMAGE ID CREATED SIZE
Docker Compose でイメージ作成&起動する
こちらで紹介されている手順を試してみます。
docker-compose.ymlでDockerfileを指定したい | cloudpack.media
下記3つの構成ファイルを作成してください。
version: '3'
services:
container1:
build: # イメージのbuild指定
context: .
dockerfile: Dockerfile # Dockerfileのパス指定
container2:
build: # イメージのbuild指定
context: .
dockerfile: Dockerfile2 # Dockerfile2のパス指定
container3:
build: .
FROM python:3.6
FROM node:latest
この docker-compose.yml があるディレクトリで、下記のコマンドを実行します。
docker-compose up -d
このように一括ビルドすることも可能です。起動できていることが確認できたら削除しましょう。
$ docker-compose ps
Name Command State Ports
------------------------------------------------------------
bd_container1_1 python3 Exit 0
bd_container2_1 docker-entrypoint.sh node Exit 0
bd_container3_1 python3 Exit 0
$ docker-compose down
Removing bd_container3_1 ... done
Removing bd_container2_1 ... done
Removing bd_container1_1 ... done
Removing network bd_default
$ docker-compose ps
Name Command State Ports
------------------------------
$ docker images ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ちなみに、build だけすることも可能です。
docker-compose build
---
違いを確認しておきましょう。
```shell
$ docker-compose ps
Name Command State Ports
------------------------------
$ docker images ls
REPOSITORY TAG IMAGE ID CREATED SIZE
$ docker-compose up
Creating network "bd_default" with the default driver
Creating bd_container3_1 ... done
Creating bd_container1_1 ... done
Creating bd_container2_1 ... done
Attaching to bd_container3_1, bd_container1_1, bd_container2_1
bd_container3_1 exited with code 0
bd_container1_1 exited with code 0
bd_container2_1 exited with code 0
docker のローカルキャッシュしますので、images からは見えません。その代わり、up すると、Docker Hub/レジストリからは取得せずにインスタンスを起動します。
build に非常に時間がかかる場合には、分けて実行するのを推奨するケースもあるようです。
Docker Compose で簡易メールサーバーを構築する
少し実用的なサーバーを作ってみましょう。こちらで紹介されている手順を試してみます。
docker-compose + mailhogでローカルSMTPテストサーバを手軽に構築する
下記のファイルを作成してください。
version: "3"
services:
mail:
image: mailhog/mailhog:latest
ports:
- "8025:8025"
- "1025:1025"
このファイルがあるディレクトリで、コンテナを起動します。
docker-compose up -d
起動した後、8025 ポートにアクセスすると、受信メールの確認画面が使えます。1025 ポートは送信ポートなので、WEBアクセスしても画面表示はされません。
先の紹介ページのようにテストスクリプトやsendmailコマンドなどでメールの送信テストをしても良いかもしれません。
このように、インフラの検証などに利用しやすいシステムをすぐに用意するのに便利ですね。
Docker Compose で Djangoアプリケーションを構築する
Python などのフレームワークで開発した WEBアプリケーション を収めたコンテナを起動する、といっった使い方には、非常に有効です。
こちらで紹介されている手順を試してみます。
クイックスタート・ガイド:Docker Compose と Django — Docker-docs-ja 17.06.Beta ドキュメント
下記3つの構成ファイルを作成してください。
version: '2'
services:
db:
image: postgres
web:
build: .
command: python manage.py runserver 0.0.0.0:8000 # コンテナで実行する命令
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db # dbインスタンス起動後に実行する
FROM python:2.7
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
Django
psycopg2
この docker-compose.yml があるディレクトリで、Django プロジェクトを docker-compose コマンドを使って作成します。
docker-compose run web django-admin.py startproject composeexample .
ポイントは、イメージをビルドした後、Django プロジェクトを開始するコマンドをコンテナに送っているところです。
このように、フレームワークと組み合わせた複雑なコンテナを構築して利用することも簡単に実現できます。
Docker Compose で SNSサービス Mastodonインスタンスを構築する
複雑なサービスで構成されている、こちらのSNSサービス「Mastodon」を確認します。ここでは実際に構築しなくても構いません。
Mastodonは、build にかなりの時間がかかる&設定ファイルの作りこみが必要なので、実際に起動できるようにするには少しハードルが高いです。別インスタンスを建てて実行する、あるいは時間のあるときにじっくり実行した方がよいかもしれません。
git clone https://github.com/tootsuite/mastodon
cd mastodon/
cp .env.production.sample .env.production
mkdir postgres
mkdir redis
docker-compose build
docker-compose run --rm web rake secret
git で clone したファイルに含まれる docker-compose.yml を使って、build および インスタンスの起動まで行います。
docker-compose.yml を見ると下記のサービスが含まれており、複雑に定義されていることが分かります。
- ruby
- redis
- PostgreSQL
- sidekiq
このように複雑な構成のシステムについて、コマンドほぼ一発で build & 起動するにも役立ちます。
Docker Compose リファレンス
Docker-compose の豊富な機能を活用するには、下記を参照するのが良いでしょう。
- 公式リファレンス
- スライド資料
問題(宿題)
下記のサイトの docker-compose.yml のいずれかを実行してみましょう。
-
【Docker】これは役に立つ!! docker-compose.ymlの例まとめ
- Alfresco
- Apache Kafka
- Apache Zookeeper
- asciinema.org
- Bind9 Domain Name Server
- Cloud9
- CloudFlare
- Concrete5
- Confluence
- Consul Cluster
- Consul-Registrator
- DataDog Agent & DogStatsD
- DNS Update (RFC2136)
- DNSimple DNS
- DokuWiki
- Drone
- Drone Rancher Node Manager
- Rancher ECR Credentials Updater
- Elasticsearch
- Elasticsearch 2.x
- AWS ELB Classic External LB
- Etcd
- F5 BIG-IP
- FBCTF
- Ghost
- GitLab
- Gocd agent
- Gocd server
- Gogs
- Grafana
- Hadoop + Yarn
- Janitor
- Jenkins
- Jenkins Swarm Plugin Clients
- Kibana 4
- Let's Encrypt
- Liferay Portal
- Logmatic
- Logspout
- Logstash
- MariaDB Galera Cluster
- Minecraft
- MongoDB
- Mumble
- Netdata
- Nuxeo
- Odoo
- OpenVPN
- OpenVPN-httpdigest
- OpenVPN-LDAP
- Owncloud
- Percona XtraDB Cluster
- PHP Adminer
- Plone 5.0
- PointHQ DNS
- PowerDNS
- Prometheus
- Puppet 4 .x (standalone)
- px-dev
- QuasarDB
- RabbitMQ
- rancher-security-bench
- Registry
- Registry Convoy
- REX-Ray
- RocketChat
- Route53 DNS
- ScaleIO NAS/DAS
- Secrets Bridge
- Secrets Bridge Agents
- Sematext Docker Agent
- Sentry
- SonarQube
- Sysdig
- Sysdig Cloud
- Taiga
- TeamCity
- Traefik
- Turtl
- Weave Scope
- Wekan
- Wordpress
- XPilots
おわりに
今回は Docker Compose でコンテナを制御・ビルドする方法について、ハンズオンをしました。
あと少し Docker リソースを管理できるようになってくれば、ようやく現実的な運用に利用できる状態となってきます。
それはまた次のハンズオンで学習しましょう。
参考
これまでに紹介した記事以外に、本ハンズオン資料を作成する上で下記の記事を参考にさせていただきました。
- Overview of Docker Compose | Docker Documentation
- Docker Compose — Docker-docs-ja 17.06.Beta ドキュメント
- Docker Compose 徹底解説
- Dockerfile を書くためのベストプラクティス解説編
- Dockerfile のベストプラクティス — Docker-docs-ja 1.9.0b ドキュメント
- 再び WordPressインスタンスの作成 - コンテナ技術 ハンズオン Vol.1 Docker操作編 - Qiita
- docker-compose.ymlでDockerfileを指定したい | cloudpack.media
- docker-compose + mailhogでローカルSMTPテストサーバを手軽に構築する
- Docker+MacでMastodonインスタンスをローカルで構築する|てくてくぷれいす
- 入門 Docker
大変ありがとうございました。