容器学习Day13-Docker容器网络

本文详细介绍了Docker容器的网络原理,包括默认的bridge模式,深入解析了Docker网络驱动如host、none、overlay和macvlan,以及如何使用网络管理命令创建、检查和删除网络。同时,通过实例展示了不同网络模式下的容器网络配置和通信方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列文章目录

容器学习Day01-初识容器

容器学习Day02-VMware Workstation安装Ubuntu

容器学习Day03-Ubuntu常用命令(一)

容器学习Day04-Ubuntu常用命令(二)

容器学习Day05-Ubuntu常用命令(三)

容器学习Day06-Ubuntu常用命令(四)

容器学习Day07-Docker基础(一)

容器学习Day08-Docker基础(二)

容器学习Day09-理解容器镜像

容器学习Day10-搭建私有镜像仓库

容器学习Day11-docker commit构建容器镜像

容器学习Day12-使用Dockerfile构建容器镜像

容器学习Day13-Docker容器网络

容器学习Day14-Docker容器存储

容器学习Day15-Docker容器底层实现技术

容器学习Day16-Docker Compose容器编排


文章目录

前言

一、Docker 容器网络基本原理

二、Docker 网络驱动

三、Docker 网络管理命令

四、Docker 的四种网络模式

1、bridge模式

2、host模式

3、none模式

4、container模式

总结

前言

      网络是虚拟化技术中最复杂的部分,也是 Docker 应用中的一个重要环节,Docker 中的网络主要解决容器与容器、容器与外部网络、外部网络与容器之间的相互通信问题。


一、Docker 容器网络基本原理

      Docker 的网络很好地利用了 Linux 虚拟网络技术,在宿主机的物理网卡和容器内分别创建一个虚拟接口(veth),并让它们通过宿主机的 docker0 网桥进行连接,这样的一对 veth 叫做 veth pair。

      宿主机与 Docker 容器建立通信的过程:

  • 客户端执行 "docker run" 命令创建并启动容器。
  • Docker 引擎创建一对虚拟接口 veth pair,并把它们分别放到宿主机和新容器的网络命名空间中。
  • Docker 引擎将宿主机上的 veth 接口连接到宿主机的 docker0 网桥上,并且给它分配一个以 “  veth” 开头的名字,如 veth92dc1bc。
  • Docker 引擎将容器上的 veth 接口改名为 “eth0” ,并且该接口只有在容器内网络命名空间中时可见的。
  • Docker 引擎从宿主机的 docker0 网桥上分配一个空闲的 IP 地址给容器内的 eth0 ,例如:172.17.0.2。并将容器内 eth0 的路由网关设置为 docker0 的内部 IP 地址,例如:172.17.0.1。

      完成上述步骤后,容器就可以使用其内部的虚拟接口 "eth0" 来连接到其它的容器和访问外部的网络了。

###启动一个httpd容器。
root@docker:~# docker run -d  -p 80:80 httpd
65fb138571d46f71603bad7ced1689b0355001fd1cbfea09ee86b841752fcf14
root@docker:~# docker ps
CONTAINER ID   IMAGE     COMMAND              CREATED         STATUS         PORTS                               NAMES
65fb138571d4   httpd     "httpd-foreground"   4 seconds ago   Up 2 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   strange_banzai

###查看宿主机网卡,多了一个veth开头的设备。
root@docker:~# ifconfig 
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:a9ff:fe70:a0a6  prefixlen 64  scopeid 0x20<link>
        ether 02:42:a9:70:a0:a6  txqueuelen 0  (Ethernet)
        RX packets 67687  bytes 2805575 (2.8 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 88138  bytes 188341450 (188.3 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.128  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::20c:29ff:fe1f:47c7  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:1f:47:c7  txqueuelen 1000  (Ethernet)
        RX packets 1228433  bytes 1662216674 (1.6 GB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 324203  bytes 23973244 (23.9 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 818  bytes 84854 (84.8 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 818  bytes 84854 (84.8 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

veth92dc1bc: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::e811:68ff:feaa:fb05  prefixlen 64  scopeid 0x20<link>
        ether ea:11:68:aa:fb:05  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 9  bytes 806 (806.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

###进入容器,并更新镜像源。
root@docker:~# docker exec -it 65fb138571d4 bash
root@65fb138571d4:/usr/local/apache2# cat <<'EOF' > /etc/apt/sources.list
deb http://mirrors.cernet.edu.cn/debian/ bullseye main contrib non-free
deb http://mirrors.cernet.edu.cn/debian/ bullseye-updates main contrib non-free
deb http://mirrors.cernet.edu.cn/debian/ bullseye-backports main contrib non-free
deb http://security.debian.org/debian-security bullseye-security main contrib non-free
EOF

###安装net-tools
root@65fb138571d4:/usr/local/apache2# apt update 
...
root@65fb138571d4:/usr/local/apache2# apt install -y net-tools
...

###查看容器网卡信息。
root@65fb138571d4:/usr/local/apache2# ifconfig 
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 3197  bytes 9848735 (9.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2549  bytes 145109 (141.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

二、Docker 网络驱动

      Docker 拥有多种网络驱动程序,以提供核心网络功能。

  • bridge

      默认网络驱动程序,如未指定驱动程序,使用此网络类型。主要用于同一宿主机上不同容器之间的通信。

  • host

      对于独立容器,移除容器和 Docker 主机之间的网络隔离,并直接使用宿主机的网络。

  • none

      容器禁用所有网络,不能与外部通信。none 网络没有办法联网,封闭的网络能很好的保证容器的安全性。

  • overlay

      overlay 网络将多个 Docker 守护进程连接在一起,并使 swarm 服务能够相互通信。还可以使用 overlay网络促进 swarm 服务和独立容器之间的通信,或者在不同 Docker 守护进程上的两个独立容器之间的通信,实现跨主机通信。

  • macvlan

      macvlan 允许将 MAC 地址分配给容器,使其显示为网络上的物理设备。Docker 守护进程通过容器的 MAC 地址将流量路由到容器。有时使用 macvlan 驱动程序是最佳选择,比如在处理遗留应用程序时,希望直接连接到物理网络而不是通过 Docker 主机的网络堆栈路由。

  • Network plugins

      可以在 Docker 中安装第三方网络插件,这些插件可以从 Docker Hub 或第三方获得。

三、Docker 网络管理命令

        使用 docker network --help 命令,可以查看 docker 网络相关的命令。

root@docker:~# docker network --help

Usage:  docker network COMMAND

Manage networks

Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks

Run 'docker network COMMAND --help' for more information on a command.
  • docker network ls   查看已建立的网络对象。

    常用命令参数:-f,过滤条件,如"driver=bridge"。

                             -q,只回显网络对象的ID。

        安装好 Docker 后,默认会自动创建三个网络,可以使用命令查看。

###查看默认网络。
root@docker:~# docker  network ls
NETWORK ID     NAME      DRIVER    SCOPE
dc322c5dd3bc   bridge    bridge    local
b1e9477f6959   host      host      local
1fbd8be30335   none      null      local

###查看桥接网络。
root@docker:~# docker network ls -f "driver=bridge"
NETWORK ID     NAME      DRIVER    SCOPE
dc322c5dd3bc   bridge    bridge    local

###查看桥接网络的ID。
root@docker:~# docker network ls -qf "driver=bridge"
dc322c5dd3bc
  •  docker network inspect   查看网络详细信息。 
###查看默认bridge网络详细信息。
root@docker:/docker# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "d91e497829267345e0d5ad9cd85f51e5ce25d736455cee57db62d3b0d8ea73c1",
        "Created": "2023-02-22T16:04:44.832948002Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "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"
        },
        "Labels": {}
    }
]
  • docker network create   创建新网络对象。

    常用命令参数:-d,指定网络驱动(默认是"bridge")。

                             --subnet,指定子网网段。

                             --ip-range,指定容器的IP范围。

                             --gateway,指定子网网关。

###创建一个桥接网络,指定子网、IP范围和网关。
root@docker:/docker# docker network create --driver=bridge --subnet=192.168.0.0/16 --ip-range=192.168.100.0/24 --gateway=192.168.100.254 mybridge
e6fd1c4250936fb20cb3726c07fe0fbcddd762fb3839526e13fa25bcacac98d2

###查看创建的网络。
root@docker:/docker# docker network ls
NETWORK ID     NAME       DRIVER    SCOPE
d91e49782926   bridge     bridge    local
b1e9477f6959   host       host      local
e6fd1c425093   mybridge   bridge    local
1fbd8be30335   none       null      local
  • docker run --network 运行容器时指定网络。
###使用创建的mybridge网络运行一个httpd容器。
root@docker:/docker# docker run -d --name httpd -p 80:80 --net mybridge httpd
22fcd650fef5ab06f62cb78335234cb6333b0f0ff9026af73441e2130cfda1a4

root@docker:/docker# docker ps
CONTAINER ID   IMAGE     COMMAND              CREATED         STATUS         PORTS                               NAMES
22fcd650fef5   httpd     "httpd-foreground"   4 seconds ago   Up 2 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   httpd

###查看容器ip地址。
root@docker:/docker# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' httpd
192.168.100.0

###使用容器地址访问服务测试。
root@docker:/docker# curl http://192.168.100.0
<html><body><h1>It works!</h1></body></html>
  •  docker network rm   删除网络,需要先将使用该网络创建的容器停止并删除。
###直接删除网络,有报错。
root@docker:/docker# docker network rm mybridge
Error response from daemon: error while removing network: network mybridge id 0c21cd98605cd4e36e59b3af6cd5390c2c05f42cfa2668eaefb383ad0026db8b has active endpoints

###停止并删除使用该网络创建的容器。
root@docker:/docker# docker stop httpd
httpd
root@docker:/docker# docker rm httpd
httpd

###再次删除网络,成功。
root@docker:/docker# docker network rm mybridge
mybridge

root@docker:/docker# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
d91e49782926   bridge    bridge    local
b1e9477f6959   host      host      local
1fbd8be30335   none      null      local

四、Docker 的四种网络模式

1、bridge模式

       bridge 模式是 Docker 默认的网络通信模式,是开发者最常使用的模式。在 bridge 模式下,Docker引擎会创建独立的网络命名空间,这样就保证运行在每一个命名空间中的容器具有独立的网卡等网络资源。

       利用 bridge 模式,可以非常方便地实现容器与容器之间、容器与宿主机之间的网络隔离。通过使用宿主机上的 docker0 网桥,可以实现 Docker 容器与宿主机乃至外部网络的网络通信。宿主机和宿主机上的其他容器可以通过容器 IP 访问容器中的服务,外部无法直接访问容器,需要建立容器与宿主机之间的端口映射,通过宿主机映射的端口才能访问容器中的服务。

###创建一个自定义bridge网络,并查看创建的网络。
root@docker:~# docker network create --driver=bridge --subnet=192.168.0.0/16 --ip-range=192.168.100.0/24 --gateway=192.168.100.254 mybridge
1ce3edb49bf147d7c8e815be15015c1340a8db671fb1a63e3f080b1d8486a1ae
root@docker:~# docker network ls
NETWORK ID     NAME       DRIVER    SCOPE
544b79483258   bridge     bridge    local
b1e9477f6959   host       host      local
1ce3edb49bf1   mybridge   bridge    local
1fbd8be30335   none       null      local

###使用自定义mybridge网络创建一个容器,并通过--ip参数指定容器IP地址。
root@docker:~# docker run -d -p 80:80 --network=mybridge --ip=192.168.100.10 httpd
c7ee9141d7a3e4b5ddbf0e30072ef9ec9b31a5b00d0f2138b6e776c75e15417a
root@docker:~# docker ps
CONTAINER ID   IMAGE     COMMAND              CREATED          STATUS          PORTS                               NAMES
c7ee9141d7a3   httpd     "httpd-foreground"   21 seconds ago   Up 19 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   sweet_margulis

###进入容器,安装net-tools(更新软件源和安装操作,参考第一章节),查看容器网卡信息。
root@c7ee9141d7a3:/usr/local/apache2# ifconfig 
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.100.10  netmask 255.255.0.0  broadcast 192.168.255.255
        ether 02:42:c0:a8:64:0a  txqueuelen 0  (Ethernet)
        RX packets 1349  bytes 9606339 (9.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1182  bytes 67993 (66.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 10  bytes 924 (924.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 10  bytes 924 (924.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

###宿主机上通过容器IP地址,访问httpd服务测试。
root@docker:~# curl http://192.168.100.10
<html><body><h1>It works!</h1></body></html>

###再启动一个centos的容器,指定mybridge网络,地址为192.168.100.20.
root@docker:~# docker run -itd --network=mybridge --ip=192.168.100.20 centos
c544e04dec4740fb72dff1de9e873f6a135294c2f84c817ef9a0885d30167199

###进入centos的容器,查看IP地址,访问httpd的容器测试。
root@docker:~# docker exec -it c54 bash
[root@c544e04dec47 /]# 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
165: eth0@if166: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:c0:a8:64:14 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.100.20/16 brd 192.168.255.255 scope global eth0
       valid_lft forever preferred_lft forever
[root@c544e04dec47 /]# curl http://192.168.100.10
<html><body><h1>It works!</h1></body></html>

###外部网络通过宿主机及映射端口访问httpd容器服务。
root@docker:~# curl http://192.168.1.128:80
<html><body><h1>It works!</h1></body></html>

2、host模式

       在使用 host 模式时,容器与宿主机共享同一个网络命名空间,容器IP地址和宿主机IP地址相同。如果宿主机具有公网的 IP 地址,则容器也拥有这个公网的 IP 地址。即容器可以直接使用宿主机的 IP 地址与外界进行通信,且容器内服务的端口也可以直接使用宿主机的端口。

###停止和删除前面启动的容器,使用host模式创建容器。
root@docker:~# docker stop c7ee
c7ee
root@docker:~# docker rm c7ee
c7ee
root@docker:~# docker run -d --network=host httpd
87077f55e08c8aa6613aeea23b3b4138713a3c2bb87c6b2dc4fcb2dee44c3264

###因为是host模式,在宿主机上可以直接用127.0.0.1访问服务。
root@docker:~# curl http://127.0.0.1
<html><body><h1>It works!</h1></body></html>

###查看宿主机和容器的网卡信息,因为是共享,所以信息是一致的。

##宿主机网卡信息:
root@docker:~# ifconfig
br-1ce3edb49bf1: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.100.254  netmask 255.255.0.0  broadcast 192.168.255.255
        inet6 fe80::42:2cff:fea2:4764  prefixlen 64  scopeid 0x20<link>
        ether 02:42:2c:a2:47:64  txqueuelen 0  (Ethernet)
        RX packets 1363  bytes 58987 (58.9 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1566  bytes 9618192 (9.6 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:a9ff:fe70:a0a6  prefixlen 64  scopeid 0x20<link>
        ether 02:42:a9:70:a0:a6  txqueuelen 0  (Ethernet)
        RX packets 70236  bytes 2914998 (2.9 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 91308  bytes 198188119 (198.1 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.128  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::20c:29ff:fe1f:47c7  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:1f:47:c7  txqueuelen 1000  (Ethernet)
        RX packets 1891509  bytes 2609128548 (2.6 GB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 419618  bytes 31516751 (31.5 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 1010  bytes 106807 (106.8 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1010  bytes 106807 (106.8 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

##容器网卡信息:
root@docker:/usr/local/apache2# ifconfig
br-1ce3edb49bf1: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.100.254  netmask 255.255.0.0  broadcast 192.168.255.255
        inet6 fe80::42:2cff:fea2:4764  prefixlen 64  scopeid 0x20<link>
        ether 02:42:2c:a2:47:64  txqueuelen 0  (Ethernet)
        RX packets 1363  bytes 58987 (57.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1566  bytes 9618192 (9.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:a9ff:fe70:a0a6  prefixlen 64  scopeid 0x20<link>
        ether 02:42:a9:70:a0:a6  txqueuelen 0  (Ethernet)
        RX packets 70236  bytes 2914998 (2.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 91308  bytes 198188119 (189.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.128  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::20c:29ff:fe1f:47c7  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:1f:47:c7  txqueuelen 1000  (Ethernet)
        RX packets 1898593  bytes 2619049663 (2.4 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 421389  bytes 31648476 (30.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 1010  bytes 106807 (104.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1010  bytes 106807 (104.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

       使用 host 模式,尽管可以很方便地通过 localhost 或者 127.0.0.1 实现容器与宿主机的相互访问,并且性能也比较好,但这种模式也存在以下问题:

  • 由于容器使用了宿主机的网络环境,因此网络环境的隔离性功能被减弱,从而造成宿主机和容器争用网络资源。容器本身也不再拥有所有的网络资源,而是与宿主机共享网络资源。
  • 宿主机和容器使用了相同的 IP 地址,这不利于网络的配置和管理。

3、none模式

       none 模式下的容器具有独立的网络命名空间,但不包含任何网络配置,只有 lo 回环网络,无法与外界进行通信,封闭的网络能很好地保证容器的安全性。

###使用none模式运行一个centos容器。
root@docker:~# docker run -itd --network=none centos
bf01798c9107579b1593a08666f8d7db344f2029eb7b8f0160a62b8794c56408

###进入容器查看网卡信息,只有一个lo网卡。
root@docker:~# docker exec -it bf0 bash
[root@bf01798c9107 /]# 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

4、container模式

      在 container 模式下,容器之间会共享网络环境,即一个容器会使用另一个容器的网络命名空间。因此,在这种模式下,容器之间可以通过 localhost 或者 127.0.0.1 进行相互间的访问,从而提高了传输的效率。

###停止和删除前面运行的容器。
略。
###先运行一个容器,并查看容器网络信息。
root@docker:~# docker run -d -p 80:80 httpd
29a3d9a721bac8246d32225517573a12bc21601e032a40bcbecd8f8ba81fb85e
root@docker:~# docker exec -it 29a bash
root@29a3d9a721ba:/usr/local/apache2# cat <<'EOF' > /etc/apt/sources.list
deb http://mirrors.cernet.edu.cn/debian/ bullseye main contrib non-free
deb http://mirrors.cernet.edu.cn/debian/ bullseye-updates main contrib non-free
deb http://mirrors.cernet.edu.cn/debian/ bullseye-backports main contrib non-free
deb http://security.debian.org/debian-security bullseye-security main contrib non-free
EOF
root@29a3d9a721ba:/usr/local/apache2# apt update
...略
root@29a3d9a721ba:/usr/local/apache2# apt install -y net-tools
...略
root@29a3d9a721ba:/usr/local/apache2# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 3060  bytes 9698793 (9.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2759  bytes 153096 (149.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

###使用container模式运行一个centos容器,并查看网络信息。
root@docker:~# docker ps
CONTAINER ID   IMAGE     COMMAND              CREATED         STATUS         PORTS                               NAMES
29a3d9a721ba   httpd     "httpd-foreground"   5 minutes ago   Up 5 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp   hardcore_wiles

root@docker:~# docker run -itd --network=container:29a3d9a721ba centos
1349a56e8cc5753ea8603d26aaf5102483f0438cc6408585c312f98291588e92

root@docker:~# docker exec -it 134 bash
[root@29a3d9a721ba /]# yum install -y net-tools
...略
[root@29a3d9a721ba /]# ifconfig 
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 3167  bytes 10048964 (9.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2867  bytes 160055 (156.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

###两个容器网络信息完全相同,在centos容器中,可以使用127.0.0.1访问httpd容器服务。
[root@29a3d9a721ba /]# curl http://127.0.0.1
<html><body><h1>It works!</h1></body></html>

总结

  以上就是今天学习了解的容器网络相关的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AtobeKegio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值