前提・実現したいこと
2つのコンテナの間で連携するプログラムを作りたい。
そのためにまずは、pythonライブラリーのsocketでTCP通信したい。
現状、コンテナ間でPINGは通っている。
発生している問題・エラーメッセージ
socketの公式サイトにあるサンプルプログラムを試したが、通信できなかった。
以下に示すように、クライアント側でエラーとなってしまった。
公式のサンプルプログラムを2つのコンテナ上で互いに動作させるにはどうしたらいいでしょうか?
- サーバー側コンテナ(正常な待機状態)
bash
1root@48bce5a558f4:~/ubuntu_socket/socket_test# python socket_Server.py 2Server started. Listening on ('172.17.0.2', 11113)
- クライアント側コンテナ(エラー)
bash
1root@5521f5ec4a59:~/ubuntu_socket/socket_test# python socket_Client.py 2Traceback (most recent call last): 3 File "socket_Client.py", line 4, in <module> 4 response, addr = client.poll_server("Hello world", server=('172.17.0.2', 11113)) 5 File "/usr/local/lib/python3.6/dist-packages/sockets/python3/client.py", line 16, in poll_server 6 self.socket.sendto(bytes(data, "utf-8"), server) 7OSError: [Errno 22] Invalid argument
該当のソースコード
- サーバー側の「docker run」
$ docker run -it -v $(pwd)/:/root/ubuntu_socket \ -w /root/ubuntu_socket/socket_test -p 11113:11114 ubuntu:Sock
- クライアント側の「docker run」
$ docker run -it -v $(pwd)/:/root/ubuntu_socket \ -w /root/ubuntu_socket/socket_test -p 11114:11113 ubuntu:Sock
- サーバー側コンテナのpythonファイル(socket_Server.py)
python
1# Test server with Python3: 2from sockets.python3.server import Server 3class MyServer(Server): 4 def act_on(self, data, addr): 5 # Do something with data (in bytes) and return a string. 6 return data.decode() 7server = MyServer(listening_address=('172.17.0.2', 11113)) 8server.listen()
- クライアント側コンテナのpythonファイル(socket_Client.py)
python
1# Test client with Python3. Polls the Python3 server. 2from sockets.python3.client import Client 3client = Client() 4response, addr = client.poll_server("Hello world", server=('172.17.0.2', 11113)) 5print(response, addr)
質問の過程で試したこと(追記3/31)
サーバー側のポートのみ開放
- サーバー側の「docker run」
$ docker run -it -v $(pwd)/:/root/ubuntu_socket \ -w /root/ubuntu_socket/socket_test -p 11113:11113 --name server_container ubuntu:Sock
- クライアント側の「docker run」
$ docker run -it -v $(pwd)/:/root/ubuntu_socket \ -w /root/ubuntu_socket/socket_test --name client_container ubuntu:Sock
Dockerデフォルトで作成されるブリッジネットワーク「bridge」に、2つのコンテナが接続されていることを確認
- 「bridge」の「netwark inspect」の一部
"Containers": { "8d2b0325708e3a495e985a245326f57b297e68546df1cdf7d61b2cd1030bc869": { "Name": "client_container", "EndpointID": "edd55ed2401674eca6bb8707b04e8856d036bd4e35e2beb97fdc36b2c14c488e", "MacAddress": "02:42:ac:11:00:03", "IPv4Address": "172.17.0.3/16", "IPv6Address": "" }, "c77b59eb1042f6e6b48502303c92046419226daae630fbd818d700571eda990b": { "Name": "server_container", "EndpointID": "0c7724a046883dd75f24ec73464dd833c0cb3b8e1ab9f1de05c255648b13c685", "MacAddress": "02:42:ac:11:00:02", "IPv4Address": "172.17.0.2/16", "IPv6Address": "" } },
- サーバー側、クライアント側双方のコンテナ内のターミナルで互いのIPへpingが通ることを確認済
補足情報(FW/ツールのバージョンなど)
内容(バージョンなど) | |
---|---|
ハードウェアー | Dell Precision 3520 (ノートPC) |
OS | Ubuntu 18.04.4 LTS |
Docker | version 19.03.7 |
sockets | version 1.0.0 |
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/30 07:24
2020/03/30 07:26
2020/03/30 07:27
2020/03/30 08:37 編集
2020/03/30 08:44
2020/03/30 08:46 編集
2020/03/30 09:05 編集
2020/03/31 05:56
2020/03/31 08:11
2020/03/31 08:32
2020/04/02 02:42
2020/04/02 09:41 編集