其他分享
首页 > 其他分享> > docker 之网络配置

docker 之网络配置

作者:互联网

Docker 网络实现

首先,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)来收发数据包;此外,如果不同子网之间要进行通信,需要路由机制。

Docker 中的网络接口默认都是虚拟的接口。虚拟接口的优势之一是转发效率较高。 Linux 通过在内核中进行数据复制来实现虚拟接口之间的数据转发,发送接口的发送缓存中的数据包被直接复制到接收接口的接收缓存中。对于本地系统和容器内系统看来就像是一个正常的以太网卡,只是它不需要真正同外部网络设备通信,速度要快很多。

 

Docker 容器网络就利用了这项技术。它在本地主机和容器内分别创建一个虚拟接口,并让它们彼此连通(这样的一对接口叫做 veth pair)。

创建网络参数

Docker 创建一个容器的时候,会执行如下操作:

完成这些之后,容器就可以使用 eth0 虚拟网卡来连接其他容器和其他网络。

 

可以在 docker run 的时候通过 --net 参数来指定容器的网络配置,有4个可选值:

四种单节点网络模式

1、bridge 模式

Docker 容器默认使用 bridge 模式的网络。其特点如下:

Screenshot from 2018-06-18 21-23-01.png

2、Host 模式

 

定义:

Host 模式并没有为容器创建一个隔离的网络环境。而之所以称之为host模式,是因为该模式下的 Docker 容器会和 host 宿主机共享同一个网络 namespace,故 Docker Container可以和宿主机一样,使用宿主机的eth0,实现和外界的通信。换言之,Docker Container的 IP 地址即为宿主机 eth0 的 IP 地址。其特点包括:

 

Screenshot from 2018-06-18 21-25-54.png

 

3、container 模式

定义:

 Container 网络模式是 Docker 中一种较为特别的网络的模式。处于这个模式下的 Docker 容器会共享其他容器的网络环境,因此,至少这两个容器之间不存在网络隔离,而这两个容器又与宿主机以及除此之外其他的容器存在网络隔离。  

Screenshot from 2018-06-18 21-26-38.png

4、none 模式

定义:

 网络模式为 none,即不为 Docker 容器构造任何网络环境。一旦Docker 容器采用了none 网络模式,那么容器内部就只能使用loopback网络设备,不会再有其他的网络资源。Docker Container的none网络模式意味着不给该容器创建任何网络环境,容器只能使用127.0.0.1的本机网络。

 

实验:

rhel7.3  172.25.12.250(物理机)

 

 

启动一个容器,不指定时,容器默认使用 bridge 模式

[root@foundation12 ~]# docker run -it --name web ubuntu

Screenshot from 2018-06-18 21-32-35.png

 

查看物理机

Screenshot from 2018-06-18 21-33-59.png

物理机桥接情况

Screenshot from 2018-06-18 21-34-31.png

 

设定为none 模式

 

[root@foundation12 ~]# docker run -it --name vm1 --net none ubuntu


Screenshot from 2018-06-18 22-13-30.png

Screenshot from 2018-06-18 22-12-55.png

 

查看PID:

[root@foundation12 ~]# docker inspect -f '{{.State.Pid}}' vm1

Screenshot from 2018-06-18 22-15-52.png

 

 

 

虚拟化网络都是基于netns 实现,netns 可以创建一个完全隔离的新网络环境,这个环境包括一个独立的网卡空间,路由表,ARP表,ip地址表,iptables等。总之,与网络有关的组件都是独立的。

ip [ OPTIONS ] netns  { COMMAND | help }

ip netns list - show all of the named network namespaces     列出所有名称空间
ip netns add NETNSNAME - create a new named network namespace     创建一个新的名称空间
ip netns delete NETNSNAME - delete the name of a network namespace     删除一个名称空间
ip netns exec NETNSNAME cmd ... - Run cmd in the named network namespace     在网络名称空间中执行系统命令

 

eg:

Screenshot from 2018-06-18 22-36-12.png

 

 

Screenshot from 2018-06-18 22-39-13.png

 

[root@foundation12 netns]# ip link add name veth0 type veth peer name veth1  添加网口到namespace(创建端口对)

在当前namespace可以看到veth0和veth1   

[root@foundation12 ~]# ip link list  查看端口对

Screenshot from 2018-06-18 23-31-48.png

 


Screenshot from 2018-06-18 23-01-35.png

 

[root@foundation12 netns]# brctl addif docker0 veth0   将veth0加入docker0这个网桥


Screenshot from 2018-06-18 23-02-35.png

 

默认网桥都是down的,置为up状态

[root@foundation12 netns]# ip addr

Screenshot from 2018-06-18 23-05-17.png

[root@foundation12 netns]#  ip link set up veth0
[root@foundation12 netns]#  ip link set up veth1

Screenshot from 2018-06-18 23-07-15.png

 

Screenshot from 2018-06-18 23-08-07.png

 

[root@foundation12 netns]# ip link set veth1 netns 4943  增加端口到namespace

查看net namespace

Screenshot from 2018-06-18 23-37-18.png

Screenshot from 2018-06-18 23-09-05.png

修改名字,添加IP和网关

[root@foundation12 netns]# ip netns exec 4943 ip link set veth1 name eth0
[root@foundation12 netns]# ip netns exec 4943 ip link set up eth0
[root@foundation12 netns]# ip netns exec 4943 ip addr add 172.17.0.100/24 dev eth0
[root@foundation12 netns]# ip netns exec 4943 ip route add default via 172.17.0.1

 

如下效果,none网络变得可以通信

Screenshot from 2018-06-18 23-10-04.png

 

标签:容器,ip,配置,网络,netns,docker,root,Docker
来源: https://www.cnblogs.com/zzsdream/p/11193096.html