質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1873閲覧

python上でDockerNetworkに記載されている名前でIPアドレスを解決できない

tekondo

総合スコア26

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/01/18 12:34

今Socketモジュールを使用してDockerコンテナ同士でSocket通信をしようと思っています。

クライアントコンテナ、サーバーコンテナを作成してそれぞれをSocketで繋ごうとしています。

Docker-composeで二つのコンテナをリンクさせ、IPアドレスを名前解決で指定しようとしているのですが

エラーが出てしまいます。

#やったこと

composeyml

1version: '3' 2services: 3 server: 4 build: . 5 tty: true 6 volumes: 7 - ./:/usr/share/socket 8 working_dir: "/usr/share/socket" 9 10 client: 11 build: . 12 tty: true 13 volumes: 14 - ./:/usr/share/socket 15 working_dir: "/usr/share/socket" 16

Dockerfile

1FROM python:3.6 2ENV LANG C.UTF-8 3 4RUN apt-get update 5RUN apt-get install vim -y

こちらでコンテナを二つ起動して

docker-compose -f $(COMPOSE_FILE) -p $(PROJECT) up -d --build

を実行して

server.py

python

1import socket 2import os 3 4def main(): 5 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 6 s.bind(("socket_client_1", 50007)) # errorが出る箇所 7 s.listen(1) 8 soc, addr = s.accept() 9 print("Conneted by"+str(addr)) 10 11 while (1): 12 print("Server>") 13 data = input().encode('utf-8') 14 soc.send(data) 15 data = soc.recv(1024) 16 data = data.decode('utf-8') 17 print("Client>",data) 18 if data == "q": 19 soc.close() 20 break 21 22main() 23

を実行したところ

File "server.py", line 22, in <module> main() File "server.py", line 6, in main s.bind(("socket_client_1", 50007)) # 指定したホスト(IP)とポートをソケットに設定 OSError: [Errno 99] Cannot assign requested address

とエラーメッセージが出てしまいます。

確認したところ

docker inspect socket_default

を実行してネットワークを確認したところ

"Containers": { "14a5f60dcd259eeaa2665650f10b6d8831e6c573cfe530292d621817f3e7a451": { "Name": "socket_client_1", "EndpointID": "b3fd5c697ed7d2f9d0373b087b27733a41d9393214dd6bd525d1d9b720cc8762", "MacAddress": "02:42:ac:13:00:02", "IPv4Address": "172.19.0.2/16", "IPv6Address": "" }, "c438cd2433a69f9266fc685491400c308cfdb4966ce37eb2e17bd0df585b46ee": { "Name": "socket_server_1", "EndpointID": "aef732bc51642499da98bedb65d614e31ccdfaeb18094b68757ad9de271616e8", "MacAddress": "02:42:ac:13:00:03", "IPv4Address": "172.19.0.3/16", "IPv6Address": "" } }

というようにネットワークに名前が定義されている事が確認できました。

docker exec でserverコンテナ内に入った後に

$ ping socket_client_1 PING socket_client_1 (172.19.0.2) 56(84) bytes of data. 64 bytes from socket_client_1.socket_default (172.19.0.2): icmp_seq=1 ttl=64 time=0.147 ms 64 bytes from socket_client_1.socket_default (172.19.0.2): icmp_seq=2 ttl=64 time=0.198 ms

というようにパケットを名前解決で送信できる事は確認しました。

何かわかるかたいらっしゃいましたらお力添えいただけると幸いです。。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

UNIX コマンドの digコマンドで名前解決しているアドレスを検索する事ができたのでこれをPython上で実行した。

client_ip = str(subprocess.call(['dig', 'client', '+short']))

を実行すればIPアドレスが取得可能

投稿2019/01/20 05:39

tekondo

総合スコア26

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問