Docker Composeをもう少し試してみる

コンテナを起動させ続ける場合

CentOSのコンテナを起動。

$ vi docker-compose.yml
version: '3'
services:
  srv:
    image: centos
$ docker-compose up -d 

しかし、終了してしまう。

$ docker-compose ps
    Name         Command    State    Ports
------------------------------------------
vagrant_srv_1   /bin/bash   Exit 0

停止。

$ docker-compose down

「tty: true」を付けると、

$ vi docker-compose.yml
version: '3'
services:
  srv:
    image: centos
    tty: true

終了しなくなる。

$ docker-compose up -d 
$ docker-compose ps
    Name         Command    State   Ports
-----------------------------------------
vagrant_srv_1   /bin/bash   Up

停止。

$ docker-compose down

プロジェクト名

コンテナ名を特に指定しないと、 コンテナ名は「プロジェクト名_サービス名_連番」になる。

プロジェクト名は、デフォルトではフォルダ名になる。

例えば、「hoge」というディレクトリを作り、このディレクトリ上で

$ mkdir hoge
$ cd hoge

コンテナを起動すると、

$ vi docker-compose.yml
version: '3'
services:
  srv:
    image: centos
    tty: true
$ docker-compose up -d

プロジェクト名が「hoge」になっているのが確認できる。

$ docker-compose ps
   Name       Command    State   Ports
--------------------------------------
hoge_srv_1   /bin/bash   Up

※「-p」オプションでもプロジェクト名を設定できるみたい。

停止。

$ docker-compose down
$ cd ..

コンテナ名

コンテナ名を指定する場合は、「container_name: コンテナ名」を記述する。

$ vi docker-compose.yml
version: '3'
services:
  srv:
    image: centos
    container_name: con
    tty: true

起動すると、

$ docker-compose up -d

コンテナ名が指定した名前になってるのが確認できる。

$ docker-compose ps
Name    Command    State   Ports
--------------------------------
con    /bin/bash   Up

ホスト名

現在、起動しているコンテナのIDは下記のようになっている。

$ docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
19d1ffb955c0   centos    "/bin/bash"   47 seconds ago   Up 45 seconds             con

ホスト名を指定していない場合、ホスト名はコンテナIDになる。

$ docker exec -it con /bin/bash

[root@19d1ffb955c0 /]# hostname
19d1ffb955c0

停止。

# exit
$ docker-compose down

ホスト名を指定すると、

$ vi docker-compose.yml
version: '3'
services:
  srv:
    image: centos
    container_name: con
    hostname: hst
    tty: true
$ docker-compose up -d

ホスト名が変わっているのが確認できる。

$ docker exec -it con /bin/bash

[root@hst /]# hostname
hst

停止。

# exit
$ docker-compose down

コンテナ間通信

コンテナを複数起動する。

$ vi docker-compose.yml
version: '3'
services:
  srv-1:
    image: centos
    container_name: con-1
    hostname: hst-1
    tty: true
  srv-2:
    image: centos
    container_name: con-2
    hostname: hst-2
    tty: true
$ docker-compose up -d

デフォルトでは、「プロジェクト名_default」のネットワークが作られ、

$ docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
6143d4cf052a   bridge            bridge    local
a5cc6ae82dca   host              host      local
70f2a039d34a   none              null      local
43a90aec0622   vagrant_default   bridge    local

各コンテナは、このネットワークに接続している。

$ docker network inspect vagrant_default
[
    {
        ・・・
        "Containers": {
            "2dd35cb3072b64adede2427dd348e1f9c09e526d5aee0b5807c1572cf36a50f4": {
                "Name": "con-2",
                ・・・
            },
            "e3e776aa48ed7c2c93c163b4ec6292a45b88fdc163abe2164a1b20f3812a551f": {
                "Name": "con-1",
                ・・・
            }
        },
        ・・・
    }
]

1つ目のコンテナに入り、2つ目のコンテナにつながるか確認してみる。

$ docker exec -it con-1 /bin/bash

サービス名、コンテナ名、ホスト名のどれでも接続できるみたい。

# ping srv-2
PING srv-2 (172.26.0.2) 56(84) bytes of data.
64 bytes from con-2.vagrant_default (172.26.0.2): icmp_seq=1 ttl=64 time=0.037 ms
・・・

# ping con-2
PING con-2 (172.26.0.2) 56(84) bytes of data.
64 bytes from con-2.vagrant_default (172.26.0.2): icmp_seq=1 ttl=64 time=0.021 ms
・・・

# ping hst-2
PING hst-2 (172.26.0.2) 56(84) bytes of data.
64 bytes from con-2.vagrant_default (172.26.0.2): icmp_seq=1 ttl=64 time=0.022 ms
・・・