Docker勉強メモ⑤ ネットワーク通信

## はじめに

Docker勉強メモ
- [Docker勉強メモ① DockerインストールからHelloWorld](https://qiita.com/zgw426/items/c0687bdfd3c58eaaac33)
- [Docker勉強メモ② Dockerイメージ作ってみる](https://qiita.com/zgw426/items/b480ae298e1f92cf1418)
- [Docker勉強メモ③ Dockerfileを作ってDockerイメージ作成からコンテナ起動までやってみる](https://qiita.com/zgw426/items/bea786da9128af30937f)
- [Docker勉強メモ④ コンテナ間通信](https://qiita.com/zgw426/items/bb42f6bd17707de354b9)
- [Docker勉強メモ⑤ ネットワーク通信](https://qiita.com/zgw426/items/9a76f48edb6f7e34dffe) **←ココ**


## やること

他のEC2インスタンスからDockerコンテナへの通信確認
以下2つの場合で通信できることを確認する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/5b109b24-7305-6df0-6320-c11e82797115.png)

大きな緑の●から▲までのネットワーク通信できることを確認する

## 準備:Dockerインストール

これまで(Docker勉強メモ①～④)と違うOS `Linux2` を使う。
Linux2 : amzn2-ami-hvm-2.0.20200304.0-x86_64-gp2 (ami-052652af12b58691f)

EC2インスタンスを2つ(host01, host02)作成し、Dockerをインストールする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/8808d64b-2e63-badc-3891-dc3fce66f9a3.png)


```bash:host01
$ sudo yum update -y
$ sudo amazon-linux-extras install docker -y
$ sudo service docker start
$ ps -ef |grep docker
$ sudo usermod -a -G docker ec2-user
# -> 設定反映のため再接続
```

（オプション）必要なら以下もやる

```bash:host01
# Dockerサービス自動起動
$ sudo systemctl enable docker
# docker-composeインストール
$ sudo curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
```

## 通信確認（１）

この通信を確認する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/4a543827-020a-6436-1903-13f369d104eb.png)

確認に必要な環境はこれ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/1d7f769e-4123-bf3d-482e-b16062e6ff78.png)


```bash:host01
# Dockerネットワーク作成
$ docker network create docnetHoge
# 作成したDockerネットワークを指定してDockerコンテナ起動
$ docker run -it -d --privileged --name containerA --network docnetHoge -p 10080:80 -d amazonlinux:latest
```

起動したDockerコンテナ `containerA` はこのようになっている。

```bash:host01
[ec2-user@ip-172-31-5-10 ~]$ docker ps -a
CONTAINER ID        IMAGE                COMMAND             CREATED             STATUS              PORTS                   NAMES
c6d137b5cbc9        amazonlinux:latest   "/bin/bash"         11 seconds ago      Up 10 seconds       0.0.0.0:10080->80/tcp   containerA
```

Dockerコンテナ `containerA` をWebサイトにするため、`containerA`に入る

```bash:host01
[ec2-user@ip-172-31-5-10 ~]$ docker exec -it containerA bash
bash-4.2# 
```

`containerA`の内部IPの確認と、簡易Webサーバを立てる

```bash:containerA
bash-4.2# cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.2      c6d137b5cbc9
bash-4.2# python -m SimpleHTTPServer 80  
Serving HTTP on 0.0.0.0 port 80 ...
172.18.0.1 - - [24/Mar/2020 07:49:41] "GET / HTTP/1.1" 200 -
```

ホスト `host01` で、Webサイトが開くことを確認 ↓

```bash:host01
[ec2-user@ip-172-31-5-10 ~]$ curl http://localhost:10080/
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
<title>Directory listing for /</title>
<body>
<h2>Directory listing for /</h2>
<hr>
<ul>
<li><a href=".dockerenv">.dockerenv</a>
<li><a href="bin/">bin@</a>
<li><a href="boot/">boot/</a>
<li><a href="dev/">dev/</a>
<li><a href="etc/">etc/</a>
<li><a href="home/">home/</a>
<li><a href="lib/">lib@</a>
<li><a href="lib64/">lib64@</a>
 :
 :
```

ホスト `host02`で、Webサイトが開くことを確認 ↓

```bash:host02
[ec2-user@ip-172-31-7-186 ~]$ curl http://172.31.5.10:10080/
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
<title>Directory listing for /</title>
<body>
<h2>Directory listing for /</h2>
<hr>
<ul>
<li><a href=".dockerenv">.dockerenv</a>
<li><a href="bin/">bin@</a>
<li><a href="boot/">boot/</a>
<li><a href="dev/">dev/</a>
<li><a href="etc/">etc/</a>
 :
 :
# Dockerコンテナのホスト名の名前解決はできない（想定通り）
[ec2-user@ip-172-31-7-186 ~]$ curl http://containerA:10080/
curl: (6) Could not resolve host: containerA
```

通信できることを確認できた。

## 通信確認（２）

この通信を確認する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/b24618cc-129f-a3f1-5c7d-9940b9129fb3.png)

確認に必要な環境

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/3c4026ff-6986-eddd-eb78-77068cd4fe74.png)


host02 に Dockerコンテナ `containerB` を起動する


```bash:host02
$ docker network create docnetFuga --subnet 192.168.10.0/24
$ docker run -it -d --privileged --name containerB --network docnetFuga -p 10081:81 -d amazonlinux:latest
```

`containerB` から、`containerA` のWebサイトが開いた

```bash:containerB
bash-4.2# cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.10.2    cc720822b8ff
bash-4.2# curl http://172.31.5.10:10080/
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
<title>Directory listing for /</title>
<body>
<h2>Directory listing for /</h2>
<hr>
<ul>
<li><a href=".dockerenv">.dockerenv</a>
<li><a href="bin/">bin@</a>
<li><a href="boot/">boot/</a>
<li><a href="dev/">dev/</a>
 :
 :
```

通信できることを確認できた。