docker的网络模式
docker有六种网络模式:
- bridge 桥接,使用自定义的IP(默认)
- host(open) 与宿主机共享网络,开放模式
- none(close) 不分配网络,关闭模式
- Container(join) 与其他容器共享网络,联合模式
- overlay 主要用于不同宿主机上的docker容器通信和swarm services
- macvlan 将容器的虚拟网卡直接连接在主机所在的物理网络上
[root@mysql ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
c2d0f3ca5b3b bridge bridge local
2f5dd7d954b2 host host local
ac1aeee5da01 none null local
docker network命令
查看网络
docker network ls ## 查看网络列表
docker network ls -f driver=bridge ## 查看bridge网络列表
docker network ls -q ## 仅查看网络ID列表
创建网络
docker network create mynet ## 创建默认的网络mynet,类型为bridge
docker network create -d bridge mynet ## 指定网络驱动类型
docker network create --ipv6 mynet ## 开启ipv6网络
1、bridge模式
docker的默认模式即不指定任何模式就是bridge模式,也是使用比较多的模式,此模式创建的容器会为每一个容器分配自己的网络 IP等信息,并将容器连接到一个虚拟网桥与外界通信。
[root@apache ~]# docker network create --driver=bridge --subnet=192.168.0.0/16 br0
ec647379842c90a8713203194b366b9188c38834594f1c6c23883c44d9d3ba84
[root@apache ~]# docker network inspect br0
[
{
"Name": "br0",
"Id": "ec647379842c90a8713203194b366b9188c38834594f1c6c23883c44d9d3ba84",
"Created": "2021-07-05T16:24:46.268098065+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16"
}
]
2、host模式
启动的容器如果指定了使用host模式,那么新创建的容器不会创建自己的虚拟网卡,而是直接使用宿主机的网卡和IP地址,因此在容器里面查看到的IP信息就是宿主机的信息,访问容器的时候直接使用宿主机IP+容器端口即可,不过容器的其他资源们必须文件系统、系统进程等还是和宿主机保持隔离。
此模式的网络性能最高,但是各容器之间端口不能相同,适用于运行容器端口比较固定的业务。
[root@mysql ~]# docker run -d --name test --net=host nginx:v1
707d3d796fe6bbc009b161b537fdb3d866b3c5fc959d8744c23cb1e123f5e9d2
查看网络
[root@mysql ~]# docker exec -it test bash
[root@mysql /]# 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:00:78:4c brd ff:ff:ff:ff:ff:ff
inet 10.0.0.20/24 brd 10.0.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::b248:5066:37c5:1e1/64 scope link noprefixroute
valid_lft forever preferred_lft forever
inet6 fe80::ff3f:ffdb:f55a:8a15/64 scope link dadfailed tentative noprefixroute
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:90:15:87:86 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:90ff:fe15:8786/64 scope link
valid_lft forever preferred_lft forever
测试访问宿主机地址
[root@mysql ~]# curl 10.0.0.20
test nginx page
使用主机网络模式时,将丢弃已指定的端口
[root@mysql ~]# docker run -itd --name test2 -p 91:80 --net=host nginx:v1
WARNING: Published ports are discarded when using host network mode
234074fafa011ff46fa436fcd270d90c56e955415d30808356a44ab6a5321adf
3、none模式
None模式,使用参数 –net=none 指定 在使用none 模式后,Docker 容器不会进行任何网络配置,其没有网卡、没有IP也没有路由,因此默认无法与外界通信,需要手动添加网卡配置IP等,所以极少使用
[root@mysql ~]# docker run -d --name test3 --net=none -p 89:80 nginx:v1
8bd0ac1735d6ca4a5a6add3dca902743628f4fa4ca7ccb98e3d32533742aca0b
[root@mysql ~]# docker exec -it test3 bash
[root@8bd0ac1735d6 /]# 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模式,使用参数 –net=container:名称或ID 指定。 使用此模式创建的容器需指定和一个已经存在的容器共享一个网络,而不是和宿主机共享网络,新创建的容器不会创建自己的网卡也不会配置自己的IP,而是和一个已经存在的被指定的容器共享IP和端口范围,因此这个容器的端口不能和被指定的端口冲突,除了网络之外的文件系统、进程信息等仍然保持相互隔离,两个容器的进程可以通过lo网卡及容器ID进行通信
[root@mysql ~]# docker run -it -d --name nginx-web1 -p 80:80 --net=bridge nginx:v1
2c06f8fe7dffa485e76d02f471f463a65daaf2e6280e65d53764d5b1ee749fd3
[root@mysql ~]# docker run -it -d --name tomcat-web --net=container:nginx-web1 tomcat-web:app1
f44032e3efce25eeb41a4b87b250922cec7d30db2e4361093039a32bfcba9b6b
查看创建的容器网卡信息等
[root@mysql ~]# docker exec -it nginx-web1 bash
[root@2c06f8fe7dff /]# 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: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@2c06f8fe7dff /]# ss -lntp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 1 127.0.0.1:8005 0.0.0.0:*
LISTEN 0 100 0.0.0.0:8009 0.0.0.0:*
LISTEN 0 100 0.0.0.0:8080 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1,fd=6))
[root@mysql ~]# docker exec -it tomcat-web bash
[root@2c06f8fe7dff /]# 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: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@2c06f8fe7dff /]# ss -lntp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 1 127.0.0.1:8005 0.0.0.0:*
LISTEN 0 100 0.0.0.0:8009 0.0.0.0:*
LISTEN 0 100 0.0.0.0:8080 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
[root@276a71c17fbd /]# 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 276a71c17fbd
1.1.1.1 test.com