Posted at

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をインストールして行ってください。


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

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