Docker 学习笔记13 容器技术原理 Network Namespace

网友投稿 270 2022-10-28

Docker 学习笔记13 容器技术原理 Network Namespace

Docker 学习笔记12 容器技术原理 Network Namespace

​​一、 network namespace说明​​

​​Docker 宿主机网络示意图​​

​​二、部分网络操作命令​​

​​1. linux的 ip操作命令​​

​​` ip netns add xx 创建一个 namespace#`​​​​`ip netns exec xx yy 在新 namespace xx 中执行 yy 命令`​​​​`network namespace 之间的通信`​​​​`ip link add type veth 创建 veth pair`​​​​` ip link set xx netns yy 将 veth xx 加入到 namespace yy 中`​​​​其它一些命令​​

​​2. 增加网卡步骤​​​​3. 为运行中的Docker容器增加一个新的网卡​​

一、 network namespace说明

network namespace 是实现网络虚拟化的重要功能,它能创建多个隔离的网络空间,它们有独自的网络栈信息。不管是虚拟机还是容器,运行的时候仿佛自己就在独立的网络中。这篇文章介绍 network namespace 的基本概念和用法,network namespace 是 linux 内核提供的功能,这篇文章借助 ip 命令来完成各种操作。ip 命令来自于 iproute2 安装包,一般系统会默认安装。

Docker 宿主机网络示意图

Docker使用了一个私有网段 172.40.1.0; Docker还可能会使用10.0.0.0和192.168.0.0这两个私有网段。

当启动一个容器后,可以使用 ​​ip link show​​​或​​ip addr show​​来查看当前宿主机的网络情况。

ip link show

(tensorflow) [root@VM_16_10_centos ~]# ip link show1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:002: eth0: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 52:54:00:28:4c:5c brd ff:ff:ff:ff:ff:ff3: eth1: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether 20:90:6f:4e:50:69 brd ff:ff:ff:ff:ff:ff4: docker0: mtu 1500 qdisc noqueue state UP mode DEFAULT group default link/ether 02:42:91:63:b6:06 brd ff:ff:ff:ff:ff:ff18: veth94f9941@if17: mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default link/ether 76:51:72:7c:57:d3 brd ff:ff:ff:ff:ff:ff link-netnsid 0(tensorflow) [root@VM_16_10_centos ~]#

二、部分网络操作命令

1. linux的 ip操作命令

​​ip netns add xx 创建一个 namespace#​​

# ip netns add net1# ip netns lsnet1

​​ip netns exec xx yy 在新 namespace xx 中执行 yy 命令​​

# ip netns exec net1 ip addr 1: lo: mtu 65536 qdisc noop state DOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00# ip netns exec net1 bash // 在 net1 中打开一个shell终端# ip addr // 在net1中的shell终端1: lo: mtu 65536 qdisc noop state DOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00# exit // 退出net1

上面 bash 不好区分是当前是在哪个 shell,可以采用下面的方法解决:

# ip netns exec net1 /bin/bash --rcfile <(echo "PS1=\"namespace net1> \"")namespace net1> ping baidu.com

每个 namespace 在创建的时候会自动创建一个回环接口 lo ,默认不启用,可以通过 ip link set lo up 启用。

​​network namespace 之间的通信​​

新创建的 namespace 默认不能和主机网络,以及其他 namespace 通信。

​​ip link add type veth 创建 veth pair​​

# ip link add type veth# ip link3: veth0@veth1: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether 1a:53:39:5a:26:12 brd ff:ff:ff:ff:ff:ff4: veth1@veth0: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether 46:df:46:1f:bf:d6 brd ff:ff:ff:ff:ff:ff

​​ip link set xx netns yy 将 veth xx 加入到 namespace yy 中​​

# ip link set veth0 netns net0# ip link set veth1 netns net1## ip netns exec net0 ip addr1: lo: mtu 65536 qdisc noop state DOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:0010: veth0@if11: mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether 1a:53:39:5a:26:12 brd ff:ff:ff:ff:ff:ff link-netnsid 1

其它一些命令

# 给 veth pair 配上 ip 地址ip netns exec net0 ip link set veth0 upip netns exec net0 ip addrip netns exec net0 ip addr add 10.1.1.1/24 dev veth0ip netns exec net0 ip routeip netns exec net1 ip link set veth1 upip netns exec net1 ip addr add 10.1.1.2/24 dev veth1

2. 增加网卡步骤

## 首先,我们先增加一个网桥lxcbr0,模仿docker0brctl addbr lxcbr0brctl stp lxcbr0 offifconfig lxcbr0 192.168.10.1/24 up #为网桥设置IP地址## 接下来,我们要创建一个network namespace - ns1# 增加一个namesapce 命令为 ns1 (使用ip netns add命令)ip netns add ns1 # 激活namespace中的loopback,即127.0.0.1(使用ip netns exec ns1来操作ns1中的命令)ip netns exec ns1 ip link set dev lo up ## 然后,我们需要增加一对虚拟网卡# 增加一个pair虚拟网卡,注意其中的veth类型,其中一个网卡要按进容器中ip link add veth-ns1 type veth peer name lxcbr0.1# 把 veth-ns1 按到namespace ns1中,这样容器中就会有一个新的网卡了ip link set veth-ns1 netns ns1# 把容器里的 veth-ns1改名为 eth0 (容器外会冲突,容器内就不会了)ip netns exec ns1 ip link set dev veth-ns1 name eth0 # 为容器中的网卡分配一个IP地址,并激活它ip netns exec ns1 ifconfig eth0 192.168.10.11/24 up# 上面我们把veth-ns1这个网卡按到了容器中,然后我们要把lxcbr0.1添加上网桥上brctl addif lxcbr0 lxcbr0.1# 为容器增加一个路由规则,让容器可以访问外面的网络ip netns exec ns1 ip route add default via 192.168.10.1# 在/etc/netns下创建network namespce名称为ns1的目录,# 然后为这个namespace设置resolv.conf,这样,容器内就可以访问域名了mkdir -p /etc/netns/ns1echo "nameserver 8.8.8.8" > /etc/netns/ns1/resolv.conf

Docker的resolv.conf没有用这样的方式,而是用了​​Mount Namesapce​​的那种方式另外,docker是用进程的PID来做Network Namespace的名称的。

3. 为运行中的Docker容器增加一个新的网卡

ip link add peerA type veth peer name peerB brctl addif docker0 peerA ip link set peerA up ip link set peerB netns ${container-pid} ip netns exec ${container-pid} ip link set dev peerB name eth1 ip netns exec ${container-pid} ip link set eth1 up ; ip netns exec ${container-pid} ip addr add ${ROUTEABLE_IP} dev eth1 ;

这里为正在运行的docker容器,增加一个eth1的网卡,并给了一个静态的可被外部访问到的IP地址。注意要把外部的“物理网卡”配置成混杂模式。Google为Linux内核实现了IpVlan驱动,比nat和混杂模式更高效。

参考文章:​​​ https://coolshell.cn/articles/17029.html​​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:DP接口和HDMI接口用于视频传输哪个更好?
下一篇:aigo国民好物USSD固态U盘U393简评:双接口设计更实用
相关文章

 发表评论

暂时没有评论,来抢沙发吧~