首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >docker客户端和服务器容器连接被拒绝

docker客户端和服务器容器连接被拒绝
EN

Stack Overflow用户
提问于 2022-11-01 23:13:59
回答 1查看 48关注 0票数 0

我想连接客户端映像和服务器映像。所以我试着用-链接,坞-合成,但我失败了。但是,当我试图连接本地客户端代码和服务器容器时,它成功了。我想这可能是Dockerfile的问题,但我无法解决。这是我的代码:

-服务器

代码语言:javascript
复制
import socket

HOST = socket.gethostbyname('localhost')
PORT = 65456  

print('> echo-server is activated')
#print(HOST,PORT)
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as serverSocket:
    serverSocket.bind(('', PORT))
    serverSocket.listen()
    clientSocket, clientAddress = serverSocket.accept()
    with clientSocket:
        print('> client connected by IP address {0} with Port number {1}'.format(clientAddress[0], clientAddress[1]))
        while True:
            # [=start=]
            RecvData = clientSocket.recv(1024)
            print('> echoed:', RecvData.decode('utf-8'))
            clientSocket.sendall(RecvData)
            if RecvData.decode('utf-8') == 'quit':
                break
            # [==end==]
print('> echo-server is de-activated')

--客户

代码语言:javascript
复制
import socket

HOST = socket.gethostbyname('localhost')
PORT = 65456

print('> echo-client is activated')
#print(HOST,PORT)
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as clientSocket:
    #print(HOST,PORT)    
    clientSocket.connect((HOST, PORT))
    while True:
        sendMsg = input("> ")
        clientSocket.sendall(bytes(sendMsg, 'utf-8'))
        recvData = clientSocket.recv(1024)
        print('> received:', recvData.decode('utf-8'))
        if sendMsg == "quit":
            break

print('> echo-client is de-activated')

--服务器Dockerfile

代码语言:javascript
复制
FROM python:latest
COPY . /me
RUN apt-get update

RUN mkdir -p /me
CMD ["python", "/me/server.py"]

EXPOSE 65456

--客户Dockerfile

代码语言:javascript
复制
FROM python:latest
COPY . /you
RUN apt-get update

RUN mkdir -p /you
CMD ["python", "/you/client.py"]

EXPOSE 65456

这是回波程序。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-01 23:27:22

你的密码对我有用。

你不包括你尝试过的命令。这些都是对你问题的有益补充。

建造这两个容器。我使用不同的Dockerfile名称来消除两者之间的歧义。

代码语言:javascript
复制
Q="74282751"

docker build \
--tag=${Q}:server \
--file=./Dockerfile.server \
${PWD}

docker build \
--tag=${Q}:client \
--file=./Dockerfile.client \
${PWD}

然后在一个shell中,运行服务器容器,在主机端口( 65456 )上发布容器的端口65456:

代码语言:javascript
复制
docker run \
--interactive --tty --rm \
--publish=65456:65456 \
${Q}:server

在另一个shell中,运行客户端容器,将容器绑定到主机的网络。这是一种提供对主机65456端口的访问的简单方法,该端口现在映射到服务器容器端口65456:

代码语言:javascript
复制
docker run \
--interactive --tty --rm \
--net=host \
${Q}:client

反馈

  1. 当您使用FROM python时,您实际上是在隐式引用Docker的容器注册表。总是显式的,FROM docker.io/python
  2. Try永远不要使用:latest。在本例中,您需要考虑使用Python容器的实际最新版本(即3.9.15).
  3. Conventionally WORKDIR用于定义容器中的工作目录)。这会创建和更改文件夹,并保存RUN mkdir并重复引用目标文件夹。
  4. 试图明确说明什么是COPYd。对于服务器来说,只有server.py而不是.,整个COPY仅用于文档。它没有效果。它只适用于服务器,因为客户端不公开代码中的硬代码常量( ports.
  5. Rather,HOSTPORT),所以作为环境变量(即HOST = os.getenv("HOST"))访问这些变量是很好的做法。这使您的代码更加灵活。一般(!)对于注定要被容器化的代码,您可以将HOST默认为localhost (或者127.0.0.1有时是localhost)

代码语言:javascript
复制
FROM docker.io/python:3.9.15

RUN apt-get update

WORKDIR /me

COPY server.py .

EXPOSE 65456

CMD ["python", "/me/server.py"]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74282751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档