您可以使用python套接字进行Docker容器通信吗?

Joe*_*e N 5 python sockets networking python-3.x docker

在码头工人网络中,我试图使用python套接字在两个容器之间进行通信(发送数据包)。Pinging有效,但是python sockets库不起作用。

错误:

line 6: conn, addr = sock.connect(('172.168.1.2', 4000)) TypeError: 'NoneType' object is not iterable

首先python3 receive.py在container1中运行。然后在容器2中运行python3send.py。容器1显示“ accepted”,然后不显示其他任何内容。如上所述的容器2错误。

该网络是用户定义的网络,具有自己的子网和默认网关。当我使用相同的确切代码连接到树莓派时,不会发生此错误,但是与容器通信时会出错。

所有代码:

container1:

import socket

def receive():
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.bind(("", 4000))
        s.listen(2)
        conn, addr = s.accept()
        print("accepted")
        print(bytes.decode(conn.recv(1024)))
Run Code Online (Sandbox Code Playgroud)

容器2:

import socket

def send():
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        command = "bridge test!"
        conn, addr = sock.connect(('172.168.1.2', 4000))
        conn.sendall(command)
Run Code Online (Sandbox Code Playgroud)

设置网络:

docker network create --subnet 172.168.1.0/24 testNetwork
docker network connect testNetwork container1
docker network connect testNetwork container2
Run Code Online (Sandbox Code Playgroud)

我从docker inspect获得了容器的IP地址(以及对其进行ping操作),请帮忙!谢谢!

0xc*_*aff 4

你有几个问题。

  1. socket.connect不返回任何内容。它返回None。您认为它返回一个元组conn, addr。Python 尝试通过迭代元组来解构返回到元组中的任何内容,并且您会收到错误:

    TypeError: 'NoneType' object is not iterable
    
    Run Code Online (Sandbox Code Playgroud)
  2. socket.sendall 接受字节而不是str. 转换依据

    sock.sendall(command.encode())
    
    Run Code Online (Sandbox Code Playgroud)

这是固定的send.py

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
command = "bridge test!"
x, y = sock.connect(('172.168.1.2', 4000))
sock.sendall(command.encode())
Run Code Online (Sandbox Code Playgroud)