【问题标题】:Docker : How to find the network my container is in?Docker:如何找到我的容器所在的网络?
【发布时间】:2017-10-09 19:34:34
【问题描述】:

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

  1. 如何找到我的容器所在的网络?
  2. 我可以动态分离我的容器并附加到另一个网络上吗?怎么样?
  3. 如果我有两个容器在运行,如何检查这两个容器是否在 同一个网络?我可以 ping 另一个吗?

【问题讨论】:

  • 嗨,您可以通过docker inspect container_name 找到容器和网络详细信息要获取容器名称,请点击此命令docker ps 我希望这会有用。

标签: networking docker


【解决方案1】:

要查看您的容器所在的网络,假设您的容器名为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 }}"

【讨论】:

  • 真的很有帮助 :) 谢谢
【解决方案2】:
  1. 网络在docker container inspect $id 输出中可见,其中$id 是容器ID 或容器名称。该名称列在 NetworkSettings -> Networks 部分下。

  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 发现,即使它使用的是网桥驱动程序,它也只需与名为“网桥”的网络分开即可。容器也可以通过 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

【讨论】:

    【解决方案3】:

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

    docker network inspect bridge my-bridge | grep IPv4Address
    

    或通过容器名称

    docker network inspect bridge my-bridge | grep Name
    

    结果将显示所有连接到指定桥的容器。

    至于 OP 问题的第二部分,我建议读者参考 @johnharris85 的出色回答。

    【讨论】:

      【解决方案4】:

      $ docker inspect my-container-name

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

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

      【讨论】:

        【解决方案5】:

        我从 Jenkins 机器上得到了这个错误:

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

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

        docker network create isolated_docker
        

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

        docker network ls
        

        【讨论】:

          【解决方案6】:

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

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

          但你可能真的想要:

          docker network inspect networkname
          

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

          【讨论】:

            【解决方案7】:
            $ 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.18172.19 不一样)。为了让它们在同一个网络上运行,方法是使用docker-compose。关注这个l

            【讨论】:

            • 这意味着 ifconfig 命令在容器中可用。大多数时候不是。
            猜你喜欢
            • 1970-01-01
            • 2020-05-17
            • 1970-01-01
            • 1970-01-01
            • 2017-05-02
            • 2022-11-10
            • 2022-10-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多