Docker容器网络地址 docker容器网络配置文件

Docker容器网络配置
1、Linux内核实现名称空间的创建
1.1 ip netns命令
可以借助ip netns命令来完成对 Network Namespace 的各种操作 。ip netns命令来自于iproute安装包 , 一般系统会默认安装 , 如果没有的话 , 请自行安装 。
[rootlocalhost ~]# dnf -y install iproute
注意:ip netns命令修改网络配置时需要 sudo 权限 。
可以通过ip netns命令完成对Network Namespace 的相关操作 , 可以通过ip netns help命令帮助信息:
[rootlocalhost ~]# ip netns helpUsage:ip netns listip netns add NAMEip netns attach NAME PIDip netns set NAME NETNSIDip [-all] netns delete [NAME]ip netns identify [PID]ip netns pids NAMEip [-all] netns exec [NAME] cmd ...ip netns monitorip netns list-id [target-nsid POSITIVE-INT] [nsid POSITIVE-INT]NETNSID := auto | POSITIVE-INT
默认情况下 , Linux系统中是没有任何 Network Namespace的 , 所以ip netns list命令不会返回任何信息 。
1.2 创建Network Namespace
通过命令创建一个名为ns0的命名空间:
[rootlocalhost ~]# ip netns list[rootlocalhost ~]# ip netns add ns0[rootlocalhost ~]# ip netns listns0
新创建的 Network Namespace 会出现在/var/run/netns/目录下 。如果相同名字的 namespace 已经存在 , 命令会报Cannot create namespace file "/var/run/netns/ns0": File exists的错误 。
[rootlocalhost ~]# ls /var/run/netns/ns0[rootlocalhost ~]# ip netns add ns0Cannot create namespace file "/var/run/netns/ns0": File exists
对于每个 Network Namespace 来说 , 它会有自己独立的网卡、路由表、ARP 表、iptables 等和网络相关的资源 。
扩展:
问:可不可以直接在/var/run/netns/目录下直接创建一个命名空间ns2呢?
[rootlocalhost ~]# touch /var/run/netns/ns2[rootlocalhost ~]# ip netns listError: Peer netns reference is invalid.Error: Peer netns reference is invalid.ns2ns0
从上得知是不行的
1.3 操作Network Namespace
ip命令提供了ip netns exec子命令可以在对应的 Network Namespace 中执行命令 。
新创建 Network Namespace 的网卡信息
[rootlocalhost ~]# ip netns exec ns0 ip a1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
可以看到 , 新创建的Network Namespace中会默认创建一个lo回环网卡 , 此时网卡处于关闭状态 。此时 , 尝试去 ping 该lo回环网卡 , 会提示Network is unreachable
[rootlocalhost ~]# ip netns exec ns0 ping 127.0.0.1connect: Network is unreachable
通过下面的命令启用lo回环网卡:
[rootlocalhost ~]# ip netns exec ns0 ip link set lo up[rootlocalhost ~]# ip netns exec ns0 ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever[rootlocalhost ~]# ip netns exec ns0 ping 127.0.0.1PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.031 ms^C--- 127.0.0.1 ping statistics ---1 packets transmitted, 1 received, 0% packet loss, time 0msrtt min/avg/max/mdev = 0.031/0.031/0.031/0.000 ms
1.4 转移设备
我们可以在不同的 Network Namespace 之间转移设备(如veth) 。由于一个设备只能属于一个 Network Namespace  , 所以转移后在这个 Network Namespace 内就看不到这个设备了 。
其中 , veth设备属于可转移设备 , 而很多其它设备(如lo、 lan、ppp、bridge等)是不可以转移的 。
1.5 veth pair
veth pair 全称是 Virtual Ethernet Pair , 是一个成对的端口 , 所有从这对端口一 端进入的数据包都将从另一端出来 , 反之也是一样 。
引入veth pair是为了在不同的 Network Namespace 直接进行通信 , 利用它可以直接将两个 Network Namespace 连接起来 。

Docker容器网络地址 docker容器网络配置文件

文章插图
1.6 创建veth pair


推荐阅读