[toc]
Docker默认网络 Docker网络模式概述 Docker使用Linux桥接的方式,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。
Docker网络模式工作方式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Docker自身的4种网络工作方式,和一些自定义网络模式. Docker容器与容器之间网络相互隔离。 安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 、host. 你可以使用以下docker network ls 命令列出这些网络: [root@m01 ~] NETWORK ID NAME DRIVER SCOPE daa11493364f bridge bridge local fc5d4a69c90d host host local 16b8d6c8be22 none null local Docker内置这三个网络,运行容器时,你可以使用该--network标志来指定容器应连接到哪些网络。 该bridge网络代表docker0所有Docker安装中存在的网络。除非你使用该docker run --network=<NETWORK>选项指定,否则Docker守护程序默认将容器连接到此网络。 我们在使用docker run创建Docker容器时,可以用 --net 选项指定容器的网络模式,Docker可以有以下4种网络模式: host模式:使用 --net=host 指定。 none模式:使用 --net=none 指定。 bridge模式:使用 --net=bridge 指定,默认设置。 container模式:使用 --net=container:NAME_or_ID 指定。
Docker网络模型
配置
说明
host模式
–-network=host
容器和宿主机共享Network namespace。
container模式
–network=container:ID
容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。
none模式
–network=none
容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。
bridge模式
–network=bridge
当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。(默认为该模式
容器单向通信 让容器之间不使用ip即可通信
使用”link”选项让容器之间连接 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 docker pull busybox docker run --name test -it busybox /bin/sh docker run --name=test3 --link test -it busybox /bin/sh / PING test (172.17.0.2): 56 data bytes 64 bytes from 172.17.0.2: seq =0 ttl=64 time=0.115 ms 64 bytes from 172.17.0.2: seq =1 ttl=64 time=0.085 ms 64 bytes from 172.17.0.2: seq =2 ttl=64 time=0.069 ms 64 bytes from 172.17.0.2: seq =3 ttl=64 time=0.059 ms 64 bytes from 172.17.0.2: seq =4 ttl=64 time=0.067 ms
示例:使用”link”将”wordpress”容器连接”MySQL”容器 1 2 3 4 5 6 7 8 9 10 11 12 13 docker run \ --name wordpress_db \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD='123' \ -e MYSQL_DATABASE='wordpress' \ -e MYSQL_USER='wp_user' \ -e MYSQL_PASSWORD='123' \ -v /db_data:/var/lib/mysql \ -d mysql:5.7 docker run --name wp --link wordpress_db -p80:80 -d wordpress:v4
示例:docker启动zabbix(容器之间相互连接) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 docker run \ --name zabbix_db \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD='123' \ -e MYSQL_DATABASE='zabbix' \ -e MYSQL_USER='zabbix' \ -e MYSQL_PASSWORD='zabbix' \ -v /zabbix_db:/var/lib/mysql \ -d mysql:5.7 \ --character-set-server=utf8 \ --collation-server=utf8_bin docker run \ --name zabbix-server \ --link zabbix_db \ -p 10051:10051 \ -e MYSQL_DATABASE='zabbix' \ -e DB_SERVER_HOST="zabbix_db" \ -e MYSQL_USER="zabbix" \ -e MYSQL_PASSWORD="zabbix" \ -d zabbix/zabbix-server-mysql docker run \ --name zabbix-web \ --link zabbix-server \ --link zabbix_db \ -p 80:8080 \ -p 443:8443 \ -e DB_SERVER_HOST="zabbix_db" \ -e MYSQL_USER="zabbix" \ -e MYSQL_PASSWORD="zabbix" \ -e ZBX_SERVER_HOST="zabbix-server" \ -e PHP_TZ="Asia/Shanghai" \ -d zabbix/zabbix-web-nginx-mysql
Docker默认三种网络模式详述 桥接模式(Bridge) 相当于Vmware中的Nat模式,容器使用独立network Namespace,并连接到docker0虚拟网卡(默认模式)。通过docker0网桥以及Iptables nat表配置与宿主机通信;bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。
Bridge:Docker设计的NAT网络模型 默认类型
实现原理:
通过一个虚拟网桥,建立一个统一的网络名称空间,依赖于docker0网桥
使用及使用场景
使用特点
多个容器之间互联互通
为容器提供一个统一的网络环境
1 2 3 4 5 6 7 8 9 10 11 12 docker network ls NETWORK ID NAME DRIVER SCOPE 2154e9bd8223 bridge bridge local 19bc9cb412ac host host local 7e02e5fd429d none null local docker inspect bridge "Subnet" : "172.17.0.0/16" , "Gateway" : "172.17.0.1"
修改启动脚本修改网桥IP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 vi /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --bip=192.168.1.1/24 systemctl daemon-reload systemctl restart docker docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 192.168.1.1 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 fe80::42:bcff:fe07:9cfc prefixlen 64 scopeid 0x20<link > ether 02:42:bc:07:9c:fc txqueuelen 0 (Ethernet) RX packets 273121 bytes 45275719 (43.1 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 398786 bytes 768173681 (732.5 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
修改配置文件修改网桥IP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 vim /etc/docker/daemon.json { "bip" :"10.1.1.1/24" , "registry-mirrors" : ["https://pgz00k39.mirror.aliyuncs.com" ] } systemctl restart docker 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:bcff:fe07:9cfc prefixlen 64 scopeid 0x20<link > ether 02:42:bc:07:9c:fc txqueuelen 0 (Ethernet) RX packets 273115 bytes 45275503 (43.1 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 398780 bytes 768173377 (732.5 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
主机模式(host) 相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。众所周知,Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
Host:与宿主机共享Network Namespace,–network=host 性能最高
解释:
host模式主要用于跟宿主主机相连,此时docker容器不会虚拟出自己的网卡。
优点:
共享宿主主机网络,无需再做网络转发
性能比较好
缺点:
隔离性不强
容易跟宿主主机服务之间起冲突(端口冲突)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 docker run -it --network=host busybox /bin/sh / docker0 Link encap:Ethernet HWaddr 02:42:BC:07:9C:FC inet addr:10.1.1.1 Bcast:10.1.1.255 Mask:255.255.255.0 inet6 addr: fe80::42:bcff:fe07:9cfc/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:273121 errors:0 dropped:0 overruns:0 frame:0 TX packets:398786 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:45275719 (43.1 MiB) TX bytes:768173681 (732.5 MiB) eth0 Link encap:Ethernet HWaddr 00:0C:29:A8:0A:B6 inet addr:10.0.0.81 Bcast:10.0.0.255 Mask:255.255.255.0 inet6 addr: fe80::4cb7:9974:9892:56d8/64 Scope:Link inet6 addr: fe80::d007:54f5:fd7a:ef6a/64 Scope:Link inet6 addr: fe80::a7:8d0:fa05:ebc8/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 ....
容器模式(container) 这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。
Container:与另一个运行中的容器共享Network Namespace,–net=container:containerID(K8S)
解释:
一个容器将网络共享给另外一个容器使用(两个容器之间网络其实是一个网络,共用一块儿网卡)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 docker run -it --network=container:9dbc3b24fd1d nginx:alpine docker run -it centos:7 /bin/bash docker run -it --network=container:9dbc3b24fd1d nginx:alpine docker run -it --network=container:9dbc3b24fd1d busybox /bin/sh / eth0 Link encap:Ethernet HWaddr 02:42:0A:01:01:03 inet addr:10.1.1.3 Bcast:10.1.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:656 (656.0 B) TX bytes:0 (0.0 B) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:22 errors:0 dropped:0 overruns:0 frame:0 TX packets:22 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2066 (2.0 KiB) TX bytes:2066 (2.0 KiB) [root@9dbc3b24fd1d /] 10.1.1.3 [root@9dbc3b24fd1d /] <!DOCTYPE html> <html> <head > <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/" >nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/" >nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
无网络模式(none) 使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过–network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。
None:容器不配置任何网络功能,–network=none
解释:
none模式只为容器提供一个lo回环网络,外界是无法与容器进行互联互通。
优点:
缺点:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 docker run -it --network=none busybox /bin/sh docker run -it --network=none busybox /bin/sh / lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Docker自定义网路模式 除了以上得四种网络我们也可以创建自定义网络
自定义网络介绍 建议使用自定义的网桥来控制哪些容器可以相互通信,还可以自动DNS解析容器名称到IP地址。Docker提供了创建这些网络的默认网络驱动程序,你可以创建一个新的Bridge网络,Overlay或Macvlan网络。你还可以创建一个网络插件或远程网络进行完整的自定义和控制。
你可以根据需要创建任意数量的网络,并且可以在任何给定时间将容器连接到这些网络中的零个或多个网络。此外,您可以连接并断开网络中的运行容器,而无需重新启动容器。当容器连接到多个网络时,其外部连接通过第一个非内部网络以词法顺序提供。
#也就是一句话 自定义网络模式 就是启动容器时 知道自己创建得网络模式 容器与容器之间就可以通信了
自定义网络操作语法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 docker network [cmd] docker network ls NETWORK ID NAME DRIVER SCOPE a985cfca04ae bridge bridge local a425f4733836 host host local 5902bdedd1b1 lnmd bridge local ce7e9b514c2a none null local docker network create -d <mode>--subnet<CIDR> --gateway <网关> <自定义网络名称> docker run --network <自定义网络名称> <镜像名称> docker network create -d bridge --subnet 192.168.100.0/24 --gateway 192.168.100.1 name VPC(不同网段)
示例:模拟创建自定义网络环境 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 docker network create -d bridge --subnet 192.168.10.0/24 --gateway 192.168.10.1 wangzhe docker network ls NETWORK ID NAME DRIVER SCOPE 553146c9dbeb bridge bridge local 19bc9cb412ac host host local 7e02e5fd429d none null local c7c39fb300be wangzhe bridge local docker network create -d bridge --subnet 192.168.100.0/24 --gateway 192.168.100.1 lol docker network ls NETWORK ID NAME DRIVER SCOPE 553146c9dbeb bridge bridge local 19bc9cb412ac host host local 5d4bf27f621e lol bridge local 7e02e5fd429d none null local c7c39fb300be wangzhe bridge local docker run --name wangzhe1 -it --network=wangzhe busybox /bin/sh / eth0 Link encap:Ethernet HWaddr 02:42:C0:A8:0A:02 inet addr:192.168.10.2 Bcast:192.168.10.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:656 (656.0 B) TX bytes:0 (0.0 B) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) / PING wangzhe2 (192.168.10.3): 56 data bytes 64 bytes from 192.168.10.3: seq =0 ttl=64 time=0.072 ms 64 bytes from 192.168.10.3: seq =1 ttl=64 time=0.111 ms 64 bytes from 192.168.10.3: seq =2 ttl=64 time=0.109 ms 64 bytes from 192.168.10.3: seq =3 ttl=64 time=0.073 ms 64 bytes from 192.168.10.3: seq =4 ttl=64 time=5.863 ms docker run --name wangzhe2 -it --network=wangzhe busybox /bin/sh / PING wangzhe1 (192.168.10.2): 56 data bytes 64 bytes from 192.168.10.2: seq =0 ttl=64 time=0.048 ms 64 bytes from 192.168.10.2: seq =1 ttl=64 time=0.106 ms 64 bytes from 192.168.10.2: seq =2 ttl=64 time=0.306 ms 64 bytes from 192.168.10.2: seq =3 ttl=64 time=0.100 ms 64 bytes from 192.168.10.2: seq =4 ttl=64 time=0.059 ms docker run --name lol1 -it --network=lol busybox /bin/sh / eth0 Link encap:Ethernet HWaddr 02:42:C0:A8:64:02 inet addr:192.168.100.2 Bcast:192.168.100.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:13 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1102 (1.0 KiB) TX bytes:0 (0.0 B) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) / PING 192.168.10.1 (192.168.10.1): 56 data bytes 64 bytes from 192.168.10.1: seq =0 ttl=64 time=0.116 ms ^C --- 192.168.10.1 ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 0.116/0.116/0.116 ms / PING 192.168.10.2 (192.168.10.2): 56 data bytes ^C --- 192.168.10.2 ping statistics --- 2 packets transmitted, 0 packets received, 100% packet loss / PING 192.168.10.3 (192.168.10.3): 56 data bytes ^C --- 192.168.10.3 ping statistics --- 2 packets transmitted, 0 packets received, 100% packet loss / PING 192.168.100.3 (192.168.100.3): 56 data bytes 64 bytes from 192.168.100.3: seq =0 ttl=64 time=0.086 ms 64 bytes from 192.168.100.3: seq =1 ttl=64 time=0.251 ms 64 bytes from 192.168.100.3: seq =2 ttl=64 time=0.067 ms 64 bytes from 192.168.100.3: seq =3 ttl=64 time=0.100 ms 64 bytes from 192.168.100.3: seq =4 ttl=64 time=0.106 ms ^C --- 192.168.100.3 ping statistics --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max = 0.067/0.122/0.251 ms / PING lol2 (192.168.100.3): 56 data bytes 64 bytes from 192.168.100.3: seq =0 ttl=64 time=0.047 ms 64 bytes from 192.168.100.3: seq =1 ttl=64 time=0.089 ms ^C --- lol2 ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 0.047/0.068/0.089 ms / ping: bad address 'wangzhe1' docker run --name lol2 -it --network=lol busybox /bin/sh / eth0 Link encap:Ethernet HWaddr 02:42:C0:A8:64:03 inet addr:192.168.100.3 Bcast:192.168.100.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:6 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:516 (516.0 B) TX bytes:0 (0.0 B) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) ifconfig br-5d4bf27f621e: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.100.1 netmask 255.255.255.0 broadcast 192.168.100.255 inet6 fe80::42:24ff:fe93:7184 prefixlen 64 scopeid 0x20<link > ether 02:42:24:93:71:84 txqueuelen 0 (Ethernet) RX packets 13 bytes 1106 (1.0 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 21 bytes 1762 (1.7 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 br-c7c39fb300be: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.10.1 netmask 255.255.255.0 broadcast 192.168.10.255 inet6 fe80::42:2aff:fe50:4ac8 prefixlen 64 scopeid 0x20<link > ether 02:42:2a:50:4a:c8 txqueuelen 0 (Ethernet) RX packets 13 bytes 1106 (1.0 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 21 bytes 1762 (1.7 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
示例: 1.wordpress和mysql启动在同一个网段中 2.zabbix和mysql也启动在同一个网段中
1 2 3 4 wordpress 和 zabbix 共用一个MySQL wordpress zabbix