はじめに
Pythonで作成したWEB APIを使って2台のサーバでやり取りさせるテストがややこしかったので、Docker
で色々試してみた、備忘録です。
環境
Editor
宗教戦争になる可能性もあるため、こちらに分けておきます…
私はVS Codeで下記のプラグインを利用しています。
Visual Studio Code Remote Development
docker環境にVS Codeを接続して開発できるやつ
※ターミナルはうまく動かなくて使いにくい
https://github.com/Microsoft/vscode-remote-release
Docker Support for Visual Studio Code
左側にdockerの状態を表示できるやつ
https://github.com/microsoft/vscode-docker
(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