最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

Docker网络类型

来源:博客园

Docker网络类型

目录
  • Docker网络类型
    • 跟VMware对比
        • VMware
        • Docker
        • route命令
    • Docker的网络工作模式
        • Bridge模式
        • host模式
        • Container模式
        • none模式
        • 自定义网络模式

跟VMware对比

VMware

VMware工作模式

  • 1.桥接模式
    • 物理机网卡 和 虚拟机网卡桥接,让虚拟机IP和物理机IP在同一网段(上外网)
  • 2.NAT模式
    • 动态网络地址转换:让物理机的网卡编程路由器,虚拟机分配虚拟地址(上外网)
  • 3.仅主机模式
    • 让物理机成为一个局域网,所有其他虚拟机可自定义网段,但是不能上外网

Docker

Docker工作模式


(相关资料图)

  • 1.Bridge 桥接模式
  • 2.host模式
  • 3.Container模式
  • 4.none模式
  • 5.自定义网络模式

查看网络模式

# 查看docker网络,网卡模式[root@db01 ~]$ docker network lsNETWORK ID     NAME      DRIVER    SCOPE095c17b7eaf3   bridge    bridge    local48b1d8e70d2e   host      host      local2a9cba9f52b0   none      null      local

Docker内置这三个网络,运行容器时,你可以使用该来指定容器应连接到哪些网络

我们在使用docker run创建Docker容器时,可以用

--network选项指定容器的网络模式,Docker有以下4种网络模式:

  • host模式:使用 --net=host指定。
  • none模式:使用 --net=none指定。
  • bridge模式:使用 --net=bridge指定,默认设置
  • container模式:使用 --net=container:NAME_or_ID指定

route命令

route 命令能够用于 IP 路由表的显示和操作

# 宿主机执行[root@db01 ~]$ route -nKernel IP routing tableDestination     Gateway         Genmask         Flags Metric Ref    Use Iface0.0.0.0         10.0.0.2        0.0.0.0         UG    100    0        0 eth00.0.0.0         172.16.1.2      0.0.0.0         UG    101    0        0 eth110.0.0.0        0.0.0.0         255.255.255.0   U     100    0        0 eth0172.16.1.0      0.0.0.0         255.255.255.0   U     101    0        0 eth1172.16.2.0      0.0.0.0         255.255.255.0   U     0      0        0 br-195666802e7b192.168.200.0   0.0.0.0         255.255.255.0   U     0      0        0 docker0# 容器内执行/ # route -nKernel IP routing tableDestination     Gateway         Genmask         Flags Metric Ref    Use Iface0.0.0.0         172.16.2.1      0.0.0.0         UG    0      0        0 eth0172.16.2.0      0.0.0.0         255.255.255.0   U     0      0        0 eth0# Flags 标志说明:U:Up 表示此路由当前为启动状态H:Host,表示此网关为一主机G:Gateway,表示此网关为一路由器R:Reinstate Route,使用动态路由重新初始化的路由D:Dynamically,此路由是动态性地写入–》什么时候才会有动态的路由信息呢?M:Modified,此路由是由路由守护程序或导向器动态修改

Docker的网络工作模式

Bridge模式

不指定是默认也是这种模式,这种模式会为每个容器分配一个独立的network 网卡,同一个宿主机是在同一个网段下可以通信的,类似于 VMware 的 NAT模式

# 使用docker镜像做网络测试[root@db01 ~]$ docker pull busybox# 运行容器[root@db01 ~]$ docker run -it -d busybox /bin/sh## 修改方式一:# 修改桥接网卡的IP[root@db01 ~]$ vim /usr/lib/systemd/system/docker.serviceExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --bip=192.168.100.1/24[root@db01 ~]$ systemctl daemon-reload[root@db01 ~]$ systemctl restart docker## 修改方式二:# 修改docker配置文件[root@db01 ~]$ vim /etc/docker/daemon.json {  "bip": "192.168.200.1/24",# 添加外网网段  "registry-mirrors": ["https://pgz00k39.mirror.aliyuncs.com"]}# 进入容器  查看ip[root@db01 ~]$ docker exec -it ecc /bin/sh/ # ip a1: lo:  mtu 65536 qdisc noqueue 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 forever79: eth0@if80:  mtu 1500 qdisc noqueue     link/ether 02:42:c0:a8:c8:02 brd ff:ff:ff:ff:ff:ff    inet 192.168.200.2/24 brd 192.168.200.255 scope global eth0# 192.168.200.2       valid_lft forever preferred_lft forever# 查看宿主机网络[root@db01 ~]$ ip a4: docker0:  mtu 1500 qdisc noqueue state UP group default     link/ether 02:42:d7:5c:40:a8 brd ff:ff:ff:ff:ff:ff    inet 192.168.200.1/24 brd 192.168.200.255 scope global docker0       valid_lft forever preferred_lft forever    inet6 fe80::42:d7ff:fe5c:40a8/64 scope link       valid_lft forever preferred_lft forever

host模式

host模式类似于Vmware的桥接模式,一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口

# 使用host网络模式启动容器[root@db01 ~]$ docker run -it --network host -d busybox /bin/she7cefe97f3a9938480e07ef6e7eaca5b951841deb1d0b807e820452b6b7d05e8# 进入容器查看网络,与宿主机网络一致[root@db01 ~]$ docker exec -it e7 /bin/sh/ # ip a1: lo:  mtu 65536 qdisc noqueue 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 forever2: eth0:  mtu 1500 qdisc pfifo_fast qlen 1000    link/ether 00:0c:29:84:f6:84 brd ff:ff:ff:ff:ff:ff    inet 10.0.0.51/24 brd 10.0.0.255 scope global noprefixroute eth0       valid_lft forever preferred_lft forever    inet6 fe80::20c:29ff:fe84:f684/64 scope link        valid_lft forever preferred_lft forever3: eth1:  mtu 1500 qdisc pfifo_fast qlen 1000    link/ether 00:0c:29:84:f6:8e brd ff:ff:ff:ff:ff:ff    inet 172.16.1.51/24 brd 172.16.1.255 scope global noprefixroute eth1       valid_lft forever preferred_lft forever    inet6 fe80::20c:29ff:fe84:f68e/64 scope link        valid_lft forever preferred_lft forever4: docker0:  mtu 1500 qdisc noqueue     link/ether 02:42:d7:5c:40:a8 brd ff:ff:ff:ff:ff:ff    inet 192.168.200.1/24 brd 192.168.200.255 scope global docker0       valid_lft forever preferred_lft forever    inet6 fe80::42:d7ff:fe5c:40a8/64 scope link        valid_lft forever preferred_lft forever# 通过namespace隔离,和宿主机共用一块网卡

总结: 模式简单并且性能高,host 模式下面的网络模型是最简单和最低延迟的模式,容器进程直接与主机网络接口通信,与物理机性能一致,host 不利于网络自定配置和管理,并且所有主机的容器使用相同的IP。也不利于主机资源的利用。对网络性能要求比较高。

Container模式

Container:与另一个运行中的容器共享Network Namespace,--net=container:containerID(K8S)

Docker网络container模式是指,创建新容器的时候,通过--net container参数,指定其和已经存在的某个容器共享一个 Network Namespace,但这两个容器在其他的资源上,如文件系统、进程列表等还是隔离的。

# 常规启动容器[root@db01 ~]$ docker run -itd centos:7 /bin/bash02e42bf656c9d7c9f88337d6f51bcbc6ed458c705422975a7d0bdaac8564a849# 进入容器[root@db01 ~]$ docker exec -it 02e /bin/bash# c7没有ip命令,curl一下本机,不通[root@02e42bf656c9 /]# curl 172.0.0.1curl: (7) Failed connect to 172.0.0.1:80; Connection refused# 启动一个容器,使用Container模式与上面使用host模式的容器共享网络[root@db01 ~]$ docker run -itd --net=container:e7cefe97f3a9 centos:7 /bin/bash282ecf3dcac6b59713d4224d04da8d07b5ba06d80e0f5198283379a9d26dde81# 进入容器测试[root@db01 ~]$ docker exec -it 282ecf3dcac /bin/bash# 网络通畅[root@db01 /]# curl 127.0.0.1  微信html5游戏平台——9miao.com国内最大微信开发者社区<script>document.domain = "mp.9g.com";</script>

none模式

none模式,顾名思义就是没有网络

使用none容器里面就没有网卡(除了 lo),所以不提供网络服务,无法与别的容器互访,也无法访问主机

# 启动一个使用neno模式的容器[root@db01 ~]$ docker run -itd --net=none busybox:latest /bin/sh6c702574f78b04618e4d966bb4478d844842fea586c673baddff1e6742745ff7# 进入容器查看网卡信息[root@db01 ~]$ docker exec -it 6c702574f78 /bin/sh# 只有一块本地回环地址的网卡,无网络/ # ifconfig 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 network create -d <网络模式> --subnet <网段> --gateway <网关> <自定义网路名称>[root@db01 ~]$ docker network create -d bridge --subnet 172.16.2.0/24 --gateway 172.16.2.1 my_networkaa9e88d8509e7d76ae3cd9306017d0b285a72a01f9810e3ec22eb395fc449ef9## 查看网络[root@db01 ~]$ docker network lsNETWORK ID     NAME         DRIVER    SCOPE20e5d44191b0   bridge       bridge    local48b1d8e70d2e   host         host      localaa9e88d8509e   my_network   bridge    local2a9cba9f52b0   none         null      local## 使用自定义网络启动容器[root@db01 ~]$ docker run -it --network my_network -d busybox /bin/sh## 删除自定义网络[root@db01 ~]$ docker network rm 网络ID 或者 网络名称[root@db01 ~]$ docker network rm my_network my_network[root@db01 ~]$ docker network lsNETWORK ID     NAME      DRIVER    SCOPE20e5d44191b0   bridge    bridge    local48b1d8e70d2e   host      host      local2a9cba9f52b0   none      null      local-------------------------------------------------------------------------------------------------------------------# 使用自定义的bridge模式启动多个容器[root@db01 ~]$ docker run -it --net=my_network -d busybox /bin/sh068d9f27b5d727877df380fbee0ae7e45f13ee5791d5137510cc4674a7bcb933[root@db01 ~]$ docker run -it --net=my_network -d busybox /bin/shb2cc3594a941b8044ed6217ca9d60dcb38fff314f18c54899c870dd4438eb4af# 进入容器,查看网络信息[root@db01 ~]$ docker exec -it b2cc3594a9 /bin/sh/ # ip a1: lo:  mtu 65536 qdisc noqueue 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 forever91: eth0@if92:  mtu 1500 qdisc noqueue     link/ether 02:42:ac:10:02:03 brd ff:ff:ff:ff:ff:ff    inet 172.16.2.3/24 brd 172.16.2.255 scope global eth0       valid_lft forever preferred_lft forever[root@db01 ~]$ docker exec -it 068d9f27b5d /bin/sh/ # ip a1: lo:  mtu 65536 qdisc noqueue 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 forever89: eth0@if90:  mtu 1500 qdisc noqueue     link/ether 02:42:ac:10:02:02 brd ff:ff:ff:ff:ff:ff    inet 172.16.2.2/24 brd 172.16.2.255 scope global eth0       valid_lft forever preferred_lft forever# 与网段内 容器网络互通/ # ping 172.16.2.3PING 172.16.2.3 (172.16.2.3): 56 data bytes64 bytes from 172.16.2.3: seq=0 ttl=64 time=0.131 ms64 bytes from 172.16.2.3: seq=1 ttl=64 time=0.101 ms64 bytes from 172.16.2.3: seq=2 ttl=64 time=0.121 ms# 与宿主机网络互通PING 10.0.0.51 (10.0.0.51): 56 data bytes64 bytes from 10.0.0.51: seq=0 ttl=64 time=0.201 ms64 bytes from 10.0.0.51: seq=1 ttl=64 time=0.103 ms64 bytes from 10.0.0.51: seq=2 ttl=64 time=0.105 ms# 与外网网络互通/ # ping www.baidu.comPING www.baidu.com (180.101.49.12): 56 data bytes64 bytes from 180.101.49.12: seq=0 ttl=127 time=12.494 ms64 bytes from 180.101.49.12: seq=1 ttl=127 time=11.972 ms64 bytes from 180.101.49.12: seq=2 ttl=127 time=12.754 ms

关键词: