Как я могу подключиться между контейнерами? - PullRequest
0 голосов
/ 31 октября 2019

Я хочу, чтобы клиентский сокет мог войти в серверный сокет через localhost:8080, но я продолжаю получать это сообщение об ошибке:

ConnectionRefusedError: [Errno 111] Соединение отклонено

Это мой сокет сервера

import socket
import threading   

serverSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

serverPort = 8080
serverSocket.bind(('', serverPort))


serverSocket.listen(1)

connectionSocket, address = serverSocket.accept()
print('*****',str(address), 'has entered.*****')

и Dockerfile

FROM python:3.7.4-alpine3.10

WORKDIR /app
COPY . /app

CMD ["python", "serversocket.py"]

EXPOSE 8080

Это сокет клиента

import socket
import threading

clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serverPort = 8080
clientSocket.connect(('localhost', serverPort))


print('*****You Enter the server.*****')

и Dockerfile

FROM python:3.7.4-alpine3.10

WORKDIR /app
COPY . /app

CMD ["python", "clientsocket.py"]

и, наконец, мой docker-compose.yml файл

version: "3"

services: 
  server:
    image: server
    ports:
      - "8080:8080"


  client:
    image: client

Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 31 октября 2019

Ваш сервер и ваш клиент работают в сети Docker. Тот факт, что вы открываете порт сервера 8080, имеет значение только для вашего локального компьютера.

В контексте клиентского контейнера localhost - это не ваш локальный компьютер, а его собственная "локальная сеть". Поэтому попытка подключиться к localhost:8080 не будет работать из локального контейнера.

Что приятно с docker-compose, так это то, что он неявно создает общую сеть Docker и привязывает ее к каждому определенному контейнеру. Таким образом, внутри контейнера вы можете получить доступ к его собратьям-контейнерам по их имени .

Вы можете попробовать его, если запустите сеанс оболочки из контейнера:

docker-compose exec client sh # Opens a prompt INSIDE the client container
ping server # Ping the hostname server. It will respond.

Итак, вернемся к вашей проблеме. Вы должны сделать это в своем клиентском коде:

 # The hostname is the name of the container, "server"
clientSocket.connect(('server', serverPort))

В качестве примечания было бы лучше, если бы имя хоста сервера и порт определялись как переменные среды. Это позволит вам легко изменять эти значения (например, в файле docker-compose) без необходимости перестраивать образ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...