如何用docker-py绑定端口

我尝试使用docker-py(版本1.3.1)启动docker容器。 我想映射容器的内部端口到不同的端口,但没有正确的公开。

我这样做是这样的:

def start_container(client, host_config, image_tagged_name, command): print ("create_host_config", host_config.binds, host_config.port_bindings) the_host_config = create_host_config(binds = host_config.binds, port_bindings = host_config.port_bindings); the_ports = host_config.port_bindings.values(); print ("create_container", image_tagged_name, command, the_ports, the_host_config) cont_id = client.create_container(image=image_tagged_name, command=command, ports=the_ports, host_config=the_host_config)["Id"] 

在这种情况下,产出如下:

 create_host_config ['/dbfiles/test:/opt/db'] {3001: 3000, 2425: 2424, 2481: 2480} create_container test:test ./initdb.sh [3000, 2424, 2480] {'Binds': ['/dbfiles/test:/opt/db'], 'PortBindings': {'3001/tcp': [{'HostPort': '3000', 'HostIp': ''}], '2425/tcp': [{'HostPort': '2424', 'HostIp': ''}], '2481/tcp': [{'HostPort': '2480', 'HostIp': ''}]}} 

docker工人告诉我:

 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 169ad3ae0f63 test:test "./initdb.sh" 5 minutes ago Up 5 minutes 2424/tcp, 2480/tcp, 3000/tcp silly_pasteur 

但是,如果我给它的映射3000 – > 3000,2424 – > 2424和2480 – > 2480它给

 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cba483673bdd test:test "./initdb.sh" 53 minutes ago Up 5 minutes 0.0.0.0:2424->2424/tcp, 0.0.0.0:2480->2480/tcp, 0.0.0.0:3000->3000/tcp stupefied_ptolemy 

关键是,从命令行我可以启动容器与适当的端口映射。 那是

docker run -d -p 3001:3000 -p 2425:2424 -p 2481:2480 -v / dbfiles / test:/ opt / db localhost:5000 / test:test /initdb.sh

给出了预期的结果。

 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7c1580e0ace9 localhost:5000/test:test "/initdb.sh" 8 seconds ago Up 6 seconds 0.0.0.0:2425->2424/tcp, 0.0.0.0:2481->2480/tcp, 0.0.0.0:3001->3000/tcp backstabbing_brahmagupta 

然而,用docker-py我只是不知道如何将端口映射到不同的端口号。 我错过了什么?

问题是docker-py首先将容器端口放在主机configuration中,而docker客户端将其放在第二位。 更有趣的是,我终于find了它。 诀窍是安装socat然后

 $ socat -v UNIX-LISTEN:/tmp/debug, fork UNIX-CONNECT:/var/run/docker.sock $ export DOCKER_HOST=unix:///tmp/debug 

这样可以方便地查看Docker客户端以及docker-py客户端的stream量。

我在里面searchPortBindingsstring。 对于原来的客户,这给了我:

 "PortBindings": { "2424/tcp": [{"HostIp":"","HostPort":"2425"}], "2480/tcp": [{"HostIp":"","HostPort":"2481"}], "3000/tcp": [{"HostIp":"","HostPort":"3001"}] } 

而我的代码给了我

 "PortBindings": { "2425/tcp": [{"HostPort": "2424", "HostIp": ""}], "2481/tcp": [{"HostPort": "2480", "HostIp": ""}], "3001/tcp": [{"HostPort": "3000", "HostIp": ""}] }, 

这使一切变得明显。 问题不是没有公开端口,而是错误的端口sorting。

使用docker-py时,您必须发布公开端口。 (当你使用docker run发布的时候,端口是隐式暴露的)

例:

 container = config['connection'].create_container( image=imageName, name=containerName, ports=[2424], host_config=create_host_config(port_bindings={2424:2425}) )