Docker 网络和资源控制

发布时间 2023-08-16 16:07:20作者: 纸签

Docker 网络保证容器提供服务,确保网络的通信。资源控制确保宿主机不被容器抢占所有资源。  

目录

一、Docker 网络实现原理

二、Docker 的网络模式

三、CPU 资源控制

四、总结

 

 

 

 

 

一、Docker 网络实现原理

  1.Docker 网络实现原理

    (1)Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的 Container-IP 直接通信。

    (2)Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法直接通过 Container-IP 访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即 docker run 创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。

docker run -d --name test1 -P nginx					#随机映射端口(从32768开始)

 

docker run -d --name test2 -p 43000:80 nginx		#指定映射端口

 

浏览器访问:http://192.168.140.111:40000

#查看容器的输出和日志信息
docker logs 容器的ID/名称  

 

 

 

二、Docker 的网络模式 

  1.Docker 的网络模式    

    ●Host:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
    ●Container:创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。
    ●None:该模式关闭了容器的网络功能。
    ●Bridge:默认为该模式,此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及iptables nat 表配置与宿主机通信。
    ●自定义网络

  2.docker网络列表

    安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 、host

docker network ls	 或  docker network list			#查看docker网络列表

  

   3.指定容器  

    #使用docker run创建Docker容器时,可以用 --net 或 --network 选项指定容器的网络模式
    ●host模式:使用 --net=host 指定。
    ●none模式:使用 --net=none 指定。
    ●container模式:使用 --net=container:NAME_or_ID 指定。
    ●bridge模式:使用 --net=bridge 指定,默认设置,可省略。

  4.网络模式详解  

    1.host模式    

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

    如图所示:

   2.container模式   

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

  

docker run -itd --name test1 centos:7 /bin/bash			#--name 选项可以给容器创建一个自定义名称 
docker ps -a
docker inspect -f '{{.State.Pid}}' 3ed82355f811			#查看容器进程号
ls -l /proc/25495/ns					#查看容器的进程、网络、文件系统等命名空间编号
docker run -itd --name test2 --net=container:3ed82355f811 centos:7 /bin/bash
docker ps -a
docker inspect -f '{{.State.Pid}}' ff96bc43dd27
27123
ls -l /proc/27123/ns			#查看可以发现两个容器的 net namespace 编号相同

 

 

三、CPU 资源控制

 

四、总结