当前位置: 首页 > 面试题库 >

如何使用docker-py绑定端口

高皓
2023-03-14
问题内容

我尝试使用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 / 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将容器端口放在其主机配置中的第一位,而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中工作: ..总是告诉我,新的不存在。应该如何使用docker-py完成? 问题答案: 以下是进行卷绑定的当前工作方式:

  • 假设我有一个名为“mynet”的网络,我想启动一个IP地址绑定到192.168.23.2的容器。 我开始使用的代码是: 我从这里做什么?我正在有效地从中寻找与选项等效的选项。

  • 问题内容: 我有docker主机,内部有一个容器。 泊坞窗主机仅在IPv6接口上绑定端口,而不在IPv4上绑定端口。 这是输出 现在我在主机上有40122端口,可与容器上的端口22链接。 我想通过SSH进入该容器,但无法将其绑定到IPv6 这是我的Docker版本 我跑了 ps辅助 问题答案: 正如@ daniel- t在评论中指出的那样:github.com/docker/docker/issu

  • Docker-py 是用 Python 写的一个 API 客户端。它可以让用户执行docker命令所要做的任何事情,但是可以在Python应用程序中执行–运行容器、管理容器、管理Swarms等。

  • 问题内容: 快速使用以下语法进行流控制 在这种情况下 ,真值上下文的语义是什么 ? 是否允许 表达式链接 (如下所示)? 如果是这样,布尔表达式是否会短路? 问题答案: 首先检查它是否为零或是否有数据。如果为零,则不会执行if语句。如果有数据,则将数据解包并分配给if语句的范围。然后执行括号内的代码。 无法在一个if语句中链接此功能。不直接评估为布尔值。最好将“ if let”视为一个特殊关键字。

  • 本文向大家介绍Docker 网络之端口绑定的方法,包括了Docker 网络之端口绑定的方法的使用技巧和注意事项,需要的朋友参考一下 外部访问容器 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。 -P 标记时 Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。 -p 标记时 则可以指定要映射的端口,并且,在一