当前位置: 首页 > news >正文

Docker网络模型详解

目录

一、Docker网络基础

1、端口映射

使用-P选项时Docker会随机映射一个端口至容器内部的开放端口

使用docker logs查看Nginx的日志

查看映射的随机端口范围 

 2、使用-p可以指定要映射到的本地端口。

Local_Port:Container_Port   : 端口映射参数中指定了宿主机的8000映射到容器内部的80端口,可以多次使用-p选项

Local_IP:Local_Port:Container_Port  : 映射到指定地址的指定端口

Local_IP::Container_Port   :映射到指定地址,但是宿主机端口是随机分配的

3、指定传输协议

 二、端口暴露

三、容器互联

四、Dokcer 网络模式

1、Host模式

2、container模式

3、none模式

4、bridge模式

5、Overlay模式


网络是激活Docker体系的唯一途径,如果Docker没有比较出色的容器网络,那么Docker根本没有如今的竞争力,起初Docker网络的解决方案并不理想,但是经过最近几年的发展,再加上很多云计算服务商都参与了进来,大批的SDN方案如雨后春笋般的冒了出来。

要使docker用必须安装docker-ce、阿里云镜像加速器

[root@localhost ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo[root@localhost ~]# yum -y install yum-utils device-mapper-persistent-data lvm2
[root@localhost ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo[root@localhost ~]# ls /etc/yum.repos.d/
backup  Centos-aliyun.repo  CentOS-Media.repo  docker-ce.repo[root@localhost ~]# yum -y install docker-ce
[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable docker

阿里云镜像加速器

[root@localhost ~]# cat << END > /etc/docker/daemon.json
{"registry-mirrors":[ "https://nyakyfun.mirror.aliyuncs.com" ]
}
END
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker[root@localhost ~]# docker version
Client: Docker Engine - CommunityVersion:           19.03.8API version:       1.40Go version:        go1.12.17

一、Docker网络基础

Docker目前对单节点的设备提供了将容器端口映射到宿主机和容器互联两个网络服务。

1、端口映射

在Docker中容器默认是无法与外部通信的,需要在启动命令中加入对应的参数才允许容器与外界通信。

         当Docker中运行一个Web服务时,需要把容器内的Web服务应用程序端口映射到本地宿主机的端口。这样,用户访问宿主机指定的端口的话,就相当于访问容器内部的Web服务端口。

使用-P选项时Docker会随机映射一个端口至容器内部的开放端口
[root@docker ~]# docker run -d -P --name test1 nginx
WARNING: IPv4 forwarding is disabled. Networking will not work.

使用docker port可以查看端口映射情况

[root@docker ~]# docker port test1 
80/tcp -> 0.0.0.0:32769
使用docker logs查看Nginx的日志
[root@docker ~]# docker logs test1
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
查看映射的随机端口范围 
[root@docker ~]# cat /proc/sys/net/ipv4/ip_local_port_range 
32768	60999

 2、使用-p可以指定要映射到的本地端口。

Local_Port:Container_Port   : 端口映射参数中指定了宿主机的8000映射到容器内部的80端口,可以多次使用-p选项
[root@docker ~]# docker run -d -p 8000:80 --name test2 nginx
ac67353b3b7cb03dc4e602f96fce3129e1c0ddd9df448e5ca57ee823e9a28270

 这种方式会映射到所有接口地址,所有访客都可以通过宿主机所有IP的端口来访问容器。

Local_IP:Local_Port:Container_Port  : 映射到指定地址的指定端口
[root@docker ~]# docker run -d -p 192.168.242.149:9000:80 --name test3 nginx
d9fc60875684382100d7f5b72e1ed162c3da5485cf986e58a95300772f290741

Local_IP::Container_Port   :映射到指定地址,但是宿主机端口是随机分配的
[root@docker ~]# docker run -d -p 192.168.147.136::80 --name test4 nginx
aff7c8fcfe4a9502f79a24fd6e73405e7b3478c87a24cd01da1995f23d56814c
[root@docker ~]# docker port test4
80/tcp -> 192.168.147.136:32768

3、指定传输协议

[root@docker ~]# docker run -d -p 80:80/tcp --name test5 nginx
ec2744d3fdece31e9d1e8b549e5e4751ffaadefd6d9ec73598693a5475e06374
[root@docker ~]# docker port test5
80/tcp -> 0.0.0.0:80
[root@docker ~]# docker run -d -p 81:81/udp --name test6 nginx
cee3168bf8426607c83188f883bd4f0b57e75074c4122e0fdc9e2c2df22d3d6e
[root@docker ~]# docker port test6
81/udp -> 0.0.0.0:81

 

 二、端口暴露

咱们之前讲过EXPOSE命令用于端口暴露,很多人会把端口暴露和端口映射混为一谈。端口暴露才能端口映射,目前有两种方式用于端口暴露,--expose和EXPOSE方式,这两种方式作用相同,但是--expose可以接受端口范围作为参数,例如--expose=2000~3000。

Dockerfile的作者一般在包含EXPOSE规则时都只提示哪个端口提供哪个服务。访问时还需要运维人员通过端口映射来指定。--expose和EXPOSE只是为其他命令提供所需信息的元数据。

通过docker inspect container_name查看网络配置:

[root@docker ~]# docker inspect test1"Bridge": "","SandboxID": "a194c54925b8fa848b4b5ac4ce34b307b58420f26b5e497af9a65cf31401a763","HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"Ports": {"80/tcp": [{"HostIp": "0.0.0.0","HostPort": "32769"}]},

三、容器互联

容器互联是除了端口映射外另一种可以与容器通信的方式。端口映射的用途是宿主机网络与容器的通信,而容器互联是容器之间的通信。

当前实现容器互联有两种方式,一种是把两个容器放进一个用户自定义的网络中,另一种是使用--link参数(已经弃用,即将删除的功能)。

         为什么要使用一个单独的网络来连接两个容器呢?设想一下后端容器需要调用一个数据库环境,数据库容器和后端服务容器如果使用上下文中的暴露端口或者映射端口来通信,势必会把数据库的端口也暴露在外网中,导致数据库容器的安全性大大降低,为了解决这个问题,docker允许用户建立一个独立的网络来放置相应的容器,只有在该网络中的容器才能相互通信,外部容器是无法进入这个特定网络中的。

         一个容器可以同时加入多个网络,使用不同地址可以访问不同网络中的容器。

用户自定义的网络

首先创建两个容器,命名为container1和container2

[root@docker ~]# docker run -itd --name=container1 busybox
1fdfabd7dda4b94c897fb2c177c83b40d42bfe8646500206a53bcb0f15c49675
[root@docker ~]# docker run -itd --name=container2 busybox
7cf69cf901388b2946c43adbec1efa62cca428f485e8d9188d07c4e774e7c051

接下来创建一个独立的容器网络,这里使用bridge驱动(桥接模式),其他可选的值还有overlay和macvlan。

[root@docker ~]# docker network create -d bridge --subnet 172.25.0.0/16 demo_net
27728db882c0b710d6be8541698120b46dd9b7b7f2e467cc9618c4bb33b4e264
[root@docker ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
d43919472f6e        bridge              bridge              local
5b09991235f8        compose_lnmp_lnmp   bridge              local
27728db882c0        demo_net            bridge              local
4775c0103fa3        host                host                local
973d096cf292        none                null                local

使用--subnet和--gateway可以指定子网和网关,现在我们把container2加入到demo_net中

[root@docker ~]# docker network connect demo_net container2
[root@docker ~]# docker network inspect demo_net "Internal": false,"Attachable": false,"Containers": {"7cf69cf901388b2946c43adbec1efa62cca428f485e8d9188d07c4e774e7c051": {"Name": "container2","EndpointID": "7e183d8d78c5b5fbac7a18eff0f442a0c27f0d902811aa6fb20467ab606f8e7d","MacAddress": "02:42:ac:19:00:02","IPv4Address": "172.25.0.2/16","IPv6Address": ""}

 使用docker network inspect可以查看网络中容器的连接状态。Container2已经在demo_net网络中,注意IP地址使自动分配的。

启动第三个容器

[root@docker ~]# docker run --network=demo_net --ip=172.25.3.3 -itd --name=container3 busybox
8a1d1481874c0a0de0bb6fd285b20b1f0543ecccbf7d0c32b5b08e2c7c4ef37b
[root@docker ~]# docker network inspect demo_net"Containers": {"7cf69cf901388b2946c43adbec1efa62cca428f485e8d9188d07c4e774e7c051": {"Name": "container2","EndpointID": "7e183d8d78c5b5fbac7a18eff0f442a0c27f0d902811aa6fb20467ab606f8e7d","MacAddress": "02:42:ac:19:00:02","IPv4Address": "172.25.0.2/16","IPv6Address": ""},"8a1d1481874c0a0de0bb6fd285b20b1f0543ecccbf7d0c32b5b08e2c7c4ef37b": {"Name": "container3","EndpointID": "f3c940312e8f9e7a646931adda6e8a791b8f9ca2264378826abf8358d6e3c88f","MacAddress": "02:42:ac:19:03:03","IPv4Address": "172.25.3.3/16","IPv6Address": ""

查看三个容器内部的网络

[root@docker ~]# docker exec -it container2 ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:09  inet addr:172.17.0.9  Bcast:0.0.0.0  Mask:255.255.0.0inet6 addr: fe80::42:acff:fe11:9/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:10 errors:0 dropped:0 overruns:0 frame:0TX packets:8 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:796 (796.0 B)  TX bytes:656 (656.0 B)eth1      Link encap:Ethernet  HWaddr 02:42:AC:19:00:02  inet addr:172.25.0.2  Bcast:0.0.0.0  Mask:255.255.0.0inet6 addr: fe80::42:acff:fe19:2/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:24 errors:0 dropped:0 overruns:0 frame:0TX packets:8 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:1968 (1.9 KiB)  TX bytes:656 (656.0 B)lo        Link encap:Local Loopback  inet addr:127.0.0.1  Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)[root@docker ~]# docker exec -it container3 ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:19:03:03  inet addr:172.25.3.3  Bcast:0.0.0.0  Mask:255.255.0.0inet6 addr: fe80::42:acff:fe19:303/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:8 errors:0 dropped:0 overruns:0 frame:0TX packets:8 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:656 (656.0 B)  TX bytes:656 (656.0 B)lo        Link encap:Local Loopback  inet addr:127.0.0.1  Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
[root@docker ~]# docker exec -it container2 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.062 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.139 ms
64 bytes from 172.17.0.2: seq=2 ttl=64 time=0.156 ms
^C
--- 172.17.0.2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.062/0.119/0.156 ms[root@docker ~]# docker exec -it container2 ping 172.25.3.3
PING 172.25.3.3 (172.25.3.3): 56 data bytes
64 bytes from 172.25.3.3: seq=0 ttl=64 time=0.084 ms
64 bytes from 172.25.3.3: seq=1 ttl=64 time=0.158 ms
^C
--- 172.25.3.3 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.084/0.121/0.158 ms

使用link参数

容器的连接(linking)系统是除了端口映射外另一种可以与容器中应用进行交互的方式。它会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息。

使用这个参数容器必须设置一个名字,也就是--name指定的值。

[root@docker ~]# docker run -itd --name test busybox
03f11be7e04e6a378393a87f1c1711519ca7b264c416153dbc3ec18b2a047441

--link参数的格式: --link name:alias , 其中name是要链接的容器的名称,alias是这个链接的别名。

[root@docker ~]# docker run -itd --name=link --link test:test busybox
e35a7be4bdbd733d32fa6287fb3e89012dce4765f040f104262e2fc6702d0b78
[root@docker ~]# docker exec -it link ping test
PING test (172.17.0.10): 56 data bytes
64 bytes from 172.17.0.10: seq=0 ttl=64 time=0.146 ms
64 bytes from 172.17.0.10: seq=1 ttl=64 time=0.156 ms
^C
--- test ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.146/0.151/0.156 ms

如果忘记设置名字可以通过docker rename来重命名容器,容器名字是唯一的。

此外--link还可以传递环境变量,实现在两个容器之间共享环境变量。

四、Dokcer 网络模式

 安装Docker时会自动创建3个网络,可以使用docker network ls命令列出这些网络。

[root@docker ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
d43919472f6e        bridge              bridge              local
4775c0103fa3        host                host                local
973d096cf292        none                null                local

我们在使用docker run创建容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式:

  1. Host模式,使用--net=host指定。
  2. Container模式,使用--net=container:NAME_or_ID指定。
  3. None模式,使用--net=none指定。
  4. Bridge模式,使用--net=bridge指定,默认设置。

1、Host模式

Docker底层使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptables规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Root Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。出于安全考虑不推荐使用这种网络模式。

我们在192.168.200.111/24的机器上用Host模式启动一个含有WEB应用的Docker容器,监听TCP 80端口。当我们在容器中执行任何类似ifconfig命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用192.168.200.111:80即可,不用任何NAT转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

[root@docker ~]# docker run -itd --net=host --name=host busybox
52745f141d91e43ad425929cf7b36e767b9959374d4e437dcf297ad57ae26d22
[root@docker ~]# docker exec -it host ifconfig
br-27728db882c0 Link encap:Ethernet  HWaddr 02:42:0B:04:5C:41  inet addr:172.25.0.1  Bcast:0.0.0.0  Mask:255.255.0.0inet6 addr: fe80::42:bff:fe04:5c41/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:90 errors:0 dropped:0 overruns:0 frame:0TX packets:11 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:7080 (6.9 KiB)  TX bytes:782 (782.0 B)br-5b09991235f8 Link encap:Ethernet  HWaddr 02:42:37:68:60:CD  inet addr:172.18.0.1  Bcast:0.0.0.0  Mask:255.255.0.0inet6 addr: fe80::42:37ff:fe68:60cd/64 Scope:LinkUP BROADCAST MULTICAST  MTU:1500  Metric:1RX packets:112 errors:0 dropped:0 overruns:0 frame:0TX packets:75 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:9769 (9.5 KiB)  TX bytes:8464 (8.2 KiB)docker0   Link encap:Ethernet  HWaddr 02:42:18:18:54:E5  inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0inet6 addr: fe80::42:18ff:fe18:54e5/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:283686 errors:0 dropped:0 overruns:0 frame:0TX packets:449286 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:11712586 (11.1 MiB)  TX bytes:1156721473 (1.0 GiB)
ens33     Link encap:Ethernet  HWaddr 00:0C:29:F3:73:15  inet addr:192.168.147.136  Bcast:192.168.147.255  Mask:255.255.255.0inet6 addr: fe80::146a:2496:1fdc:4014/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:207612 errors:0 dropped:0 overruns:0 frame:0TX packets:62363 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:250150907 (238.5 MiB)  TX bytes:9453140 (9.0 MiB)ens36     Link encap:Ethernet  HWaddr 00:0C:29:F3:73:1F  inet addr:192.168.242.149  Bcast:192.168.242.255  Mask:255.255.255.0inet6 addr: fe80::c96f:4c57:35a2:1a70/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:1038861 errors:0 dropped:0 overruns:0 frame:0TX packets:379009 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:1526767771 (1.4 GiB)  TX bytes:23155635 (22.0 MiB)lo        Link encap:Local Loopback  inet addr:127.0.0.1  Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:153 errors:0 dropped:0 overruns:0 frame:0TX packets:153 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:20535 (20.0 KiB)  TX bytes:20535 (20.0 KiB)veth1b51205 Link encap:Ethernet  HWaddr BA:E7:EB:5F:A9:A1  inet6 addr: fe80::b8e7:ebff:fe5f:a9a1/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:17 errors:0 dropped:0 overruns:0 frame:0TX packets:36 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:1482 (1.4 KiB)  TX bytes:2792 (2.7 KiB)veth2169c93 Link encap:Ethernet  HWaddr 8A:EC:07:67:69:26  inet6 addr: fe80::88ec:7ff:fe67:6926/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:37 errors:0 dropped:0 overruns:0 frame:0TX packets:112 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:4507 (4.4 KiB)  TX bytes:9274 (9.0 KiB)

    

[root@docker ~]# ifconfig 
br-27728db882c0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 172.25.0.1  netmask 255.255.0.0  broadcast 0.0.0.0inet6 fe80::42:bff:fe04:5c41  prefixlen 64  scopeid 0x20<link>ether 02:42:0b:04:5c:41  txqueuelen 0  (Ethernet)RX packets 8  bytes 656 (656.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 45  bytes 3490 (3.4 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0br-5b09991235f8: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500inet 172.18.0.1  netmask 255.255.0.0  broadcast 0.0.0.0inet6 fe80::42:37ff:fe68:60cd  prefixlen 64  scopeid 0x20<link>ether 02:42:37:68:60:cd  txqueuelen 0  (Ethernet)RX packets 17  bytes 1482 (1.4 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 36  bytes 2792 (2.7 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0inet6 fe80::42:18ff:fe18:54e5  prefixlen 64  scopeid 0x20<link>ether 02:42:18:18:54:e5  txqueuelen 0  (Ethernet)RX packets 283686  bytes 11712586 (11.1 MiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 449286  bytes 1156721473 (1.0 GiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.147.136  netmask 255.255.255.0  broadcast 192.168.147.255inet6 fe80::146a:2496:1fdc:4014  prefixlen 64  scopeid 0x20<link>ether 00:0c:29:f3:73:15  txqueuelen 1000  (Ethernet)RX packets 207635  bytes 250152587 (238.5 MiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 62382  bytes 9465432 (9.0 MiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0ens36: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.242.149  netmask 255.255.255.0  broadcast 192.168.242.255inet6 fe80::c96f:4c57:35a2:1a70  prefixlen 64  scopeid 0x20<link>ether 00:0c:29:f3:73:1f  txqueuelen 1000  (Ethernet)RX packets 1038876  bytes 1526768671 (1.4 GiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 379009  bytes 23155635 (22.0 MiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536inet 127.0.0.1  netmask 255.0.0.0inet6 ::1  prefixlen 128  scopeid 0x10<host>loop  txqueuelen 1000  (Local Loopback)RX packets 153  bytes 20535 (20.0 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 153  bytes 20535 (20.0 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0veth1b51205: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet6 fe80::b8e7:ebff:fe5f:a9a1  prefixlen 64  scopeid 0x20<link>ether ba:e7:eb:5f:a9:a1  txqueuelen 0  (Ethernet)RX packets 17  bytes 1482 (1.4 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 36  bytes 2792 (2.7 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0veth2169c93: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet6 fe80::88ec:7ff:fe67:6926  prefixlen 64  scopeid 0x20<link>ether 8a:ec:07:67:69:26  txqueuelen 0  (Ethernet)RX packets 37  bytes 4507 (4.4 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 112  bytes 9274 (9.0 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

2、container模式

这个模式可以指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。

使用--net=container:container_id/container_name,多个容器使用共同的网络看到的ip是一样的。

[root@docker ~]# docker run -itd --name=con1 busybox
3021151461b87b7e10a3e5bc19258422bc93c1cd76b6f12dc1fefd5d34787a58
[root@docker ~]# docker exec -it con1 ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:0C  inet addr:172.17.0.12  Bcast:0.0.0.0  Mask:255.255.0.0inet6 addr: fe80::42:acff:fe11:c/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:8 errors:0 dropped:0 overruns:0 frame:0TX packets:8 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:656 (656.0 B)  TX bytes:656 (656.0 B)lo        Link encap:Local Loopback  inet addr:127.0.0.1  Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

 

[root@docker ~]# docker run -itd --net=container:con1 --name=con2 busybox
c66cb6ccae7e1b7360278eb071cd734d89c76eb2cacb9b7beb281753d653ab62
[root@docker ~]# docker exec -it con2 ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:0C  inet addr:172.17.0.12  Bcast:0.0.0.0  Mask:255.255.0.0inet6 addr: fe80::42:acff:fe11:c/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:8 errors:0 dropped:0 overruns:0 frame:0TX packets:8 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:656 (656.0 B)  TX bytes:656 (656.0 B)lo        Link encap:Local Loopback  inet addr:127.0.0.1  Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

3、none模式

在这种模式下,Docker容器拥有自己的Network Namespace,但是并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。

使用--net=none指定,这种模式下不会配置任何网络。

[root@docker ~]# docker run -itd --name=none --net=none busybox
4f8c9d711c3b0c60a2a79b76cb925945f7ba10658c363567ffe2aca216da0778
[root@docker ~]# docker exec -it none ifconfig
lo        Link encap:Local Loopback  inet addr:127.0.0.1  Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

4、bridge模式

bridge模式是Docker默认的网络设置,属于一种NAT网络模型,Docker daemon在启动的时候就会建立一个docker0网桥(通过-b参数可以指定),每个容器使用bridge模式启动时,Docker都会为容器创建一对虚拟网络接口(veth pair)设备,这对接口一端在容器的Network Namespace,另一端在docker0,这样就实现了容器与宿主机之间的通信。

 在bridge模式下,Docker容器与外部网络通信都是通过iptables规则控制的,这也是Docker网络性能低下的一个重要原因。使用iptables -vnL -t nat可以查看NAT表,在Chain Docker中可以看到容器桥接的规则。

[root@docker ~]# iptables -vnL -t nat
Chain DOCKER (2 references)pkts bytes target     prot opt in     out     source               destination         0     0 RETURN     all  --  br-27728db882c0 *       0.0.0.0/0            0.0.0.0/0           0     0 RETURN     all  --  docker0 *       0.0.0.0/0            0.0.0.0/0           0     0 RETURN     all  --  br-5b09991235f8 *       0.0.0.0/0            0.0.0.0/0           2   104 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:32769 to:172.17.0.2:804   208 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8000 to:172.17.0.3:802   104 DNAT       tcp  --  !docker0 *       0.0.0.0/0            192.168.242.149      tcp dpt:9000 to:172.17.0

 

5、Overlay模式

这是Docker原生的跨主机多子网的网络模型,当创建一个新的网络时,Docker会在主机上创建一个Network Namespace,Network Namespace内有一个网桥,网桥上有一个vxlan接口,每个网络占用一个vxlan ID,当容器被添加到网络中时,Docker会分配一对veth网卡设备,与bridge模式类似,一端在容器里面,另一端在本地的Network Namespace中。

         容器A、B、C都在主机A上面,而容器D、E则在主机B上面,现在通过Overlay网络模型可以实现容器A、B、D处于同一个子网,而容器C、E则处于另一个子网中。

 

Overlay中有一个vxlan ID,值得范围为256~1000,vxlan隧道会把每一个ID相同的网络沙盒连接起来实现一个子网。

相关文章:

Docker网络模型详解

目录 一、Docker网络基础 1、端口映射 使用-P选项时Docker会随机映射一个端口至容器内部的开放端口 使用docker logs查看Nginx的日志 查看映射的随机端口范围 2、使用-p可以指定要映射到的本地端口。 Local_Port:Container_Port &#xff1a; 端口映射参数中指定了宿主…...

如何打造属于自己的个人IP?

在当今信息爆炸的时代&#xff0c;个人 IP 已经成为人们在网络世界中的独特标签。无论是在职场上、创业中&#xff0c;还是在社交生活中&#xff0c;拥有个人 IP 的人都能脱颖而出&#xff0c;吸引更多的关注和机会。那么&#xff0c;如何打造属于自己的个人 IP 呢&#xff1f;…...

全网最全最细的jmeter接口测试教程以及接口测试流程详解

一、Jmeter简介 Jmeter是由Apache公司开发的一个纯Java的开源项目&#xff0c;即可以用于做接口测试也可以用于做性能测试。 Jmeter具备高移植性&#xff0c;可以实现跨平台运行。 Jmeter可以实现分布式负载。 Jmeter采用多线程&#xff0c;允许通过多个线程并发取样或通过…...

【Linux命令200例】whereis用于搜索以及定位二进制文件

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜…...

Elasticsearch:如何将整个 Elasticsearch 索引导出到文件 - Python 8.x

在实际的使用中&#xff0c;我们有时希望把 Elasticsearch 的索引保存到 JSON 文件中。在之前&#xff0c;我写了一篇管如何备份 Elasticsearch 索引的文章 “Elasticsearch&#xff1a;索引备份及恢复”。在今天&#xff0c;我们使用一种 Python 的方法来做进一步的探讨。你可…...

cmd 实现启动mysql时保留窗口

因为mysql启动后, 只有在任务管理器里能看到进程, 关的时候还需要找一下 所以基于 start cmd /k 命令实现了该效果 :: Author: admin :: Date: 2022-08-30 :: Version v1.2 :: ::启动 :: :: echo off::配置变量 set mysqlC:\mysql-5.7.38-winx64\bin\mysqld.exe::打印配置…...

JavaScript数据结构与算法——栈

文章目录 一、初始栈结构1.1 特性1.2 注意事项 二、栈结构的封装2.1 封装简单栈结构2.2 利用栈将十进制转二进制 一、初始栈结构 1.1 特性 类似于汉诺塔&#xff0c;后进先出&#xff0c;每次只能操作栈顶的元素。关键词&#xff1a;压栈、退栈 简单示意图&#xff1a; 1.…...

Elasticsearch分词详解:ES分词介绍、倒排索引介绍、分词器的作用、停用词

详见&#xff1a;https://blog.csdn.net/weixin_40612128/article/details/123476053...

SpringMVC组件

目录 1、简介 2、SpringMVC与Servlet的关系 3、struc2 4、RESTful 编程风格 5、工作流程 6、代码示例 6.1、导入坐标 provide 6.2、DispathcerServlet &#x1f53a;配置web.xml 初始化 优先级 ⭐ 6.3、Controller类及视图页面 6.4、配置注解 6.5、spring-mvc.xm…...

解决el-dialog弹出时,页面抖动,右侧会缩小的问题(即滚动条被遮罩层覆盖的问题)

问题描述&#xff1a; 在弹出el-dialog时&#xff0c;会发现弹出框弹出时&#xff0c;页面会抖动&#xff0c;滚动条被遮罩层覆盖直接没有滚动条了&#xff0c;导致页面缩小了几个像素点&#xff08;滚动条的宽度&#xff09;&#xff1b;体验感不好&#xff0c;会影响到页面的…...

【Rust 基础篇】Rust 属性宏:定制你的代码

导言 Rust是一门现代的、安全的系统级编程语言&#xff0c;它提供了丰富的元编程特性&#xff0c;其中属性宏&#xff08;Attribute Macros&#xff09;是其中之一。属性宏允许开发者在代码上方添加自定义的属性&#xff0c;并对代码进行定制化处理。在本篇博客中&#xff0c;…...

2023-08-04力扣今日三题

链接&#xff1a; 剑指 Offer 35. 复杂链表的复制 题意&#xff1a; 如题 解&#xff1a; 看题研究了好一阵&#xff0c;指针map 实际代码&#xff1a; #include<bits/stdc.h> using namespace std; class Node { public:int val;Node* next;Node* random;Node(in…...

从HTTP代理到Socks5代理:网络安全与爬虫的进化之路

一、HTTP代理&#xff1a;简介与特点 HTTP代理是一种最早的代理技术&#xff0c;通过HTTP协议转发网络请求。它能够隐藏用户的真实IP地址&#xff0c;实现匿名访问&#xff0c;为爬虫应用提供了最基本的代理功能。 HTTP代理只支持TCP协议&#xff0c;对于实时数据传输和UDP协议…...

数学建模-元胞自动机

clc clear n 300; % 定义表示森林的矩阵大小 Plight 5e-6; Pgrowth 1e-2; % 定义闪电和生长的概率 UL [n,1:n-1]; DR [2:n,1]; % 定义上左&#xff0c;下右邻居 vegzeros(n,n); % 初始化表示森林的矩阵 imh ima…...

化学合成有机化学 | 逆合成分析软件/数据库汇总

化合物逆合成路线设计软件是一类用于辅助化学家设计化合物合成路线的工具。这些软件通常基于化学知识和反应数据库&#xff0c;能够根据目标化合物的结构和性质&#xff0c;提供合成路线的建议和优化方案。以下是一些常见的化合物逆合成路线设计软件&#xff1a; IntSynth&…...

无涯教程-jQuery - Selectable选择函数

选择能力功能可与JqueryUI中的交互一起使用。此功能可在任何DOM元素上启用选择能力功能。用光标绘制一个框以选择项目。按住Ctrl键可进行多个不相邻的选择。 Select able - 语法 $( "#selectable" ).selectable(); Select able - 示例 以下是一个简单的示例&…...

MySQL修改root密码

1、使用set password命令 mysql -uroot mysql> use mysql mysql> set password for rootlocalhost PASSWORD(newpass); mysql> flush privileges; mysql> select user,host,password from user; mysql> exit 2、使用update user表 mysql -uroot mysql> …...

vue获取近七天、月份、年份的起始日和结束日

vue获取近七天的起始日和结束日 例如&#xff1a;startDate: 2023-07-29 endDate: 2023-08-04 data() {return {startDate: null,endDate: null} }, mounted() {this.calculateDateRange(); }, methods: {calculateDateRange() {var currentDate new Date();var startDate …...

android AIDL 学习使用

在android studio 2023.2中使用 1、在buidl.gradle增加以下配置&#xff0c;然后同步。不增加这些配置&#xff0c;创建aidl时显示为灰色&#xff0c;不能创建 buildFeatures {compose true// Disable unused AGP featuresbuildConfig falseaidl truerenderScript falseresVal…...

学习笔记|C251|STC32G单片机视频开发教程(冲哥)|第三集:开发环境搭建和程序下载

文章目录 1.STC-ISP软件的下载2.STC32手册下载3.PDF阅读器下载4.学会PDF阅读器查阅手册5.跟着手册搭建C251开发环境Tips:如何同时安装Keil的C51、C251和MDK 6.程序包的下载7.第一个工程的编译和下载 原作者/主讲人&#xff1a;冲哥 原始视频地址 1.STC-ISP软件的下载 STC-ISP …...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...