docker --link --exposeの動きを理解する

dockerの--linkとかEXPOSEとか接続関係のコマンドがよくわからないので、動かしながら理解する。

参照: Dockerのネットワークの基礎

  • --link 他のコンテナのポートにつなぐ
  • --expose コンテナのポートを他のコンテナに晒す
  • --publish コンテナのポートをホストのポートにマッピングする

試しに2台のcentosのコンテナを作って、 一台にはapacheをインストールし、もう一台からそのapacheの80番ポートを叩いてみる。 --publishについては言及しない。

コンテナの名前は以下

コンテナ名 役割 exposeするポート リンク
httpd apacheサーバ 80 なし
httpdclient クライアント なし httpdコンテナにリンク

apacheコンテナを作成する。(1台目)

# docker run --privileged -d --expose 80 --name httpd centos:centos7 /sbin/init
# docker exec -it httpd /bin/bash
[root@a4522c59ed0c /]#
[root@a4522c59ed0c /]# yum install httpd -y
[root@a4522c59ed0c /]# systemctl enable httpd.service
[root@a4522c59ed0c /]# systemctl start httpd.service
[root@a4522c59ed0c /]# exit

一応確認

[root@centos001 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
25fcc3bcc9b8        centos:centos7      "/sbin/init"        44 seconds ago      Up 43 seconds       80/tcp              httpd

ただのcentosを作成する。(2台目)

# docker run --privileged -d --link httpd:httpd-alias --name httpdclient centos:centos7 /sbin/init

--linkはコンテナ名:エイリアス名というフォーマットで指定する。

一応起動していることを確認する。2台動いている。

# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
44e11aeaea7c        centos:centos7      "/sbin/init"        9 minutes ago       Up 9 minutes                            httpdclient         
25fcc3bcc9b8        centos:centos7      "/sbin/init"        14 minutes ago      Up 14 minutes       80/tcp              httpd     

作成されたコンテナの環境変数は以下のように調べられる。 この環境変数を使えば、このコンテナからapacheのポートを晒しているホストにアクセスする方法がわかる。

# docker exec -it httpdclient env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=44e11aeaea7c
HTTPD_ALIAS_PORT=tcp://172.17.0.20:80
HTTPD_ALIAS_PORT_80_TCP=tcp://172.17.0.20:80
HTTPD_ALIAS_PORT_80_TCP_ADDR=172.17.0.20
HTTPD_ALIAS_PORT_80_TCP_PORT=80
HTTPD_ALIAS_PORT_80_TCP_PROTO=tcp
HTTPD_ALIAS_NAME=/httpdclient/httpd-alias
container_uuid=44e11aea-ea7c-97ee-6c8f-e903929a981d
HOME=/root

以下のように環境変数経由でアクセスする。

[root@44e11aeaea7c /]# curl -s http://$HTTPD_ALIAS_PORT_80_TCP_ADDR:$HTTPD_ALIAS_PORT_80_TCP_PORT/ | head -1

これでコンテナ同士をつなぐことができた。