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
と表示されれば成功です。
まとめ
dockerコマンドの --link
オプションを使わずに、コンテナ間名前解決をするには、Dockerネットワークを作成し、そこにコンテナを参加させれば良い。
名前は、runコマンドの--name
オプションで決められる。
ここまでの操作は手作業で行っていましたが、複数コンテナの起動にはdocker-composeコマンドを利用します。紹介したネットワークへの参加などはdocker-compose.yml
に書けば自動化できるのでおすすめです。
参考資料