如何从主机获取 Docker 容器的 IP 地址

创建新容器后,是否可以运行命令以从主机获取容器的 IP 地址?

基本上,一旦 Docker 创建了容器,我想滚动自己的代码部署和容器配置脚本。

答案

inspect--format选项可以解决。

现代 Docker 客户端语法为:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id

旧的 Docker 客户端语法为:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name_or_id

这些命令将返回 Docker 容器的 IP 地址。

如注释中所述:如果您使用的是 Windows,请在大括号周围使用双引号"而不是单引号'

您可以使用docker inspect <container id>

例如:

CID=$(docker run -d -p 4321 base nc -lk 4321);
docker inspect $CID

首先获取容器 ID:

docker ps

(第一列是容器 ID)

使用容器 ID 运行:

docker inspect <container ID>

在底部的 “网络设置” 下,您可以找到 “IP 地址”

或只是做:

docker inspect <container id> | grep "IPAddress"
docker inspect CONTAINER_ID | grep "IPAddress"

您可以在 grep 中添加-i来忽略大小写,即使以下情况也可以:

docker inspect CONTAINER_ID | grep -i "IPaDDreSS"

仅通过一个命令即可获取所有容器名称及其 IP 地址。

docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)

如果您使用的是docker-compose则命令为:

docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

输出将是:

/containerA - 172.17.0.4
/containerB - 172.17.0.3
/containerC - 172.17.0.2

将此 shell 脚本添加到~/.bashrc或相关文件中:

docker-ip() {
  docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@"
}

然后,要获取容器的 IP 地址,只需执行以下操作:

docker-ip YOUR_CONTAINER_ID

对于新版本的 Docker,请使用以下命令:

docker-ip() {
        docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
}

在 Docker 1.3 + 中,您还可以使用以下命令进行检查:

输入正在运行的 Docker(Linux):

docker exec [container-id or container-name] cat /etc/hosts
172.17.0.26 d8bc98fa4088
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.17 mysql

对于 Windows:

docker exec [container-id or container-name] ipconfig

显示所有容器的 IP 地址:

docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

从 Docker 版本 1.10.3 开始,构建 20f81dd

除非您另行告知 Docker,否则 Docker 始终会在网桥网络中启动容器。因此,您可以在下面尝试以下命令:

docker network inspect bridge

然后应该返回 “容器” 部分,其中将显示正在运行的容器的 IP 地址。

[
    {
        "Name": "bridge",
        "Id": "40561e7d29a08b2eb81fe7b02736f44da6c0daae54ca3486f75bfa81c83507a0",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16"
                }
            ]
        },
        "Containers": {
            "025d191991083e21761eb5a56729f61d7c5612a520269e548d0136e084ecd32a": {
                "Name": "drunk_leavitt",
                "EndpointID": "9f6f630a1743bd9184f30b37795590f13d87299fe39c8969294c8a353a8c97b3",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        }
    }
]

执行:

docker ps -a

这将显示活动的 docker 映像:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
3b733ae18c1c        parzee/database     "/usr/lib/postgresql/"   6 minutes ago       Up 6 minutes                 5432/tcp            serene_babbage

使用容器 ID 值:

docker inspect <CONTAINER ID> | grep -w "IPAddress" | awk '{ print $2 }' | head -n 1 | cut -d "," -f1

“172.17.0.2”