docker-composeとは?
docker-composeは複数のコンテナを手軽に扱うためのツール。
yml形式でコンテナに関する設定ができ、
sample]$ ls docker-compose.yml
docker-compose.yml
version: "3" services: ap: image: "centos:7" command: ["tail","-f","/dev/null"] depends_on: - "db" db: image: 'centos:7' command: ["tail","-f","/dev/null"]
up コマンドでコンテナが起動できる。
$ docker-compose up -d Creating network "sample_default" with the default driver Creating sample_db_1 ... done Creating sample_ap_1 ... done $ docker-compose ps Name Command State Ports ----------------------------------------------- sample_ap_1 tail -f /dev/null Up sample_db_1 tail -f /dev/null Up
コンテナは ディレクトリ名_default というネットワークに接続され、
sample]$ docker network ls NETWORK ID NAME DRIVER SCOPE 93a567afe736 bridge bridge local 2c4c563287d8 docker_default bridge local a5db6a546224 host host local d1e8a752607e none null local 92ae5876b85a sample_default bridge local sample]$ docker inspect sample_ap_1 ... "Networks": { "sample_default": { "IPAMConfig": null, "Links": null, "Aliases": [ "56536b1e4436", "ap" ], ...
コンテナ間は /etc/hosts に設定されたサービス名でアクセスできる。
$ docker exec -it sample_ap_1 ping db PING db (172.19.0.2) 56(84) bytes of data. 64 bytes from sample_db_1.sample_default (172.19.0.2): icmp_seq=1 ttl=64 time=0.064 ms 64 bytes from sample_db_1.sample_default (172.19.0.2): icmp_seq=2 ttl=64 time=0.102 ms
コンテナを複数起動する場合は --scale オプションを利用する。
sample]$ docker-compose up -d --scale ap=1 --scale db=2 Starting sample_db_1 ... done Creating sample_db_2 ... done sample_ap_1 is up-to-date sample]$ docker-compose ps Name Command State Ports ----------------------------------------------- sample_ap_1 tail -f /dev/null Up sample_db_1 tail -f /dev/null Up sample_db_2 tail -f /dev/null Up
図にするとこんな感じ。
課題
--scale オプションでコンテナを複数起動すると、コンテナ間のリンクがどのように張られるかわからない。以下の実行結果だと、sample_ap_1とsample_ap_2がどちらもsample_db_1に接続されてしまっている。ビルドやテストをdocker-compose上で複数実行したい場合、APが意図せず同じDBを参照してしまって問題が起きる。
sample]$ docker-compose up -d --scale ap=2 --scale db=2 sample_db_1 is up-to-date sample_db_2 is up-to-date Starting sample_ap_1 ... done Creating sample_ap_2 ... done sample]$ docker exec -it sample_ap_1 ping db PING db (172.19.0.3) 56(84) bytes of data. 64 bytes from sample_db_1.sample_default (172.19.0.3): icmp_seq=1 ttl=64 time=0.044 ms 64 bytes from sample_db_1.sample_default (172.19.0.3): icmp_seq=2 ttl=64 time=0.100 ms ^C --- db ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 0.044/0.072/0.100/0.028 ms [kimura@localhost sample]$ docker exec -it sample_ap_2 ping db PING db (172.19.0.3) 56(84) bytes of data. 64 bytes from sample_db_1.sample_default (172.19.0.3): icmp_seq=1 ttl=64 time=0.063 ms 64 bytes from sample_db_1.sample_default (172.19.0.3): icmp_seq=2 ttl=64 time=0.096 ms ^C
検証環境
$ docker -v Docker version 18.03.1-ce, build 9ee9f40 $ docker-compose -v docker-compose version 1.21.2, build a133471
解決方法
上記を実現するためには、 -p オプションを利用する。図にすると以下のイメージ。
sample]$ $ docker-compose up -d Stopping and removing sample_db_2 ... done Starting sample_db_1 ... done Stopping and removing sample_ap_2 ... done Starting sample_ap_1 ... done sample]$docker-compose -p other up -d Creating network "other_default" with the default driver Creating other_db_1 ... done Creating other_ap_1 ... done sample]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 65c43c190f0e centos:7 "tail -f /dev/null" About a minute ago Up About a minute other_ap_1 e441cf9d6a60 centos:7 "tail -f /dev/null" About a minute ago Up About a minute other_db_1 56536b1e4436 centos:7 "tail -f /dev/null" 8 minutes ago Up 8 minutes sample_ap_1 3f8635959fef centos:7 "tail -f /dev/null" 8 minutes ago Up 8 minutes sample_db_1 sample]$ docker network ls NETWORK ID NAME DRIVER SCOPE ... b17d46efb9b8 other_default bridge local 92ae5876b85a sample_default bridge local
これで独立したdocker-composeの環境を用意できる。