「Docker CLI チートシート」および「Dockerfile ベストプラクティス (仮)」でコンテナの作成方法および単体での起動方法を把握しました。これらコンテナを複数起動して連携させる、オーケストレーションを実現する方法しては Docker 社が提供する Docker Swarm だけでなく、Amazon EC2 Container Service (ECS) や Google Container Engine (GKE) などが存在します。これらの方法のうち、特に今後優勢とされるのが GKE で採用されている Kubernetes であり、Docker 社はこれを Docker Swarm と同様に公式にサポートすることを発表しました。
そのため、今後は以下にまとめる Docker Compose だけではなく Kubernetes も開発用 PC での環境構築に利用できるようになるようですが、現在のところ複数のコンテナを連携させるためには Docker 社が公式にサポートする Docker Compose というツールを利用すると便利です。YAML ファイルに記載した設定にしたがって、開発用 PC 上にコンテナを複数起動して互いに連携させることができます。2017/10/23 現在の Docker Compose バージョンは 3 です。
実用性はありませんが、以下の三つのコンテナを作成してみます。
Dockerfile
FROM centos:centos6
RUN yum update -y && yum install -y mysql
docker-compose.yml
version: '3'
services:
myservice:
build: .
container_name: myservice
command: tail -f /dev/null
volumes:
- .:/work
- my-vol:/data
links:
- myweb
- mydb
myweb:
image: nginx
container_name: myweb
restart: always
volumes:
- my-vol:/data
ports:
- 20080:80
mydb:
image: mysql
container_name: mydb
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- my-vol:/data
ports:
- 23306:3306
volumes:
my-vol:
$ docker-compose up
$ docker-compose down
以下のような状態になります。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
904d08aa7326 xxxx_myservice "tail -f /dev/null" 31 minutes ago Up 31 minutes myservice
6fec25e9cc26 mysql "docker-entrypoint..." 31 minutes ago Up 31 minutes 0.0.0.0:23306->3306/tcp mydb
13fabbb8a824 nginx "nginx -g 'daemon ..." 31 minutes ago Up 31 minutes 0.0.0.0:20080->80/tcp myweb
何もしない踏み台のようなコンテナにシェルで入ります。
$ docker exec -it myservice /bin/bash
nginx コンテナと通信できることを確認します。
[root@d51ef4968d52 /]# curl myweb:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
mysql コンテナと通信できることを確認します。
[root@d51ef4968d52 /]# mysql -h mydb -P 3306 -uroot -pexample -e 'show databases'
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
ホスト側のファイルシステムがマウントされていることを確認します。
[root@d51ef4968d52 /]# ls /work/
Dockerfile docker-compose.yml
コンテナ間で共有しているボリュームです。
[root@904d08aa7326 /]# df -h | grep data
/dev/sda1 63G 2.5G 58G 5% /data
ホスト側から nginx コンテナと通信できることを確認します。
$ curl localhost:20080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
ホスト側から mysql コンテナと通信できることを確認します。
$ mysql -h 127.0.0.1 -P 23306 -uroot -pexample -e 'show databases'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+