概要 †docker コンテナ同士で通信する方法を記載する。 目次 †
Dockerネットワークによる通信 †作業用ディレクトリを作成 $ mkdir my_docker_network $ cd my_docker_network dockerネットワークを作成 $ docker network create my-docker-network 作成した dockerネットワークを確認 $ docker network inspect my-docker-network [ { "Name": "my-docker-network", "Id": "ef9813e65909c9b9cdf3bdba399b791a9c3be9240b591fc3d84c6fcf2cc28d73", "Created": "XXXX-XX-XXTXX:XX:XX.XXXXXXZ", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "172.22.0.0/16", "Gateway": "172.22.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": {}, "Options": {}, "Labels": {} } ] 試しに2つのコンテナを用意して双方から通信してみる。 コンテナの作成 †作業用ディレクトリの作成 $ mkdir -p container_a/www $ mkdir -p container_b/www container_a/Dockerfile 及び container_b/Dockerfile (内容は同じ) FROM nginx:latest # 通信確認用にcurlを入れておく RUN apt-get -y update RUN apt-get -y install curl CMD nginx -g "daemon off;" container_a/www/index.html <!doctype html> <html> <h1>Container A!</h1> </html> container_b/www/index.html <!doctype html> <html> <h1>Container B!</h1> </html> コンテナのビルド/起動 †以下、ビルドイメージ名は a と b で変えているが、Dockerfile の内容は同じなので別にイメージ名変える必要はない。 コンテナAのビルド 及び起動 $ docker build -t nginx-a ./container_a $ docker run --rm --name container-a -v `pwd`/container_a/www:/usr/share/nginx/html --network my-docker-network -d nginx-a コンテナBのビルド 及び起動 $ docker build -t nginx-b ./container_b $ docker run --rm --name container-b -v `pwd`/container_b/www:/usr/share/nginx/html --network my-docker-network -d nginx-b コンテナに入って通信確認 †コンテナAに入る。 $ docker exec -it container-a /bin/bash 自身(コンテナA)にリクエストを飛ばしてみる。 # curl http://localhost <!doctype html> <html> <h1>Container A!</h1> </html> 自身(コンテナA)にコンテナ名でリクエストを飛ばしてみる。 # curl http://container-a <!doctype html> <html> <h1>Container A!</h1> </html> コンテナBにリクエストを飛ばしてみる。 # curl http://container-b <!doctype html> <html> <h1>Container B!</h1> </html> docker-composeで行う場合 †上記で作成した Dockerfile をそのまま利用する形で docker-compose を書いておけばもっと楽。
docker-compose.yml の作成 †docker-compose.yml version: "3" services: webserver1: build: context: ./container_a container_name: container-a hostname: container-a volumes: - ./container_a/www:/usr/share/nginx/html ports: - "8080:80" command: /bin/sh -c "nginx -g 'daemon off;'" webserver2: build: context: ./container_b container_name: container-b hostname: container-b volumes: - ./container_b/www:/usr/share/nginx/html ports: - "8081:80" command: /bin/sh -c "nginx -g 'daemon off;'" ビルド †$ docker-compose up --build --no-start Creating network "my_docker_network_default" with the default driver # [プロジェクト名]_default という名前で自動的にネットワークが作成される Building webserver1 Step 1/4 : FROM nginx:latest ---> 7042885a156a Step 2/4 : RUN apt-get -y update ---> Using cache ---> 0ea23b5549be Step 3/4 : RUN apt-get -y install curl ---> Using cache ---> 3462f4bb1172 Step 4/4 : CMD nginx -g "daemon off;" ---> Using cache ---> 5e1fc3b98d4f Successfully built 5e1fc3b98d4f Successfully tagged my_docker_network_webserver1:latest Building webserver2 Step 1/4 : FROM nginx:latest ---> 7042885a156a Step 2/4 : RUN apt-get -y update ---> Using cache ---> 0ea23b5549be Step 3/4 : RUN apt-get -y install curl ---> Using cache ---> 3462f4bb1172 Step 4/4 : CMD nginx -g "daemon off;" ---> Using cache ---> 5e1fc3b98d4f Successfully built 5e1fc3b98d4f Successfully tagged my_docker_network_webserver2:latest Creating container-b ... done Creating container-a ... done 起動 †$ docker-compose start Starting webserver1 ... done Starting webserver2 ... done コンテナ間の通信を確認 †コンテナAからコンテナBへの通信を確認 $ docker exec container-a curl -s http://container-b <!doctype html> <html> <h1>Container B!</h1> </html> コンテナBからコンテナAへの通信を確認 $ docker exec container-b curl -s http://container-a <!doctype html> <html> <h1>Container A!</h1> </html> |