LoginSignup
2
6

More than 3 years have passed since last update.

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

Posted at

はじめに

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
2
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
6