SIerだけど技術やりたいブログ

6年目のSIerのブログです

docker-composeを複数起動する

$ docker -v
Docker version 17.06.1-ce, build 874a737
$ docker-compose -v
docker-compose version 1.16.1, build 6d1ac21

docker-composeは複数のコンテナを手軽に扱うためのツール。

yml形式でコンテナに関する設定ができ、

sample]$  ls
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 コマンドでコンテナが起動できる。

sample]$ docker-compose up -d
sample_db_1 is up-to-date
Stopping and removing sample_ap_2 ... done
Starting sample_ap_1 ... done
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_defaultというネットワークに接続され、

sample]$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
95c40fbb1b45        bridge              bridge              local
b26153e78e9d        host                host                local
9fd6390f2612        none                null                local
3ff92f46112a        sample_default      bridge              local
sample]$ docker inspect sample_ap_1
...
            "Networks": {
                "sample_default": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "ap",
                        "8c52534eb94b"
                    ],
...


コンテナ間は /etc/hosts に設定されたサービス名でアクセスできる。

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.039 ms
64 bytes from sample_db_1.sample_default (172.19.0.3): icmp_seq=2 ttl=64 time=0.097 ms

コンテナを複数起動する場合は --scale オプションを利用する。

sample]$ docker-compose up -d --scale ap=1 --scale db=2
Starting sample_db_1 ... done
Creating sample_db_2 ...
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

図にするとこんな感じ。
f:id:kimulla:20171023120731j:plain

ただし --scale オプションでコンテナを複数起動すると、コンテナ間リンクがどのように張られるかわからない。

以下の実行結果だと、sample_ap_1とsample_ap_2がどちらもsample_db_1に接続されてしまっている。

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 ...
Creating sample_ap_2 ... done
[kimura@localhost 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-compose上で行う場合、一つのDBが複数のAPから接続される可能性があるため、docker-compose up ごとに独立した環境を用意したい。図にすると以下のイメージ。
f:id:kimulla:20171023121220j:plain

上記を実現するためには、 -p オプションを利用する。

sample]$ docker-compose up -d
Stopping and removing sample_db_2 ... done
Starting sample_db_1 ...
Starting sample_db_1 ... done
Stopping and removing sample_ap_2 ... done
Starting sample_ap_1 ...
Starting sample_ap_1 ... done
sample]$ docker-compose -p other up -d
Creating other_db_1 ...
Creating other_db_1 ... done
Creating other_ap_1 ...
Creating other_ap_1 ... done
sample]$ docker ps
CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS              PORTS               NAMES
d5badecce352        centos:7            "tail -f /dev/null"   19 seconds ago      Up 18 seconds                           other_ap_1
dee838c0cf24        centos:7            "tail -f /dev/null"   19 seconds ago      Up 18 seconds                           other_db_1
8c52534eb94b        centos:7            "tail -f /dev/null"   2 hours ago         Up 25 seconds                           sample_ap_1
c11653681145        centos:7            "tail -f /dev/null"   2 hours ago         Up 25 seconds                           sample_db_1
sample]$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
...
40c106123924        other_default       bridge              local
3ff92f46112a        sample_default      bridge              local

これで独立した環境を用意できる。