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等信息,并将容器连接到一个虚拟网桥与外界通信。

 

docker 的网 docker的网络类型_mysql

 

 

[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