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

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

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

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

Docker

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

Python

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

Q&A

1回答

535閲覧

docker間でソケット通信したい

AGLAAGLA

総合スコア54

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

Docker

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

Python

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

0グッド

1クリップ

投稿2023/02/14 11:50

編集2023/02/14 12:11

実現したいこと

  • コンテナを2個立てており、havedataとwebというコンテナです。
  • 二つはdocker-composeで立てられており、二つの間でソケット通信したいと考えいています。

前提

docker-composeで2つのコンテナを立ち上げ、ローカルのpythonファイルをマウントしてます。
その後、ターミナルで、2つのコンテナにログインし、レシーブ.pyとセンド.pyを実行させています。

以下、ディレクトリ構成図です。

. ├── docker-compose.yml ├── havedata │ ├── Dockerfile │ └── src │ └── send.py └── web ├── Dockerfile └── src └── rec.py

発生している問題・エラーメッセージ

# python3 send.py Traceback (most recent call last): File "/home/usr/send.py", line 7, in <module> s.connect(('0.0.0.0', PORT)) ConnectionRefusedError: [Errno 111] Connection refused

該当のソースコード

python

1#こちらがrec.py 2import socket 3 4PORT = 50000 5BUFFER_SIZE = 1024 6 7with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: 8 s.bind(('0.0.0.0', PORT)) 9 s.listen() 10 while True: 11 (connection, client) = s.accept() 12 try: 13 print('Client connected', client) 14 data = connection.recv(BUFFER_SIZE) 15 connection.send(data.upper()) 16 finally: 17 connection.close()

python

1#こちらがsend.py 2import socket 3 4PORT = 11113 5BUFFER_SIZE = 1024 6 7with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: 8 s.connect(('0.0.0.0', PORT)) 9 # data = input('Please input > ') 10 data = "sony" 11 s.send(data.encode()) 12 print(s.recv(BUFFER_SIZE).decode())

docker

1 2version: '3.8' 3 4services: 5 web: 6 build: ./web 7 volumes: 8 - "./web/src:/home/usr" 9 tty: true 10 11 havedate: 12 build: ./web 13 volumes: 14 - "./havedata/src:/home/usr" 15 tty: true

試したこと

たまたま同じように実装されたい方が以下のURLにいらっしゃいましたが、
https://teratail.com/questions/250296
私はうまくいきませんでした。

ポートなどを変えたりしてみましたが、うまくいきませんでした。

そもそも、こちらのやり方はできないのでは?と思ってしまっています。

よろしければ、こちらは技術的にできるのか、なにが足りていないのかを教えてください。

よろしくお願いいたします。

※Dockefileはただpython3をインストールしてるだけなので割愛させていただきます。

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

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

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

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

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

guest

回答1

0

ポートなどを変えたりしてみましたが、うまくいきませんでした。

複数のコンテナにまたがる以上、通信相手はlocalhostではありません。ホスト名が正しくありません。

投稿2023/02/14 12:07

maisumakun

総合スコア145184

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

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

AGLAAGLA

2023/02/14 12:12 編集

失礼いたしました。 localhostは一度試してみたものをそのままペーストしてしまいました... 訂正しておきます。 正しく0.0.0.0にしても通信は通りませんでした。
maisumakun

2023/02/14 12:24

> 正しく0.0.0.0にしても 相手のマシン名を指定してください。
AGLAAGLA

2023/02/14 13:02

知識不足で申し訳ございません。 マシン名とはdocker psした時のどれに該当するのでしょうか? NAMES,CONTAINER ID,IMAGEのどれかでしょうか?
maisumakun

2023/02/14 13:10

webやhavedateの名前が、docer内ネットワークのDNSに登録されています。
AGLAAGLA

2023/02/14 13:56 編集

ありがとうございます。 docker内にログインし、hostname -i でipが取得でき、それらを相互に入れましたが、無理でした。 例(172.21.0.2と172.21.0.3) OSError: [Errno 99] Cannot assign requested address で使えないIPとエラー出ました..
AGLAAGLA

2023/02/14 14:18

追記で、 hostnameでのソケットも無理でした...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問