docker-composeでコンテナ間通信

# はじめに
test1とtest2というコンテナを作成して２つのコンテナの通信ができる環境の作成

# 事前環境・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を作成

```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 ① 〜概念・基本コマンド編〜](https://note.mu/llminatoll/n/n4f419db0effc)
[マンガでわかるDocker ② 〜開発環境を作ろう編〜 ](https://llminatoll.booth.pm/items/1036317)