IT评测·应用市场-qidao123.com

标题: Docker的网络管理 [打印本页]

作者: 美丽的神话    时间: 2024-6-2 22:46
标题: Docker的网络管理
目录

一、Docker容器之间的通信

1、直接互联(默认Bridge网络)

1.1、Docker安装后默认的网络配置

Docker服务安装完成之后,默认在每个宿主机会生成一个名称为docker0的网卡其IP地址都是 172.17.0.1/16。
  1. ip a | grep docker0
复制代码

1.2、创建容器后的网络配置

1.2.1、首先创建一个容器
  1. [root@localhost ~]# docker run -itd --name nginx_v1 -p 8081:80 nginx
复制代码
1.2.2、ip a 列出网卡变革信息
  1. [root@localhost ~]# ip a
  2. ...
  3. 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
  4.     link/ether 02:42:77:03:57:c7 brd ff:ff:ff:ff:ff:ff
  5.     inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
  6.        valid_lft forever preferred_lft forever
  7.     inet6 fe80::42:77ff:fe03:57c7/64 scope link
  8.        valid_lft forever preferred_lft forever
  9. 5: veth6ce240e@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
  10.     link/ether aa:8b:8e:1b:35:93 brd ff:ff:ff:ff:ff:ff link-netnsid 0
  11.     inet6 fe80::a88b:8eff:fe1b:3593/64 scope link
  12.        valid_lft forever preferred_lft forever
复制代码

1.2.3、检察新建容器后的桥接状态
  1. [root@localhost ~]# brctl show
  2. bridge name     bridge id               STP enabled     interfaces
  3. docker0         8000.0242770357c7       no              veth6ce240e
复制代码
1.3、容器内安装常见的工具

ping、 nslookup、 ifconfig、 ip、 curl
监督体系状态和管理进程的工具集合
  1. apt install inetutils-ping -y
  2. apt install dnsutils -y
  3. apt install net-tools -y
  4. apt install iproute2 -y
  5. apt install curl -y
  6. apt install procps -y
复制代码
1.4、容器间通信

默认情况下,同一个宿主机的不同容器之间可以相互通信。
不同宿主机之间的容器IP地址重复,默认不能相互通信。
在docker.service配置文件中的fd://背面添加--icc=false 选项可以禁止同一个宿主机的不同容器间通信。

  1. [root@localhost ~]# docker run -itd --name nginx_v2 -p 8082:80 nginx
  2. 5e088a915221aef79d369bba6d76961598ea341222ae1c20d0cb1b8a0e1147f0
复制代码
2、容器名称互联

2.1、原理

2.2、指令格式
  1. docker run --name        #先创建指定名称的容器
  2. docker run --link        #再创建容器时引用上面容器的名称
复制代码
2.3、创建新的容器并引用已创建的容器
  1. [root@localhost ~]# docker run -itd --name nginx_test1 --link nginx_v1 -p 8083:80 nginx
  2. eb9b74839c4c5e493df5fbfa5b0482cbc984e70a7ac7addcd9b01cce792d9449
复制代码
2.4、进入容器检察/etc/hosts文件
  1. [root@localhost ~]# docker exec -it nginx_test1 /bin/bash
  2. root@eb9b74839c4c:/# cat /etc/hosts
  3. 127.0.0.1       localhost
  4. ::1     localhost ip6-localhost ip6-loopback
  5. fe00::0 ip6-localnet
  6. ff00::0 ip6-mcastprefix
  7. ff02::1 ip6-allnodes
  8. ff02::2 ip6-allrouters
  9. 172.17.0.2      nginx_v1 cf9fc9d97972
  10. 172.17.0.4      eb9b74839c4c
复制代码
2.5、使用容器名称相互通信
  1. root@eb9b74839c4c:/# ping nginx_v1 -c 2
  2. PING nginx_v1 (172.17.0.2): 56 data bytes
  3. 64 bytes from 172.17.0.2: icmp_seq=0 ttl=64 time=0.064 ms
  4. 64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.077 ms
  5. --- nginx_v1 ping statistics ---
  6. 2 packets transmitted, 2 packets received, 0% packet loss
  7. round-trip min/avg/max/stddev = 0.064/0.071/0.077/0.000 ms
复制代码
3、自定义容器别名互联

自定义的容器名称可能后期会发生变革,那么一旦发生变革也会带来一些影响,这个时候假如每次都更改名称又比较麻烦
这个时候可以使用定义别名的方式解决,即容器名称可以随意更改,只要不更改别名即可。
3.1、指令格式
  1. #先创建指定名称的容器
  2. docker run --name <容器名称>
  3. docker run --name <容器名称> --link <目标容器名称>:"<容器别名1> <容器别名2> ..."
复制代码
3.2、起别名的形式创建一个新的容器
  1. [root@localhost ~]# docker run -itd --name nginx_test2 -p 8084:80 --link nginx_v2:nginx_v2_alias nginx
  2. 3382790d21e3224c50799e907b229185fb5ab37140b51cc6ab4536e19c00dabd
复制代码

3.3、使用别名相互通信
  1. docker exec -it nginx_test2 ping -c 2 nginx_v2_alias
复制代码

4、自定义网络

4.1、创建自定义网络
  1. [root@localhost ~]# docker network create my_network
  2. 0c93f493d62d5791febeb088048f85874e9ae2bc9266bb84f88f4864ad379d46
  3. [root@localhost ~]# docker network ls
  4. NETWORK ID     NAME         DRIVER    SCOPE
  5. 4d478ce25a22   bridge       bridge    local
  6. 738397fc865f   host         host      local
  7. 0c93f493d62d   my_network   bridge    local
  8. 75326f81366f   none         null      local
复制代码
当我们创建了一个自定义网络(my_network)Docker 会创建一个新的桥接网络(bridge driver)。
其底层技能仍然是基于桥接网络实现的,即每个毗连到此自定义网络的容器都会得到一个虚拟网卡,并通过Docker管理的一个虚拟网桥(类似于默认的bridge网络所使用的网桥)与其他容器以及宿主机进行通信。
4.2、启动两个容器并毗连到自定义网络
  1. [root@localhost ~]# docker run -itd --name nginx_network3 --network my_network nginx
  2. c98ca358f48e945a9d6b9f4d0c54e562cbbf1aef58e2a265bf2f40296cecb923
  3. [root@localhost ~]# docker run -itd --name nginx_network4 --network my_network nginx
  4. c0e09ba99d47652eb4755b7d4e5c1c676fd1f7e4a52a93a55865475c001ae0ea
复制代码
4.3、自定义网络进行容器间通信
  1. [root@localhost ~]# docker exec nginx_network3 ping -c 2 nginx_network4
复制代码

5、Host网络模式

5.1、启动使用Host网络模式的容器

使用Host网络模式,容器直接使用宿主机的网络栈
host 网络模式下,容器直接使用宿主机的网络栈,没有独立的网络命名空间,因此容器内部的服务就直接监听在宿主机的网络接口上,不再须要端口映射。
  1. [root@localhost ~]# docker run -itd --name nginx_host -p 8086:80 --network host nginx
复制代码

可以看到Docker是会忽略--network host模式启动容器时指定的端口映射的
5.2、使用Host网络模式进行通信

此时其他容器就可以通过宿主机的ip和端口进行访问
  1. docker exec -it nginx_v1 ping -c 2 192.168.112.60
复制代码

6、端口映射

6.1、启动带有端口映射的容器

这里的镜像mycentos_nginx:v1用的是之前Docker制作镜像中的使用DockerFile制作的nginx镜像
  1. [root@localhost ~]# docker run -itd --name nginx_port -p 8090:80 mycentos_nginx:v1
复制代码
6.2、其他容器访问
  1. [root@localhost ~]# docker exec -it nginx_v3 curl -s 192.168.112.60:8090
  2. #发现可以获取到之前定义的index.html文件内容
复制代码

二、Docker的网络模式

1、检察默认的网络模式
  1. [root@localhost ~]# docker network ls
复制代码

默认会生成三种不同的网络
bridge 、host 、null
2、常见的五种网络模式

Docker网络模式配置说明bridge模式–net=bridge(默认)为每个容器分配独立的网络命名空间和IP地址,通过Docker虚拟网桥(docker0)与宿主机及别的容器通信。host模式–net=host容器直接使用宿主机的网络命名空间,无独立IP,容器和服务直接通过宿主机的网络接口和端口暴露。none模式–net=none容器仅有lo(回环)接口,无网络配置,实用于不须要网络的场景。container模式–net=container:NAME_or_ID新容器共享指定容器的网络命名空间,包括IP地址和端口范围,实用于紧密网络耦合的场景。User-defined(用户自定义)docker network create      --net=创建自定义网络,可以配置网络驱动、子网、IP范围等,提供更机动的网络控制,实用于微服务架构等复杂网络需求。3、Bridge网络模式

3.1、Bridge网络模式的架构


3.2、工作原理

1、创建虚拟网桥

2、IP地址分配与默认网关设置

3、veth Pair设备与网络接入

4、网络命名空间隔离

5、与外部网络之间的通信(SNAT)

6、被外部主机访问(DNAT)

7、ip_forward功能

3.3、Bridge网络模式的特点

3.4、修改bridge网络的默认网段

有两种方式可以修改bridge网络的默认网段,但是两种只能选择一种,否则docker服务无法启动
3.4.1、修改docker.service文件

修改配置文件前记得备份,前面跟着做的就不须要重复备份了
  1. [root@localhost ~]# vim /usr/lib/systemd/system/docker.service
  2. ...
  3. ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --bip=172.10.0.1/16
  4. ...
  5. #修改为172.10网段
  6. [root@localhost ~]# systemctl daemon-reload && systemctl restart docker
复制代码
  1. [root@localhost ~]# docker run -itd --name nginx_v4 -p 8091:80 mycentos_nginx:v1
  2. [root@localhost ~]# docker run -itd --name nginx_v5 -p 8092:80 mycentos_nginx:v1
  3. #创建两个容器来验证网段是否修改
  4. [root@localhost ~]# docker inspect nginx_v4 --format='{{json .NetworkSettings.IPAddress}}'
  5. "172.10.0.2"
  6. [root@localhost ~]# docker inspect nginx_v5 --format='{{json .NetworkSettings.IPAddress}}'
  7. "172.10.0.3"
  8. #可以看到再创建的容器分配到的ip地址就是172.10网段的ip,且从172.10.0.2往后顺延
复制代码
3.4.2、修改daemon.json文件

没有这个文件的是没有开启镜像加速功能
阿里云镜像加速 -> 容器镜像服务 -> 镜像工具 -> 镜像加速器 依据操作文档添加
  1. [root@localhost docker]# cat /etc/docker/daemon.json
  2. {
  3.   "registry-mirrors": ["https://jzjzrggd.mirror.aliyuncs.com"],
  4.   "bip": "172.72.0.1/16",
  5.   "dns": ["8.8.8.8"]
  6. }
  7. #这里我将默认网段修改为172.72
  8. [root@localhost docker]# systemctl daemon-reload && systemctl restart docker
复制代码
  1. [root@localhost ~]# docker run -itd --name nginx_v6 -p 8093:80 mycentos_nginx:v1
  2. 0dba43ccae42824f0c3bbd80617de2c2685dc8c9a6120c416047b43fe4f90cdd
  3. [root@localhost ~]# docker run -itd --name nginx_v7 -p 8094:80 mycentos_nginx:v1
  4. 2fa22556636d2d223bfe0ca8a0d961dd8f88671fb018b4095f1a86d02c9babe7
  5. #创建两个容器来验证网段是否修改
  6. [root@localhost ~]# docker exec -it nginx_v6 hostname -i
  7. 172.72.0.2
  8. [root@localhost ~]# docker exec -it nginx_v7 hostname -i
  9. 172.72.0.3
  10. #可以看到再创建的容器分配到的ip地址就是172.72网段的ip,且从172.72.0.2往后顺延
复制代码

注意:由于之前示例的容器均没有固定ip以及设置随docker自启以是以上操作会导致用于示例的容器都是Exited (0)状态,而且重启容器后ip地址也会从新设置的网段开始分配
4、Host网络模式

4.1、Host网络模式的架构


4.2、工作原理

4.3、Host 网络模式的特点

4.4、示例

4.4.1、创建一个host网络模式的nginx容器
  1. [root@localhost ~]# docker run -itd --name nginx_v8 --network host mycentos_nginx:v1
  2. 0d61e812c6c82d86b87fe89649c3c99768c9a2b794c81ecf902fdace092cc331
  3. [root@localhost ~]# ss -tnl | grep 80
  4. #可以看到宿主机的80端口打开
复制代码

4.4.2、再创建一个host网络模式的nginx容器
  1. [root@localhost ~]# docker run -itd --name nginx_v9 --network host -p 8095:80 mycentos_nginx:v1
复制代码

可以看到再创建nginx容器就会出现端口冲突的情况
也无法使用端口映射,由于是公用宿主机的80端口
5、none网络模式

5.1、none网络模式架构


5.2、工作原理

1. 网络命名空间隔离解除

在None模式下,虽然容器仍然有自己的网络命名空间,但这个命名空间内几乎为空,Docker不会为容器配置任何网络接口、IP地址或路由规则。这意味着容器没有网络毗连能力,既不能访问宿主机网络,也不能与其他容器通信。
2. 仅有的网络接口:loopback

在None模式下启动的容器,内部通常只包含回环接口(lo),即localhost,用于容器内部的进程间通信。这意味着容器内的服务只能通过localhost地址相互访问,但无法与宿主机或外部网络通信。
3. 手动网络配置

虽然None模式下的容器没有默认的网络配置,但用户可以根据须要手动配置网络。这意味着可以使用ip命令或相干脚本为容器内的网络接口添加IP地址、配置路由规则等,使其能够毗连到特定网络。这通常涉及创建虚拟以太网对(veth pairs)并将其中一端放入容器,然后手动配置网络参数。
5.3、none网络模式的特点

5.4、示例

5.4.1、创建一个none网络模式的容器
  1. [root@localhost ~]# docker run -itd --name nginx_v10 -p 8096:80 --network none mycentos_nginx:v1
复制代码
5.4.2、进入容器,检察网络接口信息并测试通信能力
  1. [root@localhost ~]# docker exec -it nginx_v10 bash
  2. [root@49d500bcbc3a /]# ip a
  3. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  4.     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  5.     inet 127.0.0.1/8 scope host lo
  6.        valid_lft forever preferred_lft forever
  7.     inet6 ::1/128 scope host
  8.        valid_lft forever preferred_lft forever
  9. [root@49d500bcbc3a /]# ping www.baidu.com
  10. ping: www.baidu.com: Name or service not known
  11. [root@49d500bcbc3a /]# ping 172.17.0.1
  12. connect: Network is unreachable
  13. #可以看到网络接口信息只有lo接口,无法与外部通信
复制代码

6、Container网络模式

6.1、Container网络模式架构


6.2、工作原理

1. 共享网络命名空间

2. 网络接口和IP地址

3. 端口冲突

4. 通信方式

6.3、Container网络模式的特点

6.4、示例

6.4.1、创建一个nginx容器
  1. [root@localhost ~]# docker run -itd --name nginx_v11 -p 8098:80 mycentos_nginx:v1        06810ca19da88562cd539f7bd9dff8b8030bc64628760e28f8f4204ced5135b3
复制代码
6.4.2、创建一个新的container容器共享nginx的网络情况
  1. [root@localhost ~]# docker run -itd --name container_v1 --network container:nginx_v11 centos:7
复制代码
6.4.3、检察两个容器的ip地址
  1. [root@localhost ~]# docker exec -it nginx_v11 hostname -i                                
  2. 172.72.0.10
  3. [root@localhost ~]# docker exec -it container_v1 hostname -i
  4. 172.72.0.10
复制代码

7、自定义网络模式

7.1、工作原理

7.2、自定义网络的特点

7.3、语法

7.3.1、语法格式
  1. docker network COMMAND
  2. docker network create -d <mode> --subnet <CIDR> --gateway <网关> <自定义网络名称>
复制代码
mode不支持host和none,默认是bridge模式
7.3.2、命令
  1. Commands:
  2. • connect 将容器连接到网络
  3. • create  创建网络
  4. • disconnect断开容器与网络的连接
  5. • inspect 显示一个或多个网络的详细信息
  6. • ls 列出网络列表
  7. • prune 删除所有未使用的网络
  8. • rm 删除一个或多个网络
复制代码
7.3.3、选项参数
  1. [options]
  2. --driver 或 -d: 指定网络的驱动类型。默认是 bridge,但也可以是 overlay、macvlan、ipvlan 等。例如,创建一个 overlay 网络:--driver overlay。
  3. --subnet: 指定网络的子网。可以多次指定以创建多个子网。例如,--subnet=172.16.23.0/24。
  4. --gateway: 设置网络的默认网关地址。例如,--gateway=172.16.23.1。
  5. --ip-range: 限制Docker从指定的子网范围内分配IP地址给容器。这对于大型网络很有用。
  6. --opt: 传递特定于驱动程序的选项。例如,对于 overlay 驱动,可以设置 --opt encrypted 来加密网络通信。
  7. --internal: 将网络配置为内部网络,意味着外部流量不能到达此网络上的容器。
  8. --attachable: 允许后续的容器即使在创建网络时没有指定也能连接到这个网络。
  9. --label: 添加元数据标签到网络,用于过滤和识别。格式为 key=value。
  10. --scope: 设置网络的作用域,通常是 local(单个Docker主机)或 global(Swarm模式下)。默认为 local。
  11. --ingress: (Swarm模式特有)创建一个特殊的Ingress网络,用于Swarm服务的外部流量路由。
复制代码
7.4、示例

7.4.1、创建自定义网络
  1. [root@localhost ~]# docker network create -d bridge --subnet 172.172.0.0/16 --gateway 172.172.0.1 net-test
  2. [root@localhost ~]# docker network ls
  3. NETWORK ID     NAME         DRIVER    SCOPE
  4. 3593c2126bf2   bridge       bridge    local
  5. 738397fc865f   host         host      local
  6. 0c93f493d62d   my_network   bridge    local
  7. 8f95cd5b3ac0   net-test     bridge    local
  8. 75326f81366f   none         null      local
复制代码
此时会新添加一个虚拟网卡和网桥

用brctl show检察新的虚拟网卡对应的interfaces显示为空。

7.4.2、使用自定义网络创建容器
  1. [root@localhost ~]# docker run -itd --name nginx_v13 --network net-test -p 8099:80  mycentos_nginx:v1
  2. a9e35a0b3d86caeef38501c5c45c62d753ac31e650f231e2bd41d4c34b03ed4c
复制代码
7.4.3、检察容器的ip地址及对应的index.html文件内容
  1. [root@localhost ~]# docker exec -it nginx_v13 hostname -i
  2. 172.172.0.2
  3. [root@localhost ~]# curl 172.172.0.2
  4. test nginx !
  5. [root@localhost ~]# docker exec -it nginx_v13 cat /usr/local/nginx/html/index.html
  6. test nginx !
复制代码
7.4.4、检察网络
  1. [root@a9e35a0b3d86 /]# ifconfig
  2. eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
  3.         inet 172.172.0.2  netmask 255.255.0.0  broadcast 172.172.255.255
  4.         ether 02:42:ac:ac:00:02  txqueuelen 0  (Ethernet)
  5.         RX packets 17  bytes 1285 (1.2 KiB)
  6.         RX errors 0  dropped 0  overruns 0  frame 0
  7.         TX packets 7  bytes 670 (670.0 B)
  8.         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  9. lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
  10.         inet 127.0.0.1  netmask 255.0.0.0
  11.         inet6 ::1  prefixlen 128  scopeid 0x10<host>
  12.         loop  txqueuelen 1000  (Local Loopback)
  13.         RX packets 0  bytes 0 (0.0 B)
  14.         RX errors 0  dropped 0  overruns 0  frame 0
  15.         TX packets 0  bytes 0 (0.0 B)
  16.         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
复制代码
7.4.5、自定义网络中容器的通信
  1. [root@a9e35a0b3d86 /]# ping -c 2 www.baidu.com
  2. PING www.a.shifen.com (180.101.50.188) 56(84) bytes of data.
  3. 64 bytes from 180.101.50.188 (180.101.50.188): icmp_seq=1 ttl=127 time=8.85 ms
  4. 64 bytes from 180.101.50.188 (180.101.50.188): icmp_seq=2 ttl=127 time=8.53 ms
  5. --- www.a.shifen.com ping statistics ---
  6. 2 packets transmitted, 2 received, 0% packet loss, time 1000ms
  7. rtt min/avg/max/mdev = 8.535/8.694/8.854/0.184 ms
复制代码

7.4.6、检察iptables相应的规则
  1. [root@localhost ~]# iptables -t nat -nvL
复制代码

PREROUTING 和 OUTPUT 链中的DOCKER规则
POSTROUTING 链中的MASQUERADE规则
DOCKER链中的规则

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4