docker容器网络配置

智慧并不产生于学历,而是来自对于知识的终生不懈的追求。这篇文章主要讲述docker容器网络配置相关的知识,希望能为你提供帮助。


  1. ?Linux内核实现名称空间的创建?
  1. ??ip netns命令???
  2. ??创建Network Namespace???
  3. ??操作Network Namespace???
  4. ??转移设备???
  5. ??veth pair???
  6. ??创建veth pair???
  7. ??实现Network Namespace间通信???
  8. ??veth设备重命名???
  1. ?四种网络模式配置?
  1. ??bridge模式配置???
  2. ??none模式配置???
  3. ??container模式配置???
  4. ??host模式配置???
  1. ??容器的常用操作???
  2. ??查看容器的主机名???
  3. ??在容器启动时注入主机名???
  4. ??手动指定容器要使用的DNS???
  5. ??手动往/etc/hosts文件中注入主机名到IP地址的映射???
  6. ??开放容器端口???
  7. ??自定义docker0桥的网络属性信息???
  8. ??docker远程连接???
  9. ??docker创建自定义桥???

Linux内核实现名称空间的创建?ip netns命令?
可以借助ip netns命令来完成对 Network Namespace 的各种操作。ip netns命令来自于iproute安装包,一般系统会默认安装,如果没有的话,请自行安装。?
注意:ip netns命令修改网络配置时需要 sudo 权限。?
可以通过ip netns命令完成对Network Namespace 的相关操作,可以通过ip netns help查看命令帮助信息:?
[root@localhost ~]# ip netns helpUsage: ip netns list?
ip netns add NAME?
ip netns set NAME NETNSID?
ip [-all] netns delete [NAME]?
ip netns identify [PID]?
ip netns pids NAME?
ip [-all] netns exec [NAME] cmd ...?
ip netns monitor?
ip netns list-id?
默认情况下,Linux系统中是没有任何 Network Namespace的,所以ip netns list命令不会返回任何信息。?
创建Network Namespace?
通过命令创建一个名为ns0的命名空间:?
[root@localhost ~]# ip netns list?
[root@localhost ~]# ip netns add ns0?
[root@localhost ~]# ip netns list?
ns0?
新创建的 Network Namespace 会出现在/var/run/netns/目录下。如果相同名字的 namespace 已经存在,命令会报Cannot create namespace file "/var/run/netns/ns0": File exists的错误。?
[root@localhost ~]# ls /var/run/netns/?
ns0?

[root@localhost ~]# ip netns add ns0?
Cannot create namespace file "/var/run/netns/ns0": File exists?
对于每个 Network Namespace 来说,它会有自己独立的网卡、路由表、ARP 表、iptables 等和网络相关的资源。?
操作Network Namespace?
ip命令提供了ip netns exec子命令可以在对应的 Network Namespace 中执行命令。?
查看新创建 Network Namespace 的网卡信息?
[root@localhost ~]# ip netns exec ns0 ip addr1: lo: < LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000?
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00?
可以看到,新创建的Network Namespace中会默认创建一个lo回环网卡,此时网卡处于关闭状态。此时,尝试去 ping 该lo回环网卡,会提示Network is unreachable?
[root@localhost ~]# ip netns exec ns0 ping 127.0.0.1connect: Network is unreachable?
通过下面的命令启用lo回环网卡:?
[root@localhost ~]# ip netns exec ns0 ip link set lo up?
[root@localhost ~]# ip netns exec ns0 ping 127.0.0.1 ?
PING 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.047 ms64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.073 ms?
转移设备?
我们可以在不同的 Network Namespace 之间转移设备(如veth)。由于一个设备只能属于一个 Network Namespace ,所以转移后在这个 Network Namespace 内就看不到这个设备了。?
其中,veth设备属于可转移设备,而很多其它设备(如lo、vxlan、ppp、bridge等)是不可以转移的。?
veth pair?
veth pair 全称是 Virtual Ethernet Pair,是一个成对的端口,所有从这对端口一 端进入的数据包都将从另一端出来,反之也是一样。
引入veth pair是为了在不同的 Network Namespace 直接进行通信,利用它可以直接将两个 Network Namespace 连接起来。?

创建veth pair?
[root@localhost ~]# ip link add type veth?
[root@localhost ~]# ip a10: veth0@veth1: < BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000?
【docker容器网络配置】 link/ether 32:c4:23:dd:a7:1c brd ff:ff:ff:ff:ff:ff11: veth1@veth0: < BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000?
link/ether a2:52:52:cd:54:62 brd ff:ff:ff:ff:ff:ff?
可以看到,此时系统中新增了一对veth pair,将veth0和veth1两个虚拟网卡连接了起来,此时这对 veth pair 处于”未启用“状态。?
实现Network Namespace间通信?
下面我们利用veth pair实现两个不同的 Network Namespace 之间的通信。刚才我们已经创建了一个名为ns0的 Network Namespace,下面再创建一个信息Network Namespace,命名为ns1?
[root@localhost ~]# ip netns add ns1?
[root@localhost ~]# ip netns list?
ns1?
ns0?
然后我们将veth0加入到ns0,将veth1加入到ns1?
[root@localhost ~]# ip link set veth0 netns ns0?
[root@localhost ~]# ip link set veth1 netns ns1?
然后我们分别为这对veth pair配置上ip地址,并启用它们?
[root@localhost ~]# ip netns exec ns0 ip link set veth0 up?
[root@localhost ~]# ip netns exec ns0 ip addr add 10.0.0.1/24 dev veth0?
[root@localhost ~]# ip netns exec ns1 ip link set lo up?
[root@localhost ~]# ip netns exec ns1 ip link set veth1 up?
[root@localhost ~]# ip netns exec ns1 ip addr add 10.0.0.2/24 dev veth1?
查看这对veth pair的状态?
[root@localhost ~]# ip netns exec ns0 ip a10: veth0@if11: < BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000?
link/ether 32:c4:23:dd:a7:1c brd ff:ff:ff:ff:ff:ff link-netnsid 1?
inet 10.0.0.1/24 scope global veth0?
valid_lft forever preferred_lft forever?
inet6 fe80::30c4:23ff:fedd:a71c/64 scope link ?
valid_lft forever preferred_lft forever?
?

[root@localhost ~]# ip netns exec ns1 ip a11: veth1@if10: < BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000?
link/ether a2:52:52:cd:54:62 brd ff:ff:ff:ff:ff:ff link-netnsid 0?
inet 10.0.0.2/24 scope global veth1?
valid_lft forever preferred_lft forever?
inet6 fe80::a052:52ff:fecd:5462/64 scope link ?
valid_lft forever preferred_lft forever?
从上面可以看出,我们已经成功启用了这个veth pair,并为每个veth设备分配了对应的ip地址。我们尝试在ns1中访问ns0中的ip地址:?

    推荐阅读