Ваш сервер и ваш клиент работают в сети 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
) без необходимости перестраивать образ.