Python 如何在容器之间连接?

Python 如何在容器之间连接?,python,docker,sockets,docker-compose,Python,Docker,Sockets,Docker Compose,我希望客户端套接字可以通过localhost:8080进入服务器套接字, 但我一直收到这个错误信息 : ConnectionRefusedError:[Errno 111]连接被拒绝 这是我的服务器插座 import socket import threading serverSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) serverPort = 8080 serverSocket.bind(('', serverP

我希望客户端套接字可以通过
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
FROM python:3.7.4-alpine3.10

WORKDIR /app
COPY . /app

CMD ["python", "clientsocket.py"]
这是客户端套接字

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", "serversocket.py"]

EXPOSE 8080
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

如何解决此问题?

您的服务器和客户机在Docker网络中运行。打开服务器端口8080的事实仅与本地计算机相关

在客户端容器的上下文中,
localhost
不是您的本地计算机,而是它自己的“本地网络”。因此,尝试从本地容器连接到
localhost:8080
将不起作用

docker compose
的好处在于它隐式地创建了一个公共docker网络,并将其绑定到定义的每个容器。因此,在一个容器中,您可以通过名称访问其他容器

如果从容器内部运行shell会话,则可以尝试:

docker compose exec client sh#在客户端容器内打开一个提示符
ping服务器#ping主机名服务器。它将作出回应。
那么,让我们回到你的问题。您应该在客户端代码中执行此操作:

#主机名是容器的名称,“服务器”
连接(('server',serverPort))

作为补充说明,如果将服务器主机名和端口定义为环境变量会更好。它将允许您轻松更改这些值(例如,在
docker compose
文件中),而无需重建映像。

clientSocket.connect(('server',serverPort))
?我使用选项“docker run-p 8080:8080”通过本地主机访问服务器套接字:8080