gpt4 book ai didi

python - 使docker容器通过端口进行通信

转载 作者:太空宇宙 更新时间:2023-11-03 13:33:58 25 4
gpt4 key购买 nike

我正在尝试创建 2 个 docker 容器并以它们可以通过本地主机中的端口相互通信的方式运行它们。我创建了 2 个 python 文件作为发送者和接收者。当我在没有 docker 的情况下运行它们时,它们可以很好地沟通。但是对于 docker,它们无法正常运行。

发件人

Python脚本

#!/usr/bin/python
# -*- encoding: utf-8 -*-
import socket
import time
import sys

print sys.argv[1]
print sys.argv[2]


for i in range(1,10):
time.sleep(2)
data = "My parameters that I want to share with the server on ith iteration %d" % (i)
print "sedning data: %d" % (i)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((sys.argv[1], int(sys.argv[2])))
sock.sendall(data)
sock.close()

Docker文件

FROM ubuntu

RUN \
apt-get update && \
apt-get install -y python python-dev python-pip python-virtualenv && \
rm -rf /var/lib/apt/lists/*

ADD script.py /root/script.py

CMD python -u /root/script.py $SEND_HOST $SEND_PORT

接收者

Python脚本

#!/usr/bin/python
# -*- encoding: utf-8 -*-
import socket
import sys



print sys.argv[1]
print sys.argv[2]

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((sys.argv[1], int(sys.argv[2])))
s.listen(3)

while True:
conn, addr = s.accept()
data = conn.recv(1024)
conn.close()
print "received data from sender: %s" % (data)

Docker文件

FROM ubuntu

RUN \
apt-get update && \
apt-get install -y python python-dev python-pip python-virtualenv && \
rm -rf /var/lib/apt/lists/*

ADD script.py /root/script.py

CMD python -u /root/script.py $LISTEN_HOST $LISTEN_PORT

为接收器运行命令

docker run --name="testListen" -p 5555:5555 --env LISTEN_HOST="localhost" --env LISTEN_PORT="5555" docker.io/ayonnayihan/sample-sendr-rcv-test:receiver0.1

为发件人运行命令

docker run --name="testTalk" --env SEND_HOST="localhost" --env SEND_PORT="5555" docker.io/ayonnayihan/sample-sendr-rcv-test:sender0.1

在运行容器之前,我确保两个镜像都已构建。任何人都可以告诉它为什么不能正常运行吗?

这是一个简单的 python 运行命令,在没有 docker 的情况下也能正常工作:

在接收器上 python script.py localhost 5555

在发件人 python script.py localhost 5555

最佳答案

我认为您有 3 个选项可以使它正常工作:

  1. 创建一个 docker 网络来连接主机:

    docker network create --driver bridge sample-sendr-rcv-test
    docker run --name="testListen" --env LISTEN_HOST="0.0.0.0" --env LISTEN_PORT="5555" --network=sample-sendr-rcv-test -d docker.io/ayonnayihan/sample-sendr-rcv-test:receiver0.1
    docker run --name="testTalk" --env SEND_HOST="testListen" --env SEND_PORT="5555" --network=sample-sendr-rcv-test -d docker.io/ayonnayihan/sample-sendr-rcv-test:sender0.1
  2. 使用 docker-compose使用 docker-compose.yml 像:

    version: '2'
    services:
    sender:
    image: docker.io/ayonnayihan/sample-sendr-rcv-test:sender0.1
    # build: sender
    environment:
    SEND_HOST: receiver
    SEND_PORT: 5555
    receiver:
    image: docker.io/ayonnayihan/sample-sendr-rcv-test:receiver0.1
    # build: receiver
    environment:
    LISTEN_HOST: '0.0.0.0'
    LISTEN_PORT: 5555
  3. 使用主机网络:

    docker run  --name="testListen" --env LISTEN_HOST="127.0.0.1" --env LISTEN_PORT="5555" --net=host -d docker.io/ayonnayihan/sample-sendr-rcv-test:receiver0.1
    docker run --name="testTalk" --env SEND_HOST="localhost" --env SEND_PORT="5555" --net=host -d docker.io/ayonnayihan/sample-sendr-rcv-test:sender0.1

第三个选项与您目前正在做的最相似,但我不推荐它,原因如下所述。其他选项中的任何一个都可以,但如果您刚开始使用 docker,可能不值得学习 docker-compose。

您遇到问题的原因是每个容器都有自己的“本地主机”概念,因为它们位于不同的网络中 namespace .这意味着“testTalk”容器上的“localhost”不会解析为运行监听器的主机。当您使用 --net=host(上面的选项 3)时,您将删除容器的单独命名空间,从而消除使用 docker 的一些安全优势。

关于python - 使docker容器通过端口进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42472803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com