dockerのlinkオプションがレガシーなので、コンテナ間で名前解決できるようにネットワークを用意する

  • 24
    Like
  • 2
    Comment

dockerコマンドの--linkオプションはすでに非推奨です(https://docs.docker.com/engine/userguide/networking/default_network/dockerlinks/ )。しかし、--linkオプションを使わないコンテナ間名前解決の方法はあまり知られていないようです。

その方法を調べたので、ここに紹介します。

前提環境

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.11.6
BuildVersion:   15G1421
$ docker --version
Docker version 17.03.1-ce, build c6d412e

docker-compose版を追加しました

コンテナをいくつか用いる場合、docoker runでいちいち手動で操作するのは手間がかかりすぎます。docker-composeコマンドを使いましょう。本記事の中では、順を追って手順を説明しています。その操作をdocker-compose.ymlとしてまとめたものを用意しました。 docker-compose upとコマンドを打つと今回と同じ構成が実現できます。
https://gist.github.com/tamanobi/cfef34197d531945872173fcb0906cf5

結論

dockerコマンドの --link オプションを使わずに、コンテナ間名前解決をするには、Dockerネットワークを作成し、そこにコンテナを参加させる。

  • ブリッジネットワークを作成(docker network create my_network)
  • 各コンテナをネットワークに参加(docker run --net my_network --name app )

例示

NginxとPHPのDockerイメージを使って実演します。

ホストOSの localhost:8080 にアクセスしたら、Nginxコンテナの80番へ、そこからPHPアプリケーションコンテナの80番へリクエストが行くようになります。

NginxとPHPのオフィシャルイメージを利用する

NginxとPHPのDockerイメージは以下のものを利用します。

$ docker pull nginx
$ docker pull php

Dockerネットワーク作成

my_networkという名前でBridgeネットワークを作成します。

$ docker network create my_network

PHP

PHPコンテナをap1という名前で80番ポートを露出させて立ち上げます。テスト用のアプリケーションを作成するため、一旦シェルを起動します。 my_networkへ参加させるのを忘れずに。

$ docker run --rm -itd --name ap1 --expose 80 --net my_network php /bin/sh

アプリケーションを作成・起動

$ docker ps | grep php
096c8fe51cff php  "docker-php-entryp..."  1 minutes ago   Up 1 minutes  80/tcp  ap1
$ docker attach 096c8fe51cff

コンテナ内部にアプリケーションを作成し、起動します。アプリケーションが立ち上がったら、Ctrl+P, Ctrl+Qでコンテナを落とさずにコンテナ外に出ます。

# cat << EOF > ./app.php
echo "Accessed from Nginx";
EOF
# php -S 0.0.0.0:80 /app.php
Listening on http://0.0.0.0:80
Document root is /
Press Ctrl-C to quit.

Nginx

ホストOSの8080番ポートを、Nginxコンテナの80番ポートに転送します。動作確認には、ホストOS(Mac)のブラウザで
http://localhost:8080 にアクセスします。

PHPコンテナへプロキシするための設定をphp.confとして用意します。

$ mkdir ./nginx
$ cat << EOF > ./nginx/php.conf
server {
    listen 80 default_server;
    listen [::]:80 default_server;

    # ap1
    location / {
        proxy_pass http://ap1;
    }
}
EOF
$ docker run -d --net my_network -p 8080:80 -d -v `pwd`/nginx/:/etc/nginx/conf.d/ nginx

動作確認

localhost:8080 にアクセスして Accessed from Nginx と表示されれば成功です。

スクリーンショット 2017-05-07 21.51.06.png

まとめ

dockerコマンドの --link オプションを使わずに、コンテナ間名前解決をするには、Dockerネットワークを作成し、そこにコンテナを参加させれば良い。

名前は、runコマンドの--nameオプションで決められる。

ここまでの操作は手作業で行っていましたが、複数コンテナの起動にはdocker-composeコマンドを利用します。紹介したネットワークへの参加などはdocker-compose.ymlに書けば自動化できるのでおすすめです。

参考資料

https://docs.docker.com/engine/userguide/networking/