Dockerで2台のコンテナを立ち上げてPythonで作成したWEB APIでやり取りさせる

# はじめに
Pythonで作成したWEB APIを使って2台のサーバでやり取りさせるテストがややこしかったので、`Docker`で色々試してみた、備忘録です。

# 環境
私の環境はこんな感じ
<img width="300" alt="スクリーンショット 2019-06-23 23.08.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/d10b4396-4c9b-344e-42ab-402fe05a59d0.png">

<img width="300" alt="スクリーンショット 2019-06-23 23.09.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/41425a54-0a3c-37f8-b8c9-b31995ad667d.png">

## Editor
宗教戦争になる可能性もあるため、こちらに分けておきます…
私はVS Codeで下記のプラグインを利用しています。
<img width="294" alt="スクリーンショット 2019-06-23 23.11.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/df7a4b51-6b1d-8af0-a93f-3b830bbda777.png">

### Visual Studio Code Remote Development
docker環境にVS Codeを接続して開発できるやつ
※ターミナルはうまく動かなくて使いにくい
https://github.com/Microsoft/vscode-remote-release
![attach file.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/09cd216f-1564-f42c-82fb-6607dd2008d1.gif)

### Docker Support for Visual Studio Code
左側にdockerの状態を表示できるやつ
https://github.com/microsoft/vscode-docker
![attach.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/1a6b191c-e4b0-1bd7-3a9b-873336280250.gif)



# (1)docker
`Docker`にnetworkを作成します。
これを作成してコンテナを接続することにより`Docker`内のコンテナ同士でIPによるやり取りを行えます。

```sh
docker network create localnetwork
```

次に対象となるコンテナを作成します。
イメージは何でもいいのですが今回は`ubuntu`でやってみたいと思います。

```sh
docker run -it --net="localnetwork" ubuntu
```

このコマンドで`localnetwork`に接続されたコンテナが１つ生成されます。

# (2)container in python (Server側)

このコンテナ内で下記のコマンド実行しpython環境を構築します。

```sh
apt update
apt install python2.7 python-pip
apt pip install simplejson
```

パイソン環境を確認…

```sh
python -V
>Python 2.7.15+
```

パイソンの実行ファイルを作成します。
※コマンドでやる場合は`apt install nano`などでEditorをインストールして行ってください。

```python:/home/s.py


from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import simplejson
import SocketServer

class api_server(BaseHTTPRequestHandler):
    def _set_headers(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()

    def do_HEAD(self):
        self._set_headers()

    def do_POST(self):
        self._set_headers()
        print "in post method"
        self.content_len = int(self.headers.getheader('content-length', 0))
        print self.content_len
        self.data_string = self.rfile.read(self.content_len)
        print self.data_string
        data=False
        if(self.content_len>0):
            data = simplejson.loads(self.data_string)
        print self.path
        self.send_response(200)
        self.end_headers()
        self.wfile.write(simplejson.dumps({"res":"true"}))

        return

httpd = HTTPServer(('', 80),api_server)
httpd.serve_forever()

```

自分のIPの確認

```sh
hostname -i
>172.19.0.3
```

サーバーを実行します。

```sh
python /home/s.py
```

# (3)container in python (client側)
まずは、新しいコンテナの作成…

```sh
docker run -it --net="localnetwork" ubuntu
```



今回は簡単に`curl`を使って接続確認をしたいと思いますのでcurlをダウンロードします。

```sh
apt update
apt install curl
```

curlにて動作確認

```sh

curl -X POST http://172.19.0.3
```




# メモ
以下、すこし詰まった部分で備忘録の中の備忘録として残しておきます。

## つながらないとき
多分、コンテナがネットワークに接続できていない場合です。
まず、該当のネットワークの状態を確認します。

```sh
docker network inspect {ネットワーク名}
>このコマンドの応答JSON内に接続したいコンテナ名があるか確認
```
コンテナ名がない場合はうまく接続できていません。
下記のコマンドを利用し、ネットワーク接続をしてください。

```sh
network connect {ネットワーク名} {コンテナ名}
```

## 疎通確認したいとき(ping install)

```sh
apt-get install iputils-ping net-tools
```

## ipconfigしたいとき(net-tools install)

```sh
apt-get install net-tools
```