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

はじめに

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

環境

私の環境はこんな感じ
スクリーンショット 2019-06-23 23.08.33.png

スクリーンショット 2019-06-23 23.09.36.png

Editor

宗教戦争になる可能性もあるため、こちらに分けておきます…
私はVS Codeで下記のプラグインを利用しています。
スクリーンショット 2019-06-23 23.11.27.png

Visual Studio Code Remote Development

docker環境にVS Codeを接続して開発できるやつ
※ターミナルはうまく動かなくて使いにくい
https://github.com/Microsoft/vscode-remote-release
attach file.mov.gif

Docker Support for Visual Studio Code

左側にdockerの状態を表示できるやつ
https://github.com/microsoft/vscode-docker
attach.mov.gif

(1)docker

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

docker network create localnetwork  

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

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

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

(2)container in python (Server側)

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

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

パイソン環境を確認…

python -V  
>Python 2.7.15+  

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

  
  
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の確認

hostname -i  
>172.19.0.3  

サーバーを実行します。

python /home/s.py  

(3)container in python (client側)

まずは、新しいコンテナの作成…

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

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

apt update  
apt install curl  

curlにて動作確認

  
curl -X POST http://172.19.0.3  

メモ

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

つながらないとき

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

docker network inspect {ネットワーク名}  
>このコマンドの応答JSON内に接続したいコンテナ名があるか確認  

コンテナ名がない場合はうまく接続できていません。
下記のコマンドを利用し、ネットワーク接続をしてください。

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

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

apt-get install iputils-ping net-tools  

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

apt-get install net-tools