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

docker-composeでコンテナ間通信

More than 1 year has passed since last update.

はじめに

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 ② 〜開発環境を作ろう編〜

dhiki1234
インフラのエンジニアです。
https://twitter.com/DHIKI_pico
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