Docker:如何找到我的容器所在的网络?

问题描述 投票:0回答:8

我想了解一些关于 Docker 的事情:

  1. 如何找到我的容器所在的网络?
  2. 我可以动态分离我的容器并连接到其他网络吗?怎么办?
  3. 如果我有两个容器正在运行,如何检查这两个容器是否在 同一网络?我可以从另一个 ping 一个吗?
networking docker
8个回答
191
投票

查看您的容器所在的网络,假设您的容器名为

c1
:

$ docker inspect c1 -f "{{json .NetworkSettings.Networks }}"

要断开容器与第一个网络的连接(假设您的第一个网络称为

test-net
):

$ docker network disconnect test-net c1

然后将其重新连接到另一个网络(假设其名为 test-net-2):

$ docker network connect test-net-2 c1

检查两个容器(或更多)是否同时位于网络上:

$ docker network inspect test-net -f "{{json .Containers }}"

59
投票
  1. 网络在

    docker container inspect $id
    输出中可见,其中
    $id
    是容器 ID 或容器名称。该名称列在 NetworkSettings -> Networks 部分下。可以用格式字符串输出:

    docker container inspect \
      --format '{{range $net,$v := .NetworkSettings.Networks}}{{printf "%s\n" $net}}{{end}}' \
      $container_name
    
  2. 您可以使用

    docker network connect $network_name $container_name
    将网络添加到容器。同样,
    docker network disconnect $network_name $container_name
    将断开容器与 Docker 网络的连接。

  3. 如果容器位于同一 docker 网络并且您未禁用 ICC,则容器可以通过 IP 地址互相 ping 通。如果您不在名为“bridge”的默认网络上,则可以使用附带的 DNS 发现通过容器名称或网络别名 ping 并连接到容器。您使用

    docker network create $network_name
    创建的任何新网络都已打开 DNS 发现,即使它使用桥接驱动程序,它也只需与名为“bridge”的网络分开即可。容器还可以通过 TCP 端口进行连接,即使不在 docker 中公开或发布端口,只要它们位于同一 docker 网络上即可。

这是使用 netcat 测试网络连接的低级示例:

$ docker network create test-net

$ docker run --net test-net --name nc-server -d nicolaka/netshoot nc -vl 8080
17df24cf91d1cb785cfd0ecbe0282a67adbfe725af9a1169f0650a022899d816

$ docker run --net test-net --name nc-client -it --rm nicolaka/netshoot nc -vz nc-server 8080
Connection to nc-server 8080 port [tcp/http-alt] succeeded!

$ docker logs nc-server
Listening on [0.0.0.0] (family 0, port 8080)
Connection from nc-client.test-net 37144 received!

$ docker rm nc-server
nc-server

$ docker network rm test-net

25
投票

老问题..但您可能正在尝试确保容器集群运行正确的网络。 有两种简单的方法。 你的直觉可能需要这样的东西:

docker ps --format '{{ .ID }} {{ .Names }} {{ json .Networks }}'

但你可能真的想要:

docker network inspect networkname

其中包括该网络上所有容器的列表。


3
投票

我需要进行快速测试来验证哪些容器连接到我的自定义桥,以解决容器之间的连接问题。下面的测试可以回答OP问题的第一部分和第三部分:

docker network inspect <tab complete to show avail. bridges> | grep IPv4Address

样本输出:

docker network inspect <tab completion results below>
   bridge   docker-compose_zabbix_zbx_net_backend   host                                       
   docker-compose_zabbix_default  docker-compose_zabbix_zbx_net_frontend  none                                       

ubuntu@myDockerHost:~$ docker network inspect docker-compose_zabbix_zbx_net_backend | grep IPv4Address
            "IPv4Address": "172.16.239.6/24",
            "IPv4Address": "172.16.239.7/24",
            "IPv4Address": "172.16.239.4/24",
            "IPv4Address": "172.16.239.5/24",
            "IPv4Address": "172.16.239.8/24",
            "IPv4Address": "172.16.239.3/24",
            "IPv4Address": "172.16.239.2/24",

或通过 containerName:

docker network inspect <tab complete to show avail. bridges> | grep Name

样本输出:

docker network inspect docker-compose_zabbix_zbx_net_backend | grep Name
    "Name": "docker-compose_zabbix_zbx_net_backend",
            "Name": "docker-compose_zabbix-zabbix-agent",
            "Name": "docker-compose_zabbix-zabbix-server",
            "Name": "docker-compose_zabbix-zabbix-web-service",
            "Name": "docker-compose_zabbix-postgres-server",
            "Name": "docker-compose_zabbix-zabbix-web-nginx-pgsql",
            "Name": "docker-compose_zabbix-zabbix-java-gateway",
            "Name": "docker-compose_zabbix-zabbix-snmptraps",

结果将显示通过 IP 或名称加入到指定网桥的所有容器。

注意:不要在

ip addr list
的输出中为上述命令中的桥名称值提供分配给桥的随机桥名称。如果这样做,错误
Error: No such network: br-abtfta2nb624
将会被吐出。

至于OP问题的第二部分,我建议读者参考@johnharris85的优秀答案。


2
投票

$ docker inspect my-container-name

在“网络”部分下,您将找到网络。

"Networks": {
            "host": {   -------> *this is your network*
                "IPAMConfig": null,
                "Links": null,
                "Aliases": null, 
                "NetworkID":"5de628a521355837083c987789c7193f42507e26fe524a",
                "EndpointID": "",

1
投票

我从 Jenkins 机器收到此错误:

错误:docker:来自守护进程的错误响应:网络isolated_docker not 找到了。

然后我意识到网络isolated_docker不存在,然后我使用命令创建:

docker network create isolated_docker

您可以使用以下命令检查机器内部的网络:

docker network ls

0
投票

2024年答案

首先列出您可用的 docker 网络:

docker network ls

例如

docker network ls
NETWORK ID     NAME                         DRIVER    SCOPE
362awwd28a8f6   bridge                       bridge    local
0aawdawd4e07c   host                         host      local
5b0awd2adba73   none                         null      local
90a6awdwdwa6c   titan-utilities_my_network   bridge    local

就我而言,我创建的容器创建了自己的隔离网络(这是获得网络隔离的最佳实践。您不希望容器能够使用主机的网络适配器或查看其他内容,这会破坏docker 的目的)

就我而言,容器位于:

utilities_my_network

现在您可以检查它:

docker network inspect titan-utilities_my_network

在输出的底部我可以看到:.

...
        "Containers": {
            "58b8791d8c8fec279aaaaaaaaaaaaaaaaaaaaaaaaafc377c3a49be20e7a360b96aef": {
                "Name": "te-utilities-mosquitto-1",
                "EndpointID": "zzzzzzzzz____redacted",
                "MacAddress": "02:ff:ff:ff:ff:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            },
...

希望有帮助!


-2
投票
$ docker exec -it {container_name_1} ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:13:00:03  
          inet addr:172.19.0.3  Bcast:172.19.255.255  Mask:255.255.0.0
$ docker exec -it {container_name_2} ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:12:00:02  
          inet addr:172.18.0.2  Bcast:172.18.255.255  Mask:255.255.0.0

就我而言,这意味着

{container_name_1}
{container_name_2}
不在同一网络上。 (
172.18
172.19
不一样)。要使它们在同一网络上运行,一种方法是使用
docker-compose
。关注这个l

© www.soinside.com 2019 - 2024. All rights reserved.