网站 只做程序员,sae wordpress,做网络销售怎么建立网站,酷家乐必须先学cad吗文章目录 一、Docker容器之间的通信1、直接互联#xff08;默认Bridge网络#xff09;1.1、Docker安装后默认的网络配置1.2、创建容器后的网络配置1.2.1、首先创建一个容器1.2.2、ip a 列出网卡变化信息1.2.3、查看新建容器后的桥接状态 1.3、容器内安装常见的工具1.4、容器间… 文章目录 一、Docker容器之间的通信1、直接互联默认Bridge网络1.1、Docker安装后默认的网络配置1.2、创建容器后的网络配置1.2.1、首先创建一个容器1.2.2、ip a 列出网卡变化信息1.2.3、查看新建容器后的桥接状态 1.3、容器内安装常见的工具1.4、容器间通信 2、容器名称互联2.1、原理2.2、指令格式2.3、创建新的容器并引用已创建的容器2.4、进入容器查看/etc/hosts文件2.5、使用容器名称互相通信 3、自定义容器别名互联3.1、指令格式3.2、起别名的形式创建一个新的容器3.3、使用别名互相通信 4、自定义网络4.1、创建自定义网络4.2、启动两个容器并连接到自定义网络4.3、自定义网络进行容器间通信 5、Host网络模式5.1、启动使用Host网络模式的容器5.2、使用Host网络模式进行通信 6、端口映射6.1、启动带有端口映射的容器6.2、其他容器访问 二、Docker的网络模式1、查看默认的网络模式2、常见的五种网络模式3、Bridge网络模式3.1、Bridge网络模式的架构3.2、工作原理1、创建虚拟网桥2、IP地址分配与默认网关设置3、veth Pair设备与网络接入4、网络命名空间隔离5、与外部网络之间的通信SNAT6、被外部主机访问DNAT7、ip_forward功能 3.3、Bridge网络模式的特点3.4、修改bridge网络的默认网段3.4.1、修改docker.service文件3.4.2、修改daemon.json文件 4、Host网络模式4.1、Host网络模式的架构4.2、工作原理4.3、Host 网络模式的特点4.4、示例4.4.1、创建一个host网络模式的nginx容器4.4.2、再创建一个host网络模式的nginx容器 5、none网络模式5.1、none网络模式架构5.2、工作原理1. 网络命名空间隔离解除2. 仅有的网络接口loopback3. 手动网络配置 5.3、none网络模式的特点5.4、示例5.4.1、创建一个none网络模式的容器5.4.2、进入容器查看网络接口信息并测试通信能力 6、Container网络模式6.1、Container网络模式架构6.2、工作原理1. 共享网络命名空间2. 网络接口和IP地址3. 端口冲突4. 通信方式 6.3、Container网络模式的特点6.4、示例6.4.1、创建一个nginx容器6.4.2、创建一个新的container容器共享nginx的网络环境6.4.3、查看两个容器的ip地址 7、自定义网络模式7.1、工作原理7.2、自定义网络的特点7.3、语法7.3.1、语法格式7.3.2、命令7.3.3、选项参数 7.4、示例7.4.1、创建自定义网络7.4.2、使用自定义网络创建容器7.4.3、查看容器的ip地址及对应的index.html文件内容7.4.4、查看网络7.4.5、自定义网络中容器的通信7.4.6、查看iptables相应的规则 三、同一个宿主机间不同网络的容器通信1、创建一个中定义网络的容器2、再创建一个默认Bridge网络的容器3、测试两个容器能否互相通信4、解决方案4.1、修改iptables实现同一宿主机不同网络的容器通信4.2、通过docker network connect 实现同一宿主机不同网络的容器通信 5、断开不同网络中的容器通信 一、Docker容器之间的通信
1、直接互联默认Bridge网络
1.1、Docker安装后默认的网络配置 Docker服务安装完成之后默认在每个宿主机会生成一个名称为docker0的网卡其IP地址都是 172.17.0.1/16。 ip a | grep docker01.2、创建容器后的网络配置
1.2.1、首先创建一个容器
[rootlocalhost ~]# docker run -itd --name nginx_v1 -p 8081:80 nginx1.2.2、ip a 列出网卡变化信息
[rootlocalhost ~]# ip a
...
3: docker0: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc noqueue state UP group defaultlink/ether 02:42:77:03:57:c7 brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft foreverinet6 fe80::42:77ff:fe03:57c7/64 scope linkvalid_lft forever preferred_lft forever
5: veth6ce240eif4: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc noqueue master docker0 state UP group defaultlink/ether aa:8b:8e:1b:35:93 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet6 fe80::a88b:8eff:fe1b:3593/64 scope linkvalid_lft forever preferred_lft forever创建了容器后 宿主机就会多了一个虚拟网卡和容器的网卡组合成一个网卡比如5: veth6ce240eif4而在容器内的网卡名为4可以看出和宿主机的网卡之间的关联 容器会自动获取一个172.17.0.0/16网段的随机地址默认从172.17.0.2开始第二个容器为 172.17.0.3以此类推 容器获取的地址并不固定。每次容器重启可能会发生地址变化
1.2.3、查看新建容器后的桥接状态
[rootlocalhost ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242770357c7 no veth6ce240ebridge name: 显示网桥的名称在这个例子中是docker0。docker0是Docker在宿主机上自动创建的默认网桥用于连接Docker容器到宿主机的网络。 bridge id: 每个网桥都有一个唯一的标识符通常格式为8000.MAC地址。在这个例子中8000.0242770357c7是docker0网桥的ID其中02:42:77:03:57:c7是该网桥的MAC地址的一部分 STP enabled: 显示是否启用了Spanning Tree ProtocolSTP生成树协议。STP用于防止局域网中的桥接循环bridge loops和广播风暴。输出中的no表示在docker0网桥上STP是禁用的这是Docker默认的行为因为通常在容器环境中不需要STP。 interfaces: 列出了连接到该网桥的网络接口。在这个例子中只有veth6ce240e这个接口连接到了docker0网桥。veth接口是一对虚拟以太网设备通常一个在容器的网络命名空间内容器的eth0另一个在宿主机的网络命名空间内它们通过这种方式桥接容器网络到宿主机网络使得容器可以与宿主机及其他容器通信。 创建容器后容器会自动获取ip地址 [rootlocalhost ~]# docker exec -it nginx_v1 ip a1.3、容器内安装常见的工具 ping、 nslookup、 ifconfig、 ip、 curl 监视系统状态和管理进程的工具集合 apt install inetutils-ping -y
apt install dnsutils -y
apt install net-tools -y
apt install iproute2 -y
apt install curl -y
apt install procps -y1.4、容器间通信 默认情况下同一个宿主机的不同容器之间可以相互通信。 不同宿主机之间的容器IP地址重复默认不能相互通信。 在docker.service配置文件中的fd://后面添加–iccfalse 选项可以禁止同一个宿主机的不同容器间通信。 再创建一个容器进行互相通信
[rootlocalhost ~]# docker run -itd --name nginx_v2 -p 8082:80 nginx
5e088a915221aef79d369bba6d76961598ea341222ae1c20d0cb1b8a0e1147f0分别获取两个容器对应的ip地址 [rootlocalhost ~]# docker exec -it nginx_v1 hostname -i
172.17.0.2
[rootlocalhost ~]# docker exec -it nginx_v2 hostname -i
172.17.0.3直接测试网络连通性 [rootlocalhost ~]# docker exec -it nginx_v1 bash
rootda9b2e5ecf77:/# ping 127.0.0.3 -c 3
PING 127.0.0.3 (127.0.0.3): 56 data bytes
64 bytes from 127.0.0.3: icmp_seq0 ttl64 time0.068 ms
64 bytes from 127.0.0.3: icmp_seq1 ttl64 time0.096 ms
64 bytes from 127.0.0.3: icmp_seq2 ttl64 time0.087 ms
--- 127.0.0.3 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev 0.068/0.084/0.096/0.000 ms2、容器名称互联
2.1、原理 docker run 创建容器可使用–link选项实现容器名称的引用 其本质就是在容器内的/etc/hosts中添加–link后指定的容器的IP和主机名的对应关系从而实现名称解析。
2.2、指令格式
docker run --name #先创建指定名称的容器
docker run --link #再创建容器时引用上面容器的名称2.3、创建新的容器并引用已创建的容器
[rootlocalhost ~]# docker run -itd --name nginx_test1 --link nginx_v1 -p 8083:80 nginx
eb9b74839c4c5e493df5fbfa5b0482cbc984e70a7ac7addcd9b01cce792d94492.4、进入容器查看/etc/hosts文件
[rootlocalhost ~]# docker exec -it nginx_test1 /bin/bash
rooteb9b74839c4c:/# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 nginx_v1 cf9fc9d97972
172.17.0.4 eb9b74839c4c2.5、使用容器名称互相通信
rooteb9b74839c4c:/# ping nginx_v1 -c 2
PING nginx_v1 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: icmp_seq0 ttl64 time0.064 ms
64 bytes from 172.17.0.2: icmp_seq1 ttl64 time0.077 ms
--- nginx_v1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev 0.064/0.071/0.077/0.000 ms3、自定义容器别名互联 自定义的容器名称可能后期会发生变化那么一旦发生变化也会带来一些影响这个时候如果每次都更改名称又比较麻烦 这个时候可以使用定义别名的方式解决即容器名称可以随意更改只要不更改别名即可。 3.1、指令格式
#先创建指定名称的容器
docker run --name 容器名称
docker run --name 容器名称 --link 目标容器名称:容器别名1 容器别名2 ...3.2、起别名的形式创建一个新的容器
[rootlocalhost ~]# docker run -itd --name nginx_test2 -p 8084:80 --link nginx_v2:nginx_v2_alias nginx
3382790d21e3224c50799e907b229185fb5ab37140b51cc6ab4536e19c00dabd--link nginx_v2:nginx_v2_alias: 设置容器间的链接。这里表示当前新创建的容器将与名为 nginx_v2 的容器建立链接并且在新容器内部这个链接将以 nginx_v2_alias 的别名存在。链接允许容器之间相互通信并且可以使用别名通过环境变量等方式访问被链接容器的信息。 3.3、使用别名互相通信
docker exec -it nginx_test2 ping -c 2 nginx_v2_alias4、自定义网络
4.1、创建自定义网络
[rootlocalhost ~]# docker network create my_network
0c93f493d62d5791febeb088048f85874e9ae2bc9266bb84f88f4864ad379d46
[rootlocalhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
4d478ce25a22 bridge bridge local
738397fc865f host host local
0c93f493d62d my_network bridge local
75326f81366f none null local当我们创建了一个自定义网络my_networkDocker 会创建一个新的桥接网络bridge driver。 其底层技术仍然是基于桥接网络实现的即每个连接到此自定义网络的容器都会获得一个虚拟网卡并通过Docker管理的一个虚拟网桥类似于默认的bridge网络所使用的网桥与其他容器以及宿主机进行通信。 4.2、启动两个容器并连接到自定义网络
[rootlocalhost ~]# docker run -itd --name nginx_network3 --network my_network nginx
c98ca358f48e945a9d6b9f4d0c54e562cbbf1aef58e2a265bf2f40296cecb923
[rootlocalhost ~]# docker run -itd --name nginx_network4 --network my_network nginx
c0e09ba99d47652eb4755b7d4e5c1c676fd1f7e4a52a93a55865475c001ae0ea4.3、自定义网络进行容器间通信
[rootlocalhost ~]# docker exec nginx_network3 ping -c 2 nginx_network45、Host网络模式
5.1、启动使用Host网络模式的容器 使用Host网络模式容器直接使用宿主机的网络栈 在 host 网络模式下容器直接使用宿主机的网络栈没有独立的网络命名空间因此容器内部的服务就直接监听在宿主机的网络接口上不再需要端口映射。 [rootlocalhost ~]# docker run -itd --name nginx_host -p 8086:80 --network host nginx可以看到Docker是会忽略--network host模式启动容器时指定的端口映射的 5.2、使用Host网络模式进行通信 此时其他容器就可以通过宿主机的ip和端口进行访问 docker exec -it nginx_v1 ping -c 2 192.168.112.606、端口映射
6.1、启动带有端口映射的容器 这里的镜像mycentos_nginx:v1用的是之前Docker制作镜像中的使用DockerFile制作的nginx镜像 [rootlocalhost ~]# docker run -itd --name nginx_port -p 8090:80 mycentos_nginx:v16.2、其他容器访问
[rootlocalhost ~]# docker exec -it nginx_v3 curl -s 192.168.112.60:8090
#发现可以获取到之前定义的index.html文件内容二、Docker的网络模式
1、查看默认的网络模式
[rootlocalhost ~]# docker network ls默认会生成三种不同的网络 bridge 、host 、null 2、常见的五种网络模式
Docker网络模式配置说明bridge模式–netbridge默认为每个容器分配独立的网络命名空间和IP地址通过Docker虚拟网桥docker0与宿主机及其它容器通信。host模式–nethost容器直接使用宿主机的网络命名空间无独立IP容器和服务直接通过宿主机的网络接口和端口暴露。none模式–netnone容器仅有lo回环接口无网络配置适用于不需要网络的场景。container模式–netcontainer:NAME_or_ID新容器共享指定容器的网络命名空间包括IP地址和端口范围适用于紧密网络耦合的场景。User-defined用户自定义docker network create 网络名 --net网络名创建自定义网络可以配置网络驱动、子网、IP范围等提供更灵活的网络控制适用于微服务架构等复杂网络需求。
3、Bridge网络模式
3.1、Bridge网络模式的架构 3.2、工作原理
1、创建虚拟网桥
Docker启动时自动创建名为docker0的虚拟网桥作为容器间及容器与宿主机通信的基础。所有在同一宿主机上启动的Docker容器默认连接到这个虚拟网桥模拟物理交换机行为形成二层网络。
2、IP地址分配与默认网关设置
从docker0网桥关联的子网中动态分配IP地址给新创建的容器使用。设置docker0的IP地址作为容器的默认网关确保容器对外通信的路由正确。
3、veth Pair设备与网络接入
在宿主机和容器间创建一对虚拟以太网设备veth pair实现容器网络栈与宿主机网络栈的连接。veth pair的一端eth0置于容器内作为其网络接口另一端vethxxx留在宿主机并加入docker0网桥完成容器网络接入。
4、网络命名空间隔离
每个Docker容器都运行在自己的网络命名空间中这意味着它们有自己独立的网络配置包括网卡、IP地址、路由表等彼此之间互不影响增强了容器之间的隔离性。
5、与外部网络之间的通信SNAT
当Docker容器尝试访问外部网络如访问互联网时由于容器的IP地址是私有的属于docker0网桥的子网直接访问外部网络会遇到路由问题。此时宿主机上的网络栈会介入通过**源地址转换Source Network Address Translation, SNAT**技术将容器发出的数据包的源IP地址替换为宿主机的公网IP地址从而使得数据包能够顺利通过路由器并到达目标服务器。这一过程使得容器能够透明地访问外部网络资源。
6、被外部主机访问DNAT
要使外部主机能够访问容器内的服务Docker通过**目的地址转换Destination Network Address Translation, DNAT**实现。当你使用docker run -p命令将容器端口映射到宿主机端口时Docker会在宿主机的iptables规则中设置DNAT条目将指向宿主机特定端口的流量重定向到容器内的相应端口。这意味着外部客户端可以使用宿主机的IP地址和映射的端口号来访问容器内的服务。
7、ip_forward功能 为了使上述SNAT和DNAT能够正常工作宿主机需要启用IP转发功能。IP转发允许宿主机作为网络中间节点将接收到的数据包转发到其他网络接口或设备这对于容器通过宿主机路由进出流量至关重要。通常可以通过编辑/etc/sysctl.conf文件增加或修改net.ipv4.ip_forward1并执行sysctl -p命令来启用这一功能。 [rootlocalhost ~]# cat /proc/sys/net/ipv4/ip_forward
1安装Docker后会默认启用ip_forward
3.3、Bridge网络模式的特点
网络资源隔离 不同宿主机的容器无法直接通信各自使用独立网络无需手动配置 容器默认自动获取172.17.0.0/16的IP地址此地址可以修改可访问外网 利用宿主机的物理网卡SNAT连接外网外部主机无法直接访问容器 可以通过配置DNAT接受外网的访问性能较低 因为可通过NAT网络转换带来更的损耗端口管理繁琐 每个容器必须手动指定唯一的端口容器产生端口冲突
3.4、修改bridge网络的默认网段 有两种方式可以修改bridge网络的默认网段但是两种只能选择一种否则docker服务无法启动 3.4.1、修改docker.service文件 修改配置文件前记得备份前面跟着做的就不需要重复备份了 [rootlocalhost ~]# vim /usr/lib/systemd/system/docker.service
...
ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock --bip172.10.0.1/16
...
#修改为172.10网段[rootlocalhost ~]# systemctl daemon-reload systemctl restart docker[rootlocalhost ~]# docker run -itd --name nginx_v4 -p 8091:80 mycentos_nginx:v1
[rootlocalhost ~]# docker run -itd --name nginx_v5 -p 8092:80 mycentos_nginx:v1
#创建两个容器来验证网段是否修改[rootlocalhost ~]# docker inspect nginx_v4 --format{{json .NetworkSettings.IPAddress}}
172.10.0.2
[rootlocalhost ~]# docker inspect nginx_v5 --format{{json .NetworkSettings.IPAddress}}
172.10.0.3
#可以看到再创建的容器分配到的ip地址就是172.10网段的ip且从172.10.0.2往后顺延3.4.2、修改daemon.json文件 没有这个文件的是没有开启镜像加速功能 阿里云镜像加速 - 容器镜像服务 - 镜像工具 - 镜像加速器 依据操作文档添加 [rootlocalhost docker]# cat /etc/docker/daemon.json
{registry-mirrors: [https://jzjzrggd.mirror.aliyuncs.com],bip: 172.72.0.1/16,dns: [8.8.8.8]
}
#这里我将默认网段修改为172.72[rootlocalhost docker]# systemctl daemon-reload systemctl restart docker[rootlocalhost ~]# docker run -itd --name nginx_v6 -p 8093:80 mycentos_nginx:v1
0dba43ccae42824f0c3bbd80617de2c2685dc8c9a6120c416047b43fe4f90cdd
[rootlocalhost ~]# docker run -itd --name nginx_v7 -p 8094:80 mycentos_nginx:v1
2fa22556636d2d223bfe0ca8a0d961dd8f88671fb018b4095f1a86d02c9babe7
#创建两个容器来验证网段是否修改[rootlocalhost ~]# docker exec -it nginx_v6 hostname -i
172.72.0.2
[rootlocalhost ~]# docker exec -it nginx_v7 hostname -i
172.72.0.3
#可以看到再创建的容器分配到的ip地址就是172.72网段的ip且从172.72.0.2往后顺延注意由于之前示例的容器均没有固定ip以及设置随docker自启所以以上操作会导致用于示例的容器都是Exited (0)状态并且重启容器后ip地址也会从新设置的网段开始分配 4、Host网络模式
4.1、Host网络模式的架构 4.2、工作原理
网络命名空间共享容器不再拥有独立的网络接口、IP地址、路由表等而是直接使用宿主机的网络配置包括网络接口卡NIC、IP地址、端口等。端口和网络服务容器内的服务可以直接通过宿主机的IP地址和端口访问无需进行端口映射因为容器与宿主机网络完全一致。性能由于没有网络栈的额外开销Host模式下的容器网络性能通常优于其他网络模式。安全性与隔离性这是Host模式的最大劣势容器失去了网络层面的隔离保护容器内的服务与宿主机服务在同一个网络环境中存在潜在的安全风险且容器间也无网络隔离。
4.3、Host 网络模式的特点
共享宿主机网络网络性能无损耗网络故障排除相对简单各容器网络无隔离网络资源无法分别统计端口管理困难容易产生端口冲突不支持端口映射适用于运行容器端口比较固定的业务
4.4、示例
4.4.1、创建一个host网络模式的nginx容器
[rootlocalhost ~]# docker run -itd --name nginx_v8 --network host mycentos_nginx:v1
0d61e812c6c82d86b87fe89649c3c99768c9a2b794c81ecf902fdace092cc331[rootlocalhost ~]# ss -tnl | grep 80
#可以看到宿主机的80端口打开4.4.2、再创建一个host网络模式的nginx容器
[rootlocalhost ~]# 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网络模式的特点
安全隔离对于不需要网络连接的容器使用None模式可以增强安全性减少攻击面。定制化网络当需要构建非常特定的网络配置如点对点通信、直接与宿主机的特定网络接口相连等可以在None模式基础上手动配置网络。调试与测试在排除网络问题或进行网络相关的单元测试时可以使用None模式创建一个干净、无网络干扰的环境。
5.4、示例
5.4.1、创建一个none网络模式的容器
[rootlocalhost ~]# docker run -itd --name nginx_v10 -p 8096:80 --network none mycentos_nginx:v15.4.2、进入容器查看网络接口信息并测试通信能力
[rootlocalhost ~]# docker exec -it nginx_v10 bash
[root49d500bcbc3a /]# ip a
1: lo: LOOPBACK,UP,LOWER_UP mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever
[root49d500bcbc3a /]# ping www.baidu.com
ping: www.baidu.com: Name or service not known
[root49d500bcbc3a /]# ping 172.17.0.1
connect: Network is unreachable
#可以看到网络接口信息只有lo接口无法与外部通信6、Container网络模式
6.1、Container网络模式架构 6.2、工作原理
1. 共享网络命名空间
当使用 --netcontainer:NAME_or_ID 参数启动一个容器时Docker 不会为新容器创建新的网络命名空间而是让它与指定容器共享同一个网络命名空间。这意味着两个容器看网络的角度是完全一样的就像它们是在同一台机器上运行一样共享相同的网络配置和网络资源。
2. 网络接口和IP地址
新容器不会获得自己的网络接口和IP地址它直接使用被共享容器的网络接口和IP地址。两个容器可以访问相同的网络服务如同一局域网内的两台电脑无需额外的端口映射或网络配置。
3. 端口冲突
由于共享网络命名空间两个容器不能绑定到同一个端口上运行服务否则会出现端口冲突。如果需要在多个容器中运行相同服务应考虑使用其他网络模式如Bridge模式并通过端口映射解决冲突。
4. 通信方式
容器间通信非常直接因为它们共享相同的网络环境通过localhost或容器内的IP即可互相访问。对于外部访问由于它们共享宿主机的网络栈所以外部访问也遵循与共享容器相同的规则例如如果共享容器有端口映射到宿主机则新容器的服务也可通过这些映射端口访问。
6.3、Container网络模式的特点
与宿主机网络空间隔离容器间共享网络空间适合频繁的容器间的网络通信直接使用对方的网络较少使用主要用于需要紧密网络耦合的场景如微服务架构中某些服务间的直接通信。
6.4、示例
6.4.1、创建一个nginx容器
[rootlocalhost ~]# docker run -itd --name nginx_v11 -p 8098:80 mycentos_nginx:v1 06810ca19da88562cd539f7bd9dff8b8030bc64628760e28f8f4204ced5135b36.4.2、创建一个新的container容器共享nginx的网络环境
[rootlocalhost ~]# docker run -itd --name container_v1 --network container:nginx_v11 centos:76.4.3、查看两个容器的ip地址
[rootlocalhost ~]# docker exec -it nginx_v11 hostname -i
172.72.0.10
[rootlocalhost ~]# docker exec -it container_v1 hostname -i
172.72.0.107、自定义网络模式
7.1、工作原理
网络命名空间每个连接到自定义网络的容器都会有自己的网络命名空间确保网络资源如网络接口、路由表等的隔离。网络桥接Docker使用网络驱动通常是Bridge驱动创建一个或多个虚拟网桥容器的网络接口通过虚拟网桥与宿主机的网络接口相连实现容器间以及容器与宿主机的通信。IP地址管理Docker会根据指定的子网为每个容器分配一个静态或动态IP地址并管理网络配置如网关、DNS服务器等。服务发现Docker通过内置的DNS服务或外部服务发现机制使得容器可以通过名称查找其他容器的IP地址简化配置。
7.2、自定义网络的特点
灵活性用户可以自定义网络的配置包括子网、IP地址、DNS设置等满足复杂应用的网络需求。可扩展性随着应用规模扩大可以通过Overlay网络驱动实现跨主机容器通信扩展网络覆盖范围。隔离性每个自定义网络都是独立的提供容器间以及与宿主机的网络隔离增加安全性。易管理性通过Docker CLI轻松创建、删除、连接或断开容器与网络的关联便于网络运维。
7.3、语法
7.3.1、语法格式
docker network COMMAND
docker network create -d mode --subnet CIDR --gateway 网关 自定义网络名称mode不支持host和none默认是bridge模式 7.3.2、命令
Commands:
• connect 将容器连接到网络
• create 创建网络
• disconnect断开容器与网络的连接
• inspect 显示一个或多个网络的详细信息
• ls 列出网络列表
• prune 删除所有未使用的网络
• rm 删除一个或多个网络7.3.3、选项参数
[options]
--driver 或 -d: 指定网络的驱动类型。默认是 bridge但也可以是 overlay、macvlan、ipvlan 等。例如创建一个 overlay 网络--driver overlay。--subnet: 指定网络的子网。可以多次指定以创建多个子网。例如--subnet172.16.23.0/24。--gateway: 设置网络的默认网关地址。例如--gateway172.16.23.1。--ip-range: 限制Docker从指定的子网范围内分配IP地址给容器。这对于大型网络很有用。--opt: 传递特定于驱动程序的选项。例如对于 overlay 驱动可以设置 --opt encrypted 来加密网络通信。--internal: 将网络配置为内部网络意味着外部流量不能到达此网络上的容器。--attachable: 允许后续的容器即使在创建网络时没有指定也能连接到这个网络。--label: 添加元数据标签到网络用于过滤和识别。格式为 keyvalue。--scope: 设置网络的作用域通常是 local单个Docker主机或 globalSwarm模式下。默认为 local。--ingress: Swarm模式特有创建一个特殊的Ingress网络用于Swarm服务的外部流量路由。7.4、示例
7.4.1、创建自定义网络
[rootlocalhost ~]# docker network create -d bridge --subnet 172.172.0.0/16 --gateway 172.172.0.1 net-test[rootlocalhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
3593c2126bf2 bridge bridge local
738397fc865f host host local
0c93f493d62d my_network bridge local
8f95cd5b3ac0 net-test bridge local
75326f81366f none null local此时会新添加一个虚拟网卡和网桥 用brctl show查看新的虚拟网卡对应的interfaces显示为空。 7.4.2、使用自定义网络创建容器
[rootlocalhost ~]# docker run -itd --name nginx_v13 --network net-test -p 8099:80 mycentos_nginx:v1
a9e35a0b3d86caeef38501c5c45c62d753ac31e650f231e2bd41d4c34b03ed4c7.4.3、查看容器的ip地址及对应的index.html文件内容
[rootlocalhost ~]# docker exec -it nginx_v13 hostname -i
172.172.0.2
[rootlocalhost ~]# curl 172.172.0.2
test nginx !
[rootlocalhost ~]# docker exec -it nginx_v13 cat /usr/local/nginx/html/index.html
test nginx !7.4.4、查看网络
[roota9e35a0b3d86 /]# ifconfig
eth0: flags4163UP,BROADCAST,RUNNING,MULTICAST mtu 1500inet 172.172.0.2 netmask 255.255.0.0 broadcast 172.172.255.255ether 02:42:ac:ac:00:02 txqueuelen 0 (Ethernet)RX packets 17 bytes 1285 (1.2 KiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 7 bytes 670 (670.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags73UP,LOOPBACK,RUNNING mtu 65536inet 127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen 128 scopeid 0x10hostloop txqueuelen 1000 (Local Loopback)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 07.4.5、自定义网络中容器的通信
[roota9e35a0b3d86 /]# ping -c 2 www.baidu.com
PING www.a.shifen.com (180.101.50.188) 56(84) bytes of data.
64 bytes from 180.101.50.188 (180.101.50.188): icmp_seq1 ttl127 time8.85 ms
64 bytes from 180.101.50.188 (180.101.50.188): icmp_seq2 ttl127 time8.53 ms--- www.a.shifen.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev 8.535/8.694/8.854/0.184 ms7.4.6、查看iptables相应的规则
[rootlocalhost ~]# iptables -t nat -nvLPREROUTING 和 OUTPUT 链中的DOCKER规则 规则允许所有目的地址为本地dst-type LOCAL的数据包进入并将其标记为DOCKER流量这是为了确保发往本地并且最终目标是Docker容器的流量能够被正确处理。在OUTPUT链中有规则指明所有出站流量如果不是发往127.0.0.0/8即本地回环且目标是本地的也会被标记为DOCKER流量。 POSTROUTING 链中的MASQUERADE规则 多个MASQUERADE规则用于将来自不同子网如172.172.0.0/16和172.18.0.0/16的流量伪装成主机的IP地址以便容器可以透明地访问外部网络。这表明容器对外通信时它们的源IP会被替换为主机的外网IP。特定于端口如tcp dpt:80的MASQUERADE规则似乎是重复的它们可能是因为对特定容器端口进行了端口映射配置但目前没有匹配的DNAT规则对应看起来可能是配置错误或历史残留。 DOCKER链中的规则 RETURN规则指示当数据包来自于特定的Docker网络接口如br-8f95cd5b3ac0, docker0, br-0c93f493d62d时直接返回这通常意味着这些网络内部的流量不需要进一步处理。DNATDestination NAT目标地址转换规则将到达主机的特定端口例如8094至8099的数据包转发到对应的容器内端口80上。这展示了端口映射配置允许外部访问容器的服务。 三、同一个宿主机间不同网络的容器通信
1、创建一个中定义网络的容器
[rootlocalhost ~]# docker run -itd --name nginx_v14 --network net-test -p 8100:80 mycentos_nginx:v1
515a5a6a1574ae7d0d14e273de3ba1750024648d7a1bbad0bfb12af4ae2649522、再创建一个默认Bridge网络的容器
[rootlocalhost ~]# docker run -itd --name nginx_v15 -p 8101:80 mycentos_nginx:v1
4da77959831e67950a5522c02f225c0470beee0802780ce2d20754707f2eabf13、测试两个容器能否互相通信
[rootlocalhost ~]# docker exec -it nginx_v14 hostname -i
172.172.0.2
[rootlocalhost ~]# docker exec -it nginx_v15 hostname -i
172.72.0.2
[rootlocalhost ~]# docker exec -it nginx_v15 bash
[root4da77959831e /]# ping 172.172.0.2
PING 172.172.0.2 (172.172.0.2) 56(84) bytes of data.
^C
--- 172.172.0.2 ping statistics ---
7 packets transmitted, 0 received, 100% packet loss, time 6032ms显然ping不通 4、解决方案
4.1、修改iptables实现同一宿主机不同网络的容器通信
iptables-save iptables.rule
#怕改错的也可以备份一份vim iptables.rule
#修改下面两行的规则
-A DOCKER-ISOLATION-STAGE-2 -o br-8f95cd5b3ac0 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j ACCEPTiptables-restore iptables.rule这其中的br-8f95cd5b3ac0可以使用iptables -nvL | grep 172.172.0.2过滤查看刚才使用自定义网络创建容器的ip地址 [rootlocalhost ~]# docker exec -it nginx_v14 hostname -i
172.172.0.2
[rootlocalhost ~]# docker exec -it nginx_v15 hostname -i
172.72.0.2
[rootlocalhost ~]# docker exec -it nginx_v15 bash
[root4da77959831e /]# ping -c 2 172.172.0.2
PING 172.172.0.2 (172.172.0.2) 56(84) bytes of data.
64 bytes from 172.172.0.2: icmp_seq1 ttl63 time0.060 ms
64 bytes from 172.172.0.2: icmp_seq2 ttl63 time0.087 ms--- 172.172.0.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1011ms
rtt min/avg/max/mdev 0.060/0.073/0.087/0.016 ms可以通信 4.2、通过docker network connect 实现同一宿主机不同网络的容器通信 做这个操作前记得将之前的iptables规则改回去哦 #将CONTAINER连入指定的NETWORK中使此CONTAINER可以与NETWORK中的其它容器进行通信
docker network connect [OPTIONS] NETWORK CONTAINER
Options
--alias strings 为容器添加网络范围的别名
--driver-opt strings 网络的驱动程序选项
--ip string IPv4地址 (e.g172.30.100.104)
--ip6 string IPv6 地址 (e.g2001:db8::33)
--link list 将链接添加到另一个容器
--link-local-ip strings 为容器添加链接本地地址#将Bridge网络模式的容器nginx_v15可以连到自定义网络net-test的容器nginx_v14
[rootlocalhost ~]# docker network connect net-test nginx_v15docker exec -it nginx_v15 ping -c 2 172.172.0.2
#测试通信nginx_v15可以ping通nginx_v14docker exec -it nginx_v14 ping -c 2 172.72.0.2
#但是自定义网络的nginx_v14ping不通nginx_v15docker network connect bridge nginx_v14
#将自定义网络的nginx_v14可以连通默认Bridge网络的nginx_v15将Bridge网络模式的容器nginx_v15可以连到自定义网络net-test的容器nginx_v14测试通信nginx_v15可以ping通nginx_v14但是自定义网络的nginx_v14ping不通nginx_v15将自定义网络的nginx_v14可以连通默认Bridge网络的nginx_v15
5、断开不同网络中的容器通信
docker network disconnect net-test nginx_v15
#断开nginx_v15容器与net-test网络中其他容器的通信
#此时默认Bridge网络的nginx_v15ping不通net-test网络的nginx_v14
#但是net-test网络的nginx_v14可以ping通默认Bridge网络的nginx_v15docker network disconnect bridge nginx_v14
#断开nginx_v14容器与Bridge网络模式中的其他容器通信
#现在两个不同网络的容器无法通信