docker的五种网络(六):
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的五种网络(六):相关推荐
- docker的五种网络模式
目录 一.bridge网络(网桥的方式) 二.host网络 三.none网络 四.自定义网络 五.container模式 一.bridge网络(网桥的方式) 可以很清楚的看出容器和宿主机的关系,当我们 ...
- Docker的四种网络模式和相关网络命令等操作
Docker网络模式 一.实现原理 二.Docker四种网络模式 三.Docker命令 1.查看网络列表 2.自定义网络固定IP 3.暴露端口 4.在宿主机环境执行容器内命令 5.怎么把宿主机的文件传 ...
- 因为取了个快递我搞懂了五种网络IO模型
五种网络IO模型 目录 前段时间,我有个朋友因为拿快递和家里闹别扭了,今天我就借这事来讲讲五大网络模型 阻塞IO模型 第一天: 刘:今天因为拿快递被我妈骂了一顿 我:说来听听 刘:我本来在家里打扫家务 ...
- Docker的四种网络模式
docker run创建Docker容器时,可以用–net选项指定容器的网络模式,Docker有以下4种网络模式: bridge模式:使用–net =bridge指定,默认设置: host模式:使用– ...
- 5、Docker 的四种网络模式
5.1 Docker 的四种网络模式 网络模式 网络配置 说明 host(开放式网络模式) –network host 容器和宿主机共享 Network namespace container(联合挂 ...
- 五种网络IO模型:阻塞式IO 非阻塞式IO IO复用(IO multiplexing) 信号驱动式IO 异步IO
文章目录 五种网络IO模型 举例说明 阻塞式I/O模型 非阻塞式I/O I/O多路复用 信号驱动式I/O 异步I/O 比较结果 总结 同步 异步 阻塞 非阻塞 阻塞/非阻塞: 同步/异步: 举例子:小 ...
- 从零开始学习docker(五)网络的另外两种类型host,none
撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 前面我们已经介绍了bridge network,比较复杂.这一节介绍host和none这两种简单的network ...
- Docker的4种网络模式
我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式: host模式,使用--net=host指定. container模式,使 ...
- Docker 的4种网络模式
我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式: host模式,使用--net=host指定. container模式,使 ...
最新文章
- Linux C编程之一:Linux下c语言的开发环境
- 实易智能DNS单台设备QPS高达28万
- linux下eclipse的使用教程,linux下Eclipse的使用方法总结.doc
- LDD3源码分析之字符设备驱动程序
- LeetCode Sort List(单链表归并排序)
- JBoss/Wildfly 配置SQLserver服务器
- ABI 与 API 的区别(应用程序二进制接口、应用程序编程接口)
- 自己的数字选择控件NumberPicker
- 拦截Activity的后退键处理
- 将Github中Fork的代码,克隆到本地
- 剑指Offer——链表中倒数第K个节点
- php未定义常量破解,PHP未定义的常量错误没有意义
- Unity3d gameObject
- WPF制作QQ列表(仿qq列表特效)
- 服务器系统日志应怎么查看,怎么查看服务器操作系统日志
- 通过IIS发布网站教程【十分钟完成一个网站发布】
- 魔兽争霸3技术分析资源汇总
- 100M 免费 ASP + Access 空间 100M 免费 php+mysql 空间
- 洪恩软件进军网游产业 池宇峰揭密完美世界
- 故障解决:发生系统错误 67 找不到网络名
热门文章
- 冰河是谁?到底是干嘛的?
- 小雅深访 |富国朱少醒最完整的投资逻辑(2017年12月)
- 我们需要什么样的软件工程师(上)[转载]
- 每个毒鸡汤背后都有说不出的话在内吧?
- 珠海高新区领导一行莅临道可云参观考察
- 【openGauss】在WPS表格里制作连接到openGauss的实时刷新报表
- android下的gradle升级,Android Studio Gradle版本升级简单方法
- android滴滴位置实现,百度地图实现【仿滴滴打车】
- java 解决微信配置服务器时出现的token验证失败问题
- 微信群里一道六年级数学题,求阴影面积,那我只能用python代码了