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

Docker container間の連携について

More than 3 years have passed since last update.

docker初心者なので、Docker container同士の連携について、設定方法やらを半年後の自分用にチラシの裏しておきます。

この内容を踏まえた上で、docker-compose (旧Fig)に進む事をお奨めします。

初めに

Container同士の連携と言っても、大きく2つのケースがあります。

  1. 同じHost内にあるContainer間の連携 (シングルホスト)
  2. 別のHostにあるContainerとの連携 (マルチホスト)

マルチホストでの連携は、Best practiceについてまだ試行錯誤の段階にあるみたいですが、ここら辺とかここら辺を参照して見て下さい。

ここでは、シングルホストでの連携についてチラシの裏しておきます。
結論から言うと、同じHost上のContainer-A→Container-Bにアクセスさせる場合、

  • Container-Aの起動時に、docker run--link OptionでContainer-Bを指定して上げる事でアクセスできる様になります
  • Container-A上でcurl localhost:xxx (xxxはContainer-BがHostにexposeしてるPort)ではアクセス出来ないです

参考URL

素のContainerからnginx Containerにアクセス

Container-A (素のubuntu) から、Container-B (nginx, Port 25525をhostにexpose)にアクセスしたい、というCase studyで、Container間の連携の設定方法やアクセス方法を見てみたいと思います。

Container-Bを立ち上げる

まず、アクセスを受ける側のContainer-Bを立ち上げます。中身のdockerfile/nginxこのDockerfileです。単にnginxをinstallして、port 80で待ち受けしているだけです。このcontainerにnginx_testという名前を付けて、Host側からPort 25525でアクセスできるようにしています。

#docker run -d -p 25525:80 --name nginx_test dockerfile/nginx

Container-Bの起動後、host上で、curl localhost:25525すると、Container-Bのnginxから応答(Welcome to nginxのHTML code)がある事を確認して下さい。

Container-Aを立ち上げる

続いて、アクセスする側のContainer-Aを立ち上げます。中身は素のubuntu 14.04です。
--link nginx_test:nginxで、nginx_testというcontainerにnginxというAliasを付与しています。

#docker run -it --link nginx_test:nginx ubuntu:14.04

すると、Container-Aのshellに遷移すると思います。

Container-AからContainer-Bがどう見えるか確認する

Container-AのShell上で以下の操作をして、Container-BがContainer-Aからどう見えて居るのか、Container-Bのnginxにどうすればアクセスできるのか見てみます。

環境変数の確認
#env | grep NGINX
NGINX_PORT_443_TCP_ADDR=172.17.0.2
NGINX_NAME=/cranky_kowalevski/nginx
NGINX_PORT_80_TCP_PROTO=tcp
NGINX_PORT_80_TCP=tcp://172.17.0.2:80
NGINX_PORT_443_TCP_PORT=443
NGINX_PORT_80_TCP_PORT=80
NGINX_PORT_443_TCP=tcp://172.17.0.2:443
NGINX_PORT_443_TCP_PROTO=tcp
NGINX_PORT_80_TCP_ADDR=172.17.0.2
NGINX_PORT=tcp://172.17.0.2:80

/ect/hostsの確認
#cat /ect/hosts | grep nginx
172.17.0.2      nginx

Container-Bにping
#ping nginx
PING nginx (172.17.0.2) 56(84) bytes of data.
64 bytes from nginx (172.17.0.2): icmp_seq=1 ttl=64 time=0.114 ms
...

Container-Bのnginxに接続してみる
#apt-get update && apt-get install -y curl
#curl nginx
で、Welcome to nginxのHTML codeが戻って来たら成功です。

まとめ

  • Container-AからはContainer-Bはnginxというaliasで見える。curl nginxもしくはcurl nginx:80でアクセスできる
  • Container-Aの環境変数に、Container-Bの情報が色々登録されている
  • Container-Aから、curl localhost:25525curl localhost:80してもContainer-Bにはアクセスできない
  • Container-Bは、docker run -p 25525:80として起動させたが、Container-Aからはnginx:80として見える
    25525はあくまでhost側に見せるport。つまりContainer-BにはContainer-Aしかアクセスせず、HostからContainer-Bへのアクセスは存在しない場合には、Container-BのPortはHostにExposeする必要は無い

素のContainerからMongo Containerにアクセス

続いて、Container-A (素のubuntu) から、Container-B (MongoDB, Port 27017をhostにexpose)にアクセスしたい、というCase studyで、Container間の連携の設定方法やアクセス方法を見てみたいと思います。

Container-Bを立ち上げる

まず、アクセスされる側のContainer-Bを立ち上げます。中身のdockerfile/mongodbこのDockerfileです。単にMongo DBをinstallして、port 27017で待ち受けしているだけです。このcontainerにmongo_testという名前を付けて、Host側からPort 27017でアクセスできるようにします。

#docker run -d -p 27017:27017 --name mongo_test dockerfile/mongodb

Container-Aを立ち上げる

続いて、アクセスする側のContainer-Aを立ち上げます。中身は素のubuntu 14.04です。
--link mongo_test:mongo_test1で、mongo_testというcontainerにmongo_test1というAliasを付与しています。

#docker run -it --link mongo_test:mongo_test1 ubuntu:14.04

すると、Container-Aのshellに遷移すると思います。

Container-AからContainer-Bがどう見えるか確認する

Container-AのShell上で以下の操作をして、Container-BがContainer-Aからどう見えて居るのか、Container-BのMongoにどうすればアクセスできるのか見てみます。

環境変数の確認
#env | grep MONGO
MONGO_TEST1_PORT_27017_TCP_ADDR=172.17.0.57
MONGO_TEST1_PORT_27017_TCP=tcp://172.17.0.57:27017
MONGO_TEST1_PORT=tcp://172.17.0.57:27017
MONGO_TEST1_PORT_27017_TCP_PROTO=tcp
MONGO_TEST1_PORT_28017_TCP=tcp://172.17.0.57:28017
MONGO_TEST1_PORT_27017_TCP_PORT=27017
MONGO_TEST1_PORT_28017_TCP_ADDR=172.17.0.57
MONGO_TEST1_PORT_28017_TCP_PORT=28017
MONGO_TEST1_NAME=/sharp_pike/mongo_test1
MONGO_TEST1_PORT_28017_TCP_PROTO=tcp


/ect/hostsの確認
#cat /ect/hosts | grep mongo
172.17.0.57     mongo_test1


Container-Bにping
#ping mongo_test1
PING mongo_test1 (172.17.0.57) 56(84) bytes of data.
64 bytes from mongo_test1 (172.17.0.57): icmp_seq=1 ttl=64 time=0.058 ms
...


Container-BのMongoに接続してみる
#apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
#echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' > /etc/apt/sources.list.d/mongodb.list
#apt-get update && apt-get install -y mongodb-org-shell
#mongo $MONGO_TEST1_PORT_27017_TCP_ADDR:$MONGO_TEST1_PORT_27017_TCP_PORT
MongoDB shell version: 2.6.7
connecting to: 172.17.0.57:27017/test
...
mongo cliに入れて、mongoの操作が出来る事を確認して下さい


最後のmongoコマンドは、単純に以下でもOKです
#mongo --host mongo_test1

まとめ

  • Container-Aからは、Container-Bは、mongo_test1というaliasで見えている。curl mongo_test1でアクセスできる
  • Container-Aの環境変数に、Container-Bの情報が色々登録されている
  • Container-Aから、curl localhost:27017してもContainer-Bにはアクセスできない
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
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