Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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/

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした