簡體   English   中英

如何使用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 / 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 run發布時,端口被隱式公開)

例:

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": ""}] 
},

這使一切顯而易見。 問題不在於未公開端口而是端口的錯誤順序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM