如何从检查docker容器中抓取暴露的端口?

时间:2015-07-21 15:26:46

标签: sed grep docker dockerfile

假设我使用以下命令启动docker容器

docker run -d --name my-container -p 1234 my-image

并且运行docker ps显示该图像的端口绑定是......

80/tcp, 443 /tcp. 0.0.0.0:32768->1234/tcp

有没有办法可以使用docker inspect来获取分配给1234的端口(在本例中为32768)?

类似于使用以下命令解析和获取IP地址...

IP=$(docker inspect -f "{{ .Networksettings.IPAddress }} my-container)

我希望能够做类似以下的事情

ASSIGNED_PORT=$(docker inspect -f "{{...}} my-container)

我不确定是否有办法通过Docker做到这一点,但我想有一些命令行魔法(grep,sed等)可以让我做这样的事情。

当我运行docker inspect my-container并查看NetworkSettings时......我看到以下内容

"NetworkSettings": {
        ...
        ...
        ...
        "Ports": {
            "1234/tcp": [
                {
                    "HostIp": "0.0.0.0",
                    "HostPort": "32768"
                }
            ],
            "443/tcp": null,
            "80/tcp": null
        },
        ...
        ...
    },

在这种情况下,我希望它找到HostPort而不告诉我有关端口1234的任何内容(它应该忽略它下面的443和80)并返回32768

6 个答案:

答案 0 :(得分:3)

执行命令:docker inspect --format="{{json .Config.ExposedPorts }}" src_python_1

结果:{"8000/tcp":{}}

证明(使用docker ps):

e5e917b59e15        src_python:latest   "start-server"         22 hours ago        Up 22 hours         0.0.0.0:8000->8000/tcp                                        src_python_1

答案 1 :(得分:2)

根据您的口味,有两个不错的选择:docker port my-container 1234 | grep -o [0-9]*$docker inspect --format='{{(index (index .NetworkSettings.Ports "1234/tcp") 0).HostPort}}' my-container

答案 2 :(得分:0)

使用ip地址并不容易,因为一个容器可以有多个端口,有些是暴露的,有些则没有,但是这样就可以了:

sudo docker inspect name | grep HostPort | sort | uniq | grep -o [0-9]*

如果有多个端口被暴露,它将显示在一个新行上。

答案 3 :(得分:0)

我已使用docker inspect <container>docker inspect <container>| jq组合来剥离端口。

在下面的示例中,我正在查看 dsb-server 容器和我正在寻找的端口 8080 / tcp

docker ps

CONTAINER ID        IMAGE                                                                         COMMAND                  CREATED             STATUS              PORTS                                                                NAMES
98b4bec33ba9        xxxxx:dsbv3   "./docker-entrypoint."   6 days ago          Up 6 days           8009/tcp, 0.0.0.0:4848->4848/tcp, 8181/tcp, 0.0.0.0:9013->8080/tcp   dsb-server

剥离端口

docker inspect dsb-server| jq -r '.[].NetworkSettings.Ports."8080/tcp"[].HostPort'

9013

docker inspect --format='{{(index (index .NetworkSettings.Ports "8080/tcp") 0).HostPort}}'

9013

答案 4 :(得分:0)

使用jq:

docker inspect --format="{{json .}}" my-container | jq '.NetworkSettings.Ports["1234/tcp"][0].HostPort'

使用您在docker run中指定的端口更改1234。

答案 5 :(得分:0)

以上答案很接近,使我走上了正确的轨道,但我不断遇到以下错误:

模板解析错误:模板::1:操作数中意外的“ /”

我在这里找到了答案:realtime database examples

这终于对我有用:

data.ref.path