bridge:默认网络,Docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中;IP地址段是172.17.0.1/16
在docker安装好以后就会有一个docker默认网络

# brctl show
bridge name bridge id       STP enabled interfaces
docker0     8000.02426d8b7049   no      启动一个容器
# docker run -itd --name test01 centos
a71988e84605c994374ecc56bb6b2675f9cba65b108a44df403135bae730cec5创建了一个网卡对
# brctl show
bridge name bridge id       STP enabled interfaces
docker0     8000.02426d8b7049   no      veth84e5035# ip link
11: veth84e5035@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default link/ether 76:ab:8c:55:08:29 brd ff:ff:ff:ff:ff:ff link-netnsid 0进入容器自动生成ip地址
# docker attach test01yum -y install net-tools iproute
[root@a71988e84605 /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)RX packets 2424  bytes 10800077 (10.2 MiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 2148  bytes 131501 (128.4 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0网关为172.17.0.1
[root@a71988e84605 /]# ip route
default via 172.17.0.1 dev eth0 docker访问外网做了snat:
# iptables -L -n -t nat -v
Chain POSTROUTING (policy ACCEPT 302 packets, 22293 bytes)pkts bytes target     prot opt in     out     source               destination         105  6525 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0           

host:与主机的网络完全一致

启动一个容器:
# docker run -itd --name test02 --net=host centos:self
4c3e8c76c9793c8e87181e6bc90b634f80acde1fd1cc52bc18cbc50cba3ebd6c与主机的网络一致:
# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255inet6 fe80::42:6dff:fe8b:7049  prefixlen 64  scopeid 0x20<link>ether 02:42:6d:8b:70:49  txqueuelen 0  (Ethernet)RX packets 5874  bytes 3829100 (3.6 MiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 7274  bytes 13690008 (13.0 MiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 10.0.0.5  netmask 255.255.255.0  broadcast 10.0.0.255inet6 fe80::20c:29ff:fe33:ffd2  prefixlen 64  scopeid 0x20<link>ether 00:0c:29:33:ff:d2  txqueuelen 1000  (Ethernet)RX packets 89266  bytes 113049099 (107.8 MiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 25124  bytes 7176772 (6.8 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 32  bytes 13560 (13.2 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 32  bytes 13560 (13.2 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0veth84e5035: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet6 fe80::74ab:8cff:fe55:829  prefixlen 64  scopeid 0x20<link>ether 76:ab:8c:55:08:29  txqueuelen 0  (Ethernet)RX packets 2652  bytes 172322 (168.2 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 2915  bytes 12197820 (11.6 MiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

none:获取独立的network namespace,但不为容器进行任何网络配置

启动一个容器
# docker run -itd --name test03 --net=none centos:self
9c7cd0dea4a288b214325b75a16b827c1ac7bdad4717d638b0d52a27cf1f560c查看网络模式
# docker inspect -f '{{.HostConfig.NetworkMode}}' test03
none查看pid
# C_PID=$(docker inspect -f '{{.State.Pid}}' test03)
# echo $C_PID
12263# 创建network namespace目录并将容器的network namespace软连接到此目录,以便ip netns命令读取
mkdir -p /var/run/netns
ln -s /proc/$C_PID/ns/net /var/run/netns/$C_PID
# 添加虚拟网卡veth+容器PID,类型是veth pair,名称是vp+容器PID
ip link add veth$C_PID type veth peer name vp$C_PID检查是否已经成功添加:
# ip link
12: vp12263@veth12263: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000link/ether f2:6f:17:b8:e5:57 brd ff:ff:ff:ff:ff:ff
13: veth12263@vp12263: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000link/ether 26:a9:fe:6b:d9:37 brd ff:ff:ff:ff:ff:ff# 添加虚拟网卡到br0网桥
# brctl addif docker0 veth$C_PID
# brctl show
bridge name bridge id       STP enabled interfaces
docker0     8000.02426d8b7049   no      veth12263veth84e5035# 激活虚拟网卡
ip link set veth$C_PID up
# ifconfig
veth12263: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500ether 26:a9:fe:6b:d9:37  txqueuelen 1000  (Ethernet)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0# 给进程配置一个network namespace
ip link set vp$C_PID netns $C_PID
# ip netns exec $C_PID ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
12: vp12263@if13: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000link/ether f2:6f:17:b8:e5:57 brd ff:ff:ff:ff:ff:ff link-netnsid 0# docker attach test03
[root@9c7cd0dea4a2 /]# ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536inet 127.0.0.1  netmask 255.0.0.0loop  txqueuelen 1000  (Local Loopback)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0# 在容器进程里面设置网卡信息
ip netns exec $C_PID ip link set dev vp$C_PID name eth0
ip netns exec $C_PID ip link set eth0 up
# docker attach test03
[root@9c7cd0dea4a2 /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500ether f2:6f:17:b8:e5:57  txqueuelen 1000  (Ethernet)RX packets 7  bytes 586 (586.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)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.0loop  txqueuelen 1000  (Local Loopback)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0# 设置容器网络信息
IP='172.17.0.4/24'
GW='172.17.0.1'
ip netns exec $C_PID ip addr add $IP dev eth0
ip netns exec $C_PID ip route add default via $GW
ip netns exec $C_PID ip addr add 172.17.0.4/24 dev eth0
ip netns exec $C_PID ip route add default via 172.17.0.1# docker attach test03
[root@9c7cd0dea4a2 /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 172.17.0.4  netmask 255.255.255.0  broadcast 0.0.0.0ether f2:6f:17:b8:e5:57  txqueuelen 1000  (Ethernet)RX packets 8  bytes 656 (656.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)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.0loop  txqueuelen 1000  (Local Loopback)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0[root@9c7cd0dea4a2 /]# ping www.163.com
PING www.163.com.lxdns.com (182.136.72.133) 56(84) bytes of data.
64 bytes from 182.136.72.133 (182.136.72.133): icmp_seq=1 ttl=55 time=13.7 ms
64 bytes from 182.136.72.133 (182.136.72.133): icmp_seq=2 ttl=55 time=12.8 ms
64 bytes from 182.136.72.133 (182.136.72.133): icmp_seq=3 ttl=55 time=11.5 ms

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

# docker run -itd --name test04 --net=container:test03 centos:self
2bacf77aecc40fadb88f76b4bc7b28ef2e05b34cfeebdfa687ae1c9e3fd3edaa两个容器网卡配置是一样的:# docker attach test04
[root@9c7cd0dea4a2 /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 172.17.0.4  netmask 255.255.255.0  broadcast 0.0.0.0ether f2:6f:17:b8:e5:57  txqueuelen 1000  (Ethernet)RX packets 15  bytes 1294 (1.2 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 7  bytes 536 (536.0 B)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.0loop  txqueuelen 1000  (Local Loopback)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0# docker attach test03
[root@9c7cd0dea4a2 /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 172.17.0.4  netmask 255.255.255.0  broadcast 0.0.0.0ether f2:6f:17:b8:e5:57  txqueuelen 1000  (Ethernet)RX packets 15  bytes 1294 (1.2 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 7  bytes 536 (536.0 B)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.0loop  txqueuelen 1000  (Local Loopback)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

自定义:自定义网桥,默认与bridge网络一样。

安装网桥命令:
# yum -y install bridge-utils创建一个新的网桥:
# brctl  addbr br0
# brctl show
bridge name bridge id       STP enabled interfaces
br0     8000.000000000000   no
docker0     8000.02426d8b7049   no      veth12263veth84e5035配置网桥地址:
# cat > /etc/sysconfig/network-scripts/ifcfg-br0 << EOF
DEVICE="br0"
BOOTPROTO="static"
NM_CONTROLLED="no"
IPADDR=192.168.102.10
NETMASK=255.255.255.0
GATEWAY=192.168.102.1
DNS1=10.0.0.1
ONBOOT="yes"
TYPE="Bridge"
DELAY=0
EOF将eth0的配置文件/etc/sysconfig/network-scripts/ifcfg-ens37的内容修改为:
# cat > /etc/sysconfig/network-scripts/ifcfg-ens37 << EOF
DEVICE="ens37"
BOOTPROTO="static"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethernet"
BRIDGE="br0"
EOF# systemctl restart network启动一个none类型的容器:
# docker run -itd --name test05 --net=none centos:self
7868a13e4b8e844ed52a968b2009db1498573efb62a504b85c344cd46af9b746查看网络类型
# docker inspect -f '{{.HostConfig.NetworkMode}}' test05
none查看pid
# C_PID=$( docker inspect -f '{{.State.Pid}}' test05)
# echo $C_PID
12856创建network namespace目录并将容器的network namespace软连接到此目录,以便ip netns命令读取
# ln -sv /proc/12856/ns/net /var/run/netns/$C_PID
‘/var/run/netns/12856’ -> ‘/proc/12856/ns/net’
# ll /var/run/netns/
total 0
lrwxrwxrwx 1 root root 18 Apr 15 12:41 12263 -> /proc/12263/ns/net
lrwxrwxrwx 1 root root 18 Apr 15 13:56 12856 -> /proc/12856/ns/net# 添加虚拟网卡veth+容器PID,类型是veth peer,名称是vp+容器PID
# ip link add veth$C_PID type veth peer name pv$C_PID
# ip link
15: pv12856@veth12856: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000link/ether 62:65:26:6f:71:5d brd ff:ff:ff:ff:ff:ff
16: veth12856@pv12856: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000link/ether 9e:86:2a:67:b3:56 brd ff:ff:ff:ff:ff:ff# 添加虚拟网卡到br0网桥并激活
# brctl addif br0 veth$C_PID
# brctl show
bridge name bridge id       STP enabled interfaces
br0     8000.9e862a67b356   no      veth12856
docker0     8000.02426d8b7049   no      veth12263veth84e503
# ip link set veth$C_PID up#把虚拟网卡加入名称空间
# ip link set pv$C_PID netns $C_PID设置docker里网卡名称,并激活网卡
# ip netns exec $C_PID ip link set pv$C_PID name eth0
# ip netns exec $C_PID ip link set eth0 up配置docker网卡ip地址
IP='192.168.102.11/24'
GW='192.168.102.1'ip netns exec $C_PID ip addr add $IP dev eth0
ip netns exec $C_PID ip route add default via $GW

docker的五种网络(六):相关推荐

  1. docker的五种网络模式

    目录 一.bridge网络(网桥的方式) 二.host网络 三.none网络 四.自定义网络 五.container模式 一.bridge网络(网桥的方式) 可以很清楚的看出容器和宿主机的关系,当我们 ...

  2. Docker的四种网络模式和相关网络命令等操作

    Docker网络模式 一.实现原理 二.Docker四种网络模式 三.Docker命令 1.查看网络列表 2.自定义网络固定IP 3.暴露端口 4.在宿主机环境执行容器内命令 5.怎么把宿主机的文件传 ...

  3. 因为取了个快递我搞懂了五种网络IO模型

    五种网络IO模型 目录 前段时间,我有个朋友因为拿快递和家里闹别扭了,今天我就借这事来讲讲五大网络模型 阻塞IO模型 第一天: 刘:今天因为拿快递被我妈骂了一顿 我:说来听听 刘:我本来在家里打扫家务 ...

  4. Docker的四种网络模式

    docker run创建Docker容器时,可以用–net选项指定容器的网络模式,Docker有以下4种网络模式: bridge模式:使用–net =bridge指定,默认设置: host模式:使用– ...

  5. 5、Docker 的四种网络模式

    5.1 Docker 的四种网络模式 网络模式 网络配置 说明 host(开放式网络模式) –network host 容器和宿主机共享 Network namespace container(联合挂 ...

  6. 五种网络IO模型:阻塞式IO 非阻塞式IO IO复用(IO multiplexing) 信号驱动式IO 异步IO

    文章目录 五种网络IO模型 举例说明 阻塞式I/O模型 非阻塞式I/O I/O多路复用 信号驱动式I/O 异步I/O 比较结果 总结 同步 异步 阻塞 非阻塞 阻塞/非阻塞: 同步/异步: 举例子:小 ...

  7. 从零开始学习docker(五)网络的另外两种类型host,none

    撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 前面我们已经介绍了bridge network,比较复杂.这一节介绍host和none这两种简单的network ...

  8. Docker的4种网络模式

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

  9. Docker 的4种网络模式

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

最新文章

  1. Linux C编程之一:Linux下c语言的开发环境
  2. 实易智能DNS单台设备QPS高达28万
  3. linux下eclipse的使用教程,linux下Eclipse的使用方法总结.doc
  4. LDD3源码分析之字符设备驱动程序
  5. LeetCode Sort List(单链表归并排序)
  6. JBoss/Wildfly 配置SQLserver服务器
  7. ABI 与 API 的区别(应用程序二进制接口、应用程序编程接口)
  8. 自己的数字选择控件NumberPicker
  9. 拦截Activity的后退键处理
  10. 将Github中Fork的代码,克隆到本地
  11. 剑指Offer——链表中倒数第K个节点
  12. php未定义常量破解,PHP未定义的常量错误没有意义
  13. Unity3d gameObject
  14. WPF制作QQ列表(仿qq列表特效)
  15. 服务器系统日志应怎么查看,怎么查看服务器操作系统日志
  16. 通过IIS发布网站教程【十分钟完成一个网站发布】
  17. 魔兽争霸3技术分析资源汇总
  18. 100M 免费 ASP + Access 空间 100M 免费 php+mysql 空间
  19. 洪恩软件进军网游产业 池宇峰揭密完美世界
  20. 故障解决:发生系统错误 67 找不到网络名

热门文章

  1. 冰河是谁?到底是干嘛的?
  2. 小雅深访 |富国朱少醒最完整的投资逻辑(2017年12月)
  3. 我们需要什么样的软件工程师(上)[转载]
  4. 每个毒鸡汤背后都有说不出的话在内吧?
  5. 珠海高新区领导一行莅临道可云参观考察
  6. 【openGauss】在WPS表格里制作连接到openGauss的实时刷新报表
  7. android下的gradle升级,Android Studio Gradle版本升级简单方法
  8. android滴滴位置实现,百度地图实现【仿滴滴打车】
  9. java 解决微信配置服务器时出现的token验证失败问题
  10. 微信群里一道六年级数学题,求阴影面积,那我只能用python代码了