docker网络模式详解及容器间网络通信

简介: docker网络模式详解及容器间网络通信

默认网络

前言

当项目大规模使用 Docker 时,容器通信的问题也就产生了。要解决容器通信问题,必须先了解很多关于网络的知识。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker 同样有着很多不完善的地方,网络方面就是 Docker 比较薄弱的部分。因此,我们有必要深入了解 Docker 的网络知识,以满足更高的网络需求。

安装 Docker 以后,会默认创建三种网络,可以通过 docker network ls 查看。

[root@centos8 myhelloworld]#  docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
6f2e547e5d81   bridge    bridge    local
aa8c2db61779   host      host      local
725d3522df53   none      null      local
[root@centos8 myhelloworld]# 

在学习 Docker 网络之前,我们有必要先来了解一下这几种网络模式都是什么意思。

image.png

bridge 网络模式

关于 bridge 网络模式的使用,只需要在创建容器时通过参数 --net bridge 或者 --network bridge 指定即可,当然这也是创建容器默认使用的网络模式,也就是说这个参数是可以省略的。

在该模式中,Docker 守护进程创建了一个虚拟以太网桥 docker0 ,新建的容器会自动桥接到这个接口,附加在其上的任何网卡之间都能自动转发数据包。

默认情况下,守护进程会创建一对对等虚拟设备接口 veth pair ,将其中一个接口设置为容器的eth0 接口(容器的网卡),另一个接口放置在宿主机的命名空间中,以类似 vethxxx 这样的名字命名,从而将宿主机上的所有容器都连接到这个内部网络上。


运行一个基于 busybox 镜像构建的容器 bbox01 ,查看 ip addr

busybox 被称为嵌入式 Linux 的瑞士军刀,整合了很多小的 unix 下的通用功能到一个小的可执行文件中。

[root@centos8 ~]# docker run -id --name  bbox01 busybox
a6b7af8865f1950ff7905731f68626b06bde404fdf9eb50d8ae11de4accd31fb
[root@centos8 ~]# ip a
77: veth5ba32d3@if76: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 62:b7:49:0f:3e:e3 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::60b7:49ff:fe0f:3ee3/64 scope link 
       valid_lft forever preferred_lft forever
[wxf@centos8 ~]$ docker exec -it bbox01 sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
76: eth0@if77: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # 

通过以上的比较可以发现,证实了之前所说的:守护进程会创建一对对等虚拟设备接口 veth pair ,将其中一个接口设置为容器的eth0 接口(容器的网卡),另一个接口放置在宿主机的命名空间中,以类似 vethxxx 这样的名字命名。

[root@centos8 ~]# docker inspect bbox01 
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",

同时,守护进程还会从网桥 docker0 的私有地址空间中分配一个 IP 地址和子网给该容器,并设置docker0 的 IP 地址为容器的默认网关。也可以安装 yum install -y bridge-utils 以后,通过brctl show 命令查看网桥信息。

[root@centos8 ~]# brctl show
bridge name bridge id   STP enabled interfaces
docker0   8000.0242d8b0f9ea no    veth5ba32d3

Bridge 桥接模式的实现步骤主要如下:

  • Docker Daemon 利用 veth pair 技术,在宿主机上创建一对对等虚拟网络接口设备,假设为veth0 和 veth1。而 veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文,都会将报文传输给另一方。
  • Docker Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0 网桥上。保证宿主机的网络报文可以发往 veth0;
  • Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下,并被改名为 eth0。如此一来,宿主机的网络报文若发往 veth0,则立即会被 Container 的 eth0 接收,实现宿主机到Docker Container 网络的联通性;同时,也保证DockerContainer 单独使用 eth0,实现容器网络环境的隔离性

host 网络模式

  • host 网络模式需要在创建容器时通过参数 --net host 或者 --network host 指定;
  • 采用 host 网络模式的 Docker Container,可以直接使用宿主机的 IP 地址与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公有 IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换;
  • host 网络模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。

基于 host 网络模式创建了一个基于 busybox 镜像构建的容器 bbox02 ,查看 ip addr :

[root@centos8 myhelloworld]# docker run -id --name bbox02 --network host busybox
ff543c771df00064776e3d3be791cb38a972650f53523df61a2c8e5944984ffe
[root@centos8 myhelloworld]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:a2:2b:9f brd ff:ff:ff:ff:ff:ff
    inet 192.168.135.10/24 brd 192.168.135.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fea2:2b9f/64 scope link 
       valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 52:54:00:50:9b:57 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN group default qlen 1000
    link/ether 52:54:00:50:9b:57 brd ff:ff:ff:ff:ff:ff
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:d8:b0:f9:ea brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:d8ff:feb0:f9ea/64 scope link 
       valid_lft forever preferred_lft forever
[root@centos8 myhelloworld]# 
[root@centos8 ~]# docker exec -it bbox02 sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel qlen 1000
    link/ether 00:0c:29:a2:2b:9f brd ff:ff:ff:ff:ff:ff
    inet 192.168.135.10/24 brd 192.168.135.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fea2:2b9f/64 scope link 
       valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue qlen 1000
    link/ether 52:54:00:50:9b:57 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 qlen 1000
    link/ether 52:54:00:50:9b:57 brd ff:ff:ff:ff:ff:ff
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue 
    link/ether 02:42:d8:b0:f9:ea brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:d8ff:feb0:f9ea/64 scope link 
       valid_lft forever preferred_lft forever
/ # 

对,你没有看错,返回信息一模一样,我也可以肯定我没有截错图,不信接着往下看。我们可以通

过 docker network inspect host 查看所有 host 网络模式下的容器,在 Containers 节点中可以

看到容器名称。

[root@centos8 myhelloworld]# docker network inspect host
[
    {
        "Name": "host",
        "Id": "aa8c2db61779799e132c0db04ec7937de6dd71be1b1c1f984aba821d9f53ec50",
        "Created": "2021-10-14T10:58:20.799263317-04:00",
        "Scope": "local",
        "Driver": "host",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": []
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "ff543c771df00064776e3d3be791cb38a972650f53523df61a2c8e5944984ffe": {
                "Name": "bbox02",
                "EndpointID": "e5dbca8a80845b7a24c0014c7887e3523d1251e87220b8c6b50c828c303bf14a",
                "MacAddress": "",
                "IPv4Address": "",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]
[root@centos8 myhelloworld]# 

none 网络模式

  • none 网络模式是指禁用网络功能,只有 lo 接口 local 的简写,代表 127.0.0.1,即 localhost 本地环回接口。在创建容器时通过参数 --net none 或者 --network none 指定;
  • none 网络模式即不为 Docker Container 创建任何的网络环境,容器内部就只能使用 loopback网络设备,不会再有其他的网络资源。可以说 none 模式为 Docke Container 做了极少的网络设定,但是俗话说得好“少即是多”,在没有网络配置的情况下,作为 Docker 开发者,才能在这基础做其他无限多可能的网络定制开发。这也恰巧体现了 Docker 设计理念的开放。

基于 none 网络模式创建了一个基于 busybox 镜像构建的容器 bbox03 ,查看 ip addr :

[root@centos8 myhelloworld]# docker run -it --name bbox03 --network none busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
/ # 

container 网络模式

  • Container 网络模式是 Docker 中一种较为特别的网络的模式。在创建容器时通过参数 --net
  • container:已运行的容器名称|ID 或者 --network container:已运行的容器名称|ID 指定;处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用 localhost 高效快速通信。


Container 网络模式即新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样两个容器除了网络方面相同之外,其他的如文件系统、进程列表等还是隔离的。

[root@centos8 ~]# docker run -id --name bbox01 --network bridge busybox
a270dafa514353484e97ef11afc784ebda9198ec3b86053ea609382bf1e6e644
[root@centos8 myhelloworld]# docker exec -it bbox01 sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
78: eth0@if79: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # 
[root@centos8 ~]# docker run -it --name bbox02 --network container:bbox01 busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
78: eth0@if79: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # 
  • 通过以上测试可以发现,Docker 守护进程只创建了一对对等虚拟设备接口用于连接 bbox01 容器和宿主机,而 bbox02 容器则直接使用了 bbox01 容器的网卡信息。
  • 这个时候如果将 bbox01 容器停止,会发现 bbox02 容器就只剩下 lo 接口了。然后 bbox01 容器重启以后,bbox02 容器也重启一下,就又可以获取到网卡信息了。

自定义网络

虽然 Docker 提供的默认网络使用比较简单,但是为了保证各容器中应用的安全性,在实际开发中更推荐使用自定义的网络进行容器管理,以及启用容器名称到 IP 地址的自动 DNS 解析。

从 Docker 1.10 版本开始,docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通过容器名称进行通信。方法很简单,只要在创建容器时使用 --name 为容器命名即可。

但是使用 Docker DNS 有个限制:只能在 user-defined 网络中使用。也就是说,默认的bridge 网络是无法使用 DNS 的,所以我们就需要自定义网络。

创建网络

通过 docker network create 命令可以创建自定义网络模式

进一步查看 docker network create 命令使用详情,发现可以通过 --driver 指定网络模式且默认是 bridge 网络模式

[root@centos8 myhelloworld]# docker network create --help
Usage:  docker network create [OPTIONS] NETWORK
Create a network
Options:
      --attachable           Enable manual container attachment
      --aux-address map      Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
      --config-from string   The network from which to copy the configuration
      --config-only          Create a configuration only network
  -d, --driver string        Driver to manage the Network (default "bridge")
      --gateway strings      IPv4 or IPv6 Gateway for the master subnet
      --ingress              Create swarm routing-mesh network
      --internal             Restrict external access to the network
      --ip-range strings     Allocate container ip from a sub-range
      --ipam-driver string   IP Address Management Driver (default "default")
      --ipam-opt map         Set IPAM driver specific options (default map[])
      --ipv6                 Enable IPv6 networking
      --label list           Set metadata on a network
  -o, --opt map              Set driver specific options (default map[])
      --scope string         Control the network's scope
      --subnet strings       Subnet in CIDR format that represents a network segment
[root@centos8 myhelloworld]# 

创建一个基于 bridge 网络模式的自定义网络模式 custom_network

通过 docker network ls 查看网络模式

[root@centos8 myhelloworld]# docker network create custom_network
a67db459b2a44949e086dca7cc0364a1c4d1e0e7bf89299fec1232f553a6ab0b
[root@centos8 myhelloworld]# docker network ls
NETWORK ID     NAME             DRIVER    SCOPE
6f2e547e5d81   bridge           bridge    local
a67db459b2a4   custom_network   bridge    local
aa8c2db61779   host             host      local
725d3522df53   none             null      local


通过自定义网络模式 custom_network 创建容器

[root@centos8 ~]# docker run -it --name bbox01 --network custom_network busybox

通过 docker inspect 容器名称|ID 查看容器的网络信息,在 NetworkSettings 节点中可以看到详细信息。


连接网络

通过 docker network connect 网络名称 容器名称 为容器连接新的网络模式。

[root@centos8 myhelloworld]# docker network connect --help
Usage:  docker network connect [OPTIONS] NETWORK CONTAINER
Connect a container to a network
Options:
      --alias strings           Add network-scoped alias for the container
      --driver-opt strings      driver options for the network
      --ip string               IPv4 address (e.g., 172.30.100.104)
      --ip6 string              IPv6 address (e.g., 2001:db8::33)
      --link list               Add link to another container
      --link-local-ip strings   Add a link-local address for the container
[root@centos8 myhelloworld]# docker network connect bridge bbox01
[root@centos8 myhelloworld]# docker inspect bbox01

通过 docker inspect 容器名称|ID 再次查看容器的网络信息,多增加了默认的 bridge

"Networks": {
                "bridge": {
                    "IPAMConfig": {},
                    "Links": null,
                    "Aliases": [],
                    "NetworkID": "6f2e547e5d81a10194405a25681022f1e965395291eb0bb07a5a553f2e6e57ce",
                    "EndpointID": "be5bc60b9d304ba906723f30535b8b938ff276933b4d056803560a1026b34a3d",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": {}
                },
                "custom_network": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "1df7d07996c0"
                    ],
                    "NetworkID": "a67db459b2a44949e086dca7cc0364a1c4d1e0e7bf89299fec1232f553a6ab0b",
                    "EndpointID": "793a1702321dc95bed901fc4e441f9827f55db19360fb95f4d2563b6af78bba2",
                    "Gateway": "172.18.0.1",
                    "IPAddress": "172.18.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:12:00:02",
                    "DriverOpts": null
                }
            }

断开网络

通过 docker network disconnect 网络名称 容器名称 命令断开网络

docker network disconnect bridge bbox01

通过 docker inspect 容器名称|ID 再次查看容器的网络信息,发现只剩下custom_network 。

"Networks": {
                "custom_network": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "1df7d07996c0"
                    ],
                    "NetworkID": "a67db459b2a44949e086dca7cc0364a1c4d1e0e7bf89299fec1232f553a6ab0b",
                    "EndpointID": "793a1702321dc95bed901fc4e441f9827f55db19360fb95f4d2563b6af78bba2",
                    "Gateway": "172.18.0.1",
                    "IPAddress": "172.18.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:12:00:02",
                    "DriverOpts": null
                }
            }

移除网络

可以通过 docker network rm 网络名称 命令移除自定义网络模式,网络模式移除成功会返回网

络模式名称

docker network rm custom_network

容器间网络通信

接下来我们通过所学的知识实现容器间的网络通信。首先明确一点,容器之间要互相通信,必须要有属于同一个网络的网卡。

默认bridge

我们先创建两个基于默认的 bridge 网络模式的容器。

[root@centos8 ~]# docker run -it --name bbox03 busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
87: eth0@if88: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.093 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.053 ms
64 bytes from 172.17.0.3: seq=2 ttl=64 time=0.056 ms
64 bytes from 172.17.0.3: seq=3 ttl=64 time=0.054 ms
^C
--- 172.17.0.3 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.053/0.064/0.093 ms
/ # 


[wxf@centos8 ~]$ docker run -it --name bbox04 busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
89: eth0@if90: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.065 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.055 ms
64 bytes from 172.17.0.2: seq=2 ttl=64 time=0.054 ms
64 bytes from 172.17.0.2: seq=3 ttl=64 time=0.054 ms
^C
--- 172.17.0.2 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.054/0.057/0.065 ms
/ # 

经过测试,从结果得知两个属于同一个网络的容器是可以进行网络通信的,但是 IP 地址可能是不固定的,有被更改的情况发生(stop容器再start容器,此时ip会变,不是固定的),那容器内所有通信的 IP 地址也需要进行更改,能否使用容器名称进行网络通信?继续测试。

/ # ping bbox04
ping: bad address 'bbox04'
/ # 


经过测试,从结果得知使用容器进行网络通信是不行的,那怎么实现这个功能呢?

自定义bridge

从 Docker 1.10 版本开始,docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通过容器名称通信。方法很简单,只要在创建容器时使用 --name 为容器命名即可。

但是使用 Docker DNS 有个限制:只能在 user-defined 网络中使用。也就是说,默认的 bridge网络是无法使用 DNS 的,所以我们就需要自定义网络。

我们先基于 bridge 网络模式创建自定义网络 custom_network ,然后创建两个基于自定义网络模式的容器。

[root@centos8 myhelloworld]# docker network create custom_network
[root@centos8 myhelloworld]#docker run -id --name custom_bbox01 --net custom_network busybox
[root@centos8 myhelloworld]#docker run -id --name custom_bbox02 --net custom_network busybox


通过 docker network inspect custom_network 查看两容器的具体 IP 信息

[wxf@centos8 ~]$ docker network inspect custom_network
"Containers": {
        "1df7d07996c06aa4a670b0e533ea0e94f80d3945f398457b3bf823b6045df893": {
            "Name": "bbox01",
            "EndpointID": "25bc9e7e1f0f552c1d8f419569958622783b8187d86c968a61db3a867b79c5e9",
            "MacAddress": "02:42:ac:12:00:02",
            "IPv4Address": "172.18.0.2/16",
            "IPv6Address": ""
        },
        "565b52bd7a8b751539c423364b27c0a81c28ba114f0a561b896a51d3e741cfc4": {
            "Name": "bbox02",
            "EndpointID": "ba41fa64eee813cc223790a3902a412ebd280d6bafd142430dd544d7001c16cf",
            "MacAddress": "02:42:ac:12:00:03",
            "IPv4Address": "172.18.0.3/16",
            "IPv6Address": ""
        }
    }

然后测试两容器间是否可以进行网络通信,分别使用具体 IP 和容器名称进行网络通信

[root@centos8 ~]# docker exec -it bbox01 sh
/ # ping bbox02
PING bbox02 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.136 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.060 ms
64 bytes from 172.18.0.3: seq=2 ttl=64 time=0.060 ms
^C
--- bbox02 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.060/0.085/0.136 ms
/ # 

经过测试,从结果得知两个属于同一个自定义网络的容器是可以进行网络通信的,并且可以使用容器名称进行网络通信。

那如果此时我希望 bridge 网络下的容器可以和 custom_network 网络下的容器进行网络又该如何操作?其实答案也非常简单:让 bridge 网络下的容器连接至新的 custom_network 网络即可。

docker network connect custom_network bbox03
[wxf@centos8 ~]$ docker network connect custom_network bbox03
[wxf@centos8 ~]$ docker start bbox03
bbox03
[wxf@centos8 ~]$ docker exec -it bbox03 sh
/ # ping bbox02
PING bbox02 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.083 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.065 ms
64 bytes from 172.18.0.3: seq=2 ttl=64 time=0.059 ms
^C
--- bbox02 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.059/0.069/0.083 ms
/ # 


目录
相关文章
|
12天前
|
关系型数据库 MySQL Docker
|
23天前
|
Ubuntu Linux Docker
Docker容器的实战讲解
这只是Docker的冰山一角,但是我希望这个简单的例子能帮助你理解Docker的基本概念和使用方法。Docker是一个强大的工具,它可以帮助你更有效地开发、部署和运行应用。
94 27
|
2月前
|
Ubuntu 关系型数据库 MySQL
容器技术实践:在Ubuntu上使用Docker安装MySQL的步骤。
通过以上的操作,你已经步入了Docker和MySQL的世界,享受了容器技术给你带来的便利。这个旅程中你可能会遇到各种挑战,但是只要你沿着我们划定的路线行进,你就一定可以达到目的地。这就是Ubuntu、Docker和MySQL的灵魂所在,它们为你开辟了一条通往新探索的道路,带你亲身感受到了技术的力量。欢迎在Ubuntu的广阔大海中探索,用Docker技术引领你的航行,随时准备感受新技术带来的震撼和乐趣。
124 16
|
2月前
|
网络协议 物联网
VB6网络通信软件上位机开发,TCP网络通信,读写数据并处理,完整源码下载
本文介绍使用VB6开发网络通信上位机客户端程序,涵盖Winsock控件的引入与使用,包括连接服务端、发送数据(如通过`Winsock1.SendData`方法)及接收数据(利用`Winsock1_DataArrival`事件)。代码实现TCP网络通信,可读写并处理16进制数据,适用于自动化和工业控制领域。提供完整源码下载,适合学习VB6网络程序开发。 下载链接:[完整源码](http://xzios.cn:86/WJGL/DownLoadDetial?Id=20)
78 12
|
2月前
|
存储 虚拟化 Docker
|
2月前
|
存储 开发工具 开发者
揭秘 Microsoft.Docker.SDK:让容器开发更轻松的强大工具揭秘
随着云计算和容器技术的快速发展,`Docker` 已经成为容器化技术的事实标准。`Microsoft` 作为 `Docker` 的主要支持者和参与者,推出了 `Microsoft.Docker.SDK`,旨在帮助开发者更轻松地进行容器开发。本文将深入揭秘 Microsoft.Docker.SDK 的功能、使用方法以及它在容器开发中的应用。
96 12
|
2月前
|
监控 关系型数据库 MySQL
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
151 30
|
2月前
|
开发工具 虚拟化 git
自学软硬件第755 docker容器虚拟化技术youtube视频下载工具
docker容器虚拟化技术有什么用?怎么使用?TubeTube 项目使用youtube视频下载工具
|
2月前
|
安全 持续交付 云计算
课时5:阿里云容器服务:最原生的集成Docker和云服务
阿里云容器服务以服务化形式构建容器基础设施,大幅提升开发效率,简化应用部署流程。通过Docker容器和DevOps工具(如Jenkins),实现自动化部署与迭代,优化企业内部复杂部署问题。该服务支持GPU调度、混合云架构无缝迁移,并与阿里云产品体系无缝集成,提供安全防护、网络负载均衡等多重功能支持。凭借微服务架构,帮助企业突破业务瓶颈,提高资源利用率,轻松应对海量流量。
课时5:阿里云容器服务:最原生的集成Docker和云服务
|
3月前
|
Ubuntu API 网络虚拟化
ubuntu22 编译安装docker,和docker容器方式安装 deepseek
本脚本适用于Ubuntu 22.04,主要功能包括编译安装Docker和安装DeepSeek模型。首先通过Apt源配置安装Docker,确保网络稳定(建议使用VPN)。接着下载并配置Docker二进制文件,创建Docker用户组并设置守护进程。随后拉取Debian 12镜像,安装系统必备工具,配置Ollama模型管理器,并最终部署和运行DeepSeek模型,提供API接口进行交互测试。
549 15