java怎么拦截某个对象
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:
二、部分网络操作命令
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:
上面 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:
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:
其它一些命令
# 给 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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~