Docker的网络管理

Docker的四种网络模式
· host模式,使用–net=host指定。

· container模式,使用–net=container:NAME_or_ID指定。

· none模式,使用–net=none指定。

· bridge模式,使用–net=bridge指定,默认设置。

查看docker网络的模式

[root@server1 test]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
95f49fb81eae        bridge              bridge              local
29040a8dbdc9        host                host                local
9ea0c5751a06        none                null                local

获取容器的PID

[root@server1 test]# docker run -it --name vm1 ubuntu
root@bb2d8f28176f:/# [root@server1 test]# 
[root@server1 test]# docker inspect vm1 | grep Pid
            "Pid": 18671,
            "PidMode": "",
            "PidsLimit": 0,
[root@server1 test]# cd /proc/18671/
[root@server1 18671]# cd ns/
[root@server1 ns]# ll
total 0
lrwxrwxrwx 1 root root 0 Jun  3 13:55 ipc -> ipc:[4026532182]
lrwxrwxrwx 1 root root 0 Jun  3 13:55 mnt -> mnt:[4026532180]
lrwxrwxrwx 1 root root 0 Jun  3 13:54 net -> net:[4026532185]
lrwxrwxrwx 1 root root 0 Jun  3 13:55 pid -> pid:[4026532183]
lrwxrwxrwx 1 root root 0 Jun  3 13:55 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Jun  3 13:55 uts -> uts:[4026532181]

桥接模式
Bridge 桥接模式的实现步骤主要如下:
(1) Docker Daemon 利用 veth pair 技术,在宿主机上创建两个虚拟网络接口设备,假设为veth0 和 veth1。而 veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文,都会将报文传输给另一方。
(2) Docker Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0 网桥上。保证宿主机的网络报文可以发往 veth0;
(3) Docker Daemon 将 veth1 添加到 Docker Container 所属的namespace 下,并被改名为 eth0。如此一来,保证宿主机的网络报文若发往 veth0,则立即会被 eth0 接收,实现宿主机到DockerContainer 网络的联通性;同时,也保证 Docker Container 单独使用 eth0,实现容器网络环境的隔离性。

bridge 桥接模式下的 Docker Container 在使用时,并非为开发者包办了一切。最明显的是,该模式下 Docker Container 不具有一个公有 IP,即和宿主机的 eth0 不处于同一个网段。导致的结果是宿主机以外的世界不能直接和容器进行通信。虽然 NAT 模式经过中间处理实现了这一点,但是 NAT 模式仍然存在问题与不便,如:容器均需要在宿主机上竞争端口,容器内部服务的访问者需要使用服务发现获知服务的外部端口等。另外 NAT 模式由于是在三层网络上的实现手段,故肯定会影响网络的传输效率。

bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。

[root@server1 ~]# docker run -it --name vm1 ubuntu	
[root@server1 ns]# brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.0242fe1f21c7	no		veth545ed56
[root@server1 ns]# docker stop vm1
vm1
[root@server1 ns]# brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.0242fe1f21c7	no		

host模式

Docker使用Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

扫描二维码关注公众号,回复: 6441373 查看本文章

使用docker run时使用–net=host指定,docker使用的网络实际上和宿主机一样,在容器内看到的网卡ip是宿主机上的ip。host模式很好的解决了容器与外界通信的地址转换问题,可以直接使用宿主机的IP镜像通信。但是也降低了隔离性,同时还会引起网络资源的竞争和冲突。

[root@server1 ns]# docker run -it --name vm2 --net host ubuntu
root@server1:/# ip addr
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:8e:f9:42 brd ff:ff:ff:ff:ff:ff
    inet 172.25.26.1/24 brd 172.25.26.255 scope global eth0

发现eth0的ip和主机一样是172.25.26.1
在这里插入图片描述
container模式

这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。

多个容器使用共同的网络,看到的ip是一样的。container模式的应用场景就在于可以将一个应用的多个组件放在不同的容器中,这些容器配成container模式的网络,这样它们就可以作为一个整体对外提供服务。同样这种模式也降低了容器间的隔离性。

查看vm1的ip

[root@server1 ns]# docker start vm1
vm1
[root@server1 ns]# docker attach vm1
root@bb2d8f28176f:/# 
root@bb2d8f28176f:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
94: eth0@if95: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

设置vm3的网络方式,并查看ip

[root@server1 ns]# docker run -it --name vm3 --net container:vm1 ubuntu
root@bb2d8f28176f:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
94: eth0@if95: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

none模式

在这种模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等

[root@server1 ns]# docker run -it --name vm4 --net none ubuntu
root@50fd2bfb9bc0:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
root@50fd2bfb9bc0:/# [root@server1 ns]# 

猜你喜欢

转载自blog.csdn.net/qwqq233/article/details/90751288