如何使用 docker-py 绑定端口
how to bind ports with 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 ps 告诉我:
$ 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 运行 -d -p 3001:3000 -p 2425:2424 -p 2481:2480 -v /dbfiles/test:/opt/db localhost:5000/测试:测试/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 时,您必须发布 和 公开端口。 (当您使用 docker 运行 发布时,端口会隐式公开)
示例:
container = config['connection'].create_container(
image=imageName,
name=containerName,
ports=[2424],
host_config=create_host_config(port_bindings={2424:2425})
)
问题是 docker-py 在其主机配置中将容器端口放在第一位,而 docker 客户端将它们放在第二位。更有趣的是我最终是如何发现它的。诀窍是安装 socat 然后
$ socat -v UNIX-LISTEN:/tmp/debug, fork UNIX-CONNECT:/var/run/docker.sock
$ export DOCKER_HOST=unix:///tmp/debug
这样可以方便地查看 docker 客户端和 docker-py 客户端的流量。
我在内部搜索了 PortBindings 字符串。对于原始客户
这给了我:
"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": ""}]
},
这让一切都变得显而易见了。问题不是未能公开端口,而是端口顺序错误。
我尝试使用 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 ps 告诉我:
$ 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 运行 -d -p 3001:3000 -p 2425:2424 -p 2481:2480 -v /dbfiles/test:/opt/db localhost:5000/测试:测试/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 时,您必须发布 和 公开端口。 (当您使用 docker 运行 发布时,端口会隐式公开)
示例:
container = config['connection'].create_container(
image=imageName,
name=containerName,
ports=[2424],
host_config=create_host_config(port_bindings={2424:2425})
)
问题是 docker-py 在其主机配置中将容器端口放在第一位,而 docker 客户端将它们放在第二位。更有趣的是我最终是如何发现它的。诀窍是安装 socat 然后
$ socat -v UNIX-LISTEN:/tmp/debug, fork UNIX-CONNECT:/var/run/docker.sock
$ export DOCKER_HOST=unix:///tmp/debug
这样可以方便地查看 docker 客户端和 docker-py 客户端的流量。
我在内部搜索了 PortBindings 字符串。对于原始客户 这给了我:
"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": ""}]
},
这让一切都变得显而易见了。问题不是未能公开端口,而是端口顺序错误。