Edited at

docker-composeでコンテナ間通信


はじめに

test1とtest2というコンテナを作成して2つのコンテナの通信ができる環境の作成


事前環境・GitHub

docker:18.06.1-ce

docker-compose:1.23.1
OS:Mac High Sierra 10.13.6

GitHub

https://github.com/Dhikigame/docker-compose-network


コンテナ間通信に必要なローカルネットワークの作成

$ docker network create test-network


docker-compose.ymlの作成


docker-compose.yml

version: '3'

services:
test1:
build: ./test1
image: test1
container_name: test1
privileged: true
networks:
- test-network
command: /sbin/init

test2:
build: ./test2
image: test2
container_name: test2
privileged: true
networks:
- test-network
command: /sbin/init

networks:
test-network:
external: true


networksで使用するネットワークを選択

privilegedで使うイメージのCentOS上でsystemctlコマンドの使用を有効


Dockerfileの作成

test1,test2両方に同じDockerfileを作成

FROM centos:7

ENV LC_ALL=C
# text editer install
RUN yum install -y vim
# ssh install
RUN yum -y install openssh-server
RUN yum -y install openssh-clients
# sudo install
RUN yum -y install sudo
RUN sed -i -e 's/# %wheel\tALL=(ALL)\tNOPASSWD: ALL/%wheel\tALL=(ALL)\tNOPASSWD: ALL/' /etc/sudoers
RUN sed -i -e 's/%wheel\tALL=(ALL)\tALL/# %wheel\tALL=(ALL)\tALL/' /etc/sudoers
RUN visudo -c
RUN echo "root:password" | chpasswd
# FOREGROUND change access
CMD ["/usr/bin/ssh","-D", "FOREGROUND"]

sshとscpで通信できるように必要なソフトのインストールをし、rootのパスワードを設定する(本来は公開鍵を使用してください)

CMD ["/usr/bin/ssh","-D", "FOREGROUND"]でsshをバックグラウンドで動作させる


ディレクトリの構造

$ tree

.
├── docker-compose.yml
├── test1
│ └── Dockerfile
└── test2
└── Dockerfile


docker-composeのbuildとup

$ docker-compose build

$ docker-compose up -d


ネットワークの情報確認

$ docker network inspect test-network

[
{
"Name": "test-network",
"Id": "309cef5e5dc0f2b54c433e5fa6c32edfef6e7bf2a0cdd93ecde5c923477e9292",
"Created": "2018-11-24T19:50:38.13185134Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.19.0.0/16",
"Gateway": "172.19.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"586d0f87ad7d13899723334a9849d49202d44eb9fedc3cdfa2a04c13e7de3a85": {
"Name": "test2",
"EndpointID": "fbdc91b23717134f934c34a61730aa1a620f0736de2ca3706c01b173fdb37886",
"MacAddress": "02:42:ac:13:00:02",
"IPv4Address": "172.19.0.2/16",
"IPv6Address": ""
},
"8713e688f6301028b9bfd7e21814dc42b4d95c2d3d6833bea2879fc7ab7afa8c": {
"Name": "test1",
"EndpointID": "a16b7a17a58958fd66501c7b2d2b6e3284b681a2d3715ab06439289f1574ccf9",
"MacAddress": "02:42:ac:13:00:03",
"IPv4Address": "172.19.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]

Containersでtest1コンテナは172.19.0.3、test2コンテナは172.19.0.2のIPアドレスが割り当てられていることを確認


test1コンテナにログイン

$ docker exec -it test1 bash

[root@8713e688f630 /]#


適当なファイルを作り、test2コンテナに送る

[root@8713e688f630 /]# echo "Hello! My name is test1." > /root/hello.txt

[root@8713e688f630 ~]# scp /root/hello.txt 172.19.0.2:/root/
root@172.19.0.2's password:
hello.txt 100% 25 29.1KB/s 00:00

scpでtest2のコンテナにファイルを送ろうとするとパスワードが聞かれるのでDockerfileで設定したパスワードを入力


test2コンテナにsshでアクセスし、ファイルを確認

[root@8713e688f630 ~]# ssh 172.19.0.2

root@172.19.0.2's password:
[root@586d0f87ad7d ~]# cat /root/hello.txt
Hello! My name is test1.

test2のコンテナにsshでログインに成功し、送ったファイルがあることを確認


参考

https://knowledge.sakura.ad.jp/15253/

https://knowledge.sakura.ad.jp/16082/

https://knowledge.sakura.ad.jp/16862/

マンガでわかるDocker ① 〜概念・基本コマンド編〜

マンガでわかるDocker ② 〜開発環境を作ろう編〜