标签:org 连接 copy second bridge address 环境变量 权限 不用
原文:03 . Docker数据资源管理与网络
1|0Docker数据卷
在容器中管理数据主要有两种方式
在用 docker run 命令的时候,使用 -v 标记来创建一个数据卷并挂载到容器里。在一次 run 中多次使用
可以挂载多个数据卷。Dockerfile中使用VOLUME也能实现一样效果.
下面创建一个 web 容器,并加载一个数据卷到容器的 /webapp 目录。
dbdata
第一种情况(默认不做任何限制)
第二种情况(memory最多使用300M,swap没有限制)
第三种情况 (我们只设置了memory限制时300M,swap没有指定,默认被设置为与memory一样的值。memory+swap一共是600M)
第四种情况
如果发生内存溢出错误,内核讲kill掉容器中的进程。如果你想控制,可以配合使用- -oom-kill-disable参数。如果没有制定-m参数,可能导致当内存溢出时内核会杀死主机进程。 例子: 设置容器内存限制100M,并且阻止 OOM killer
默认情况下,所有容器获得CPU周期的比例相同。可以通过改变容器的CPU加权占有率相对于其他正在运行容器的加权占有率的比例来调整。
修改1024的比例,使用-c或--cpu-sharesflag的权重设置为2或更高。 该比例只适用在CPU密集型进程运行时。当在一个容器中的任务处于空闲状态,其他容器可以使用剩余空闲CPU时间。实际CPU时间将根据在系统上运行的容器的数目而变化。
例如,考虑三个容器的情况,一个拥有cpu的1024和另外两个有512 CPU共享时间,三个容器进程都尝试使用100%的CPU,第一个容器将获得的50%总的CPU时间。如果您添加CPU值为1024的第四个容器中,第一个容器只得到了CPU的33%。剩余的容器将分别占用CPU的16.5%,16.5%和33%。
在多核心系统中,CPU时间的份额分布在所有CPU核心。即使容器被限制为CPU时间小于100%时,它可以使用每个单独的CPU核心的100%。例如,在一个拥有超过三个核心的系统中,
如果启动一个容器设置-c=512跑一个进程,另外一个设置-c=1024,跑2个进程,内存分配将会如下配置:
--cpu-period参数
--cpuset参数
--bkio-weight参数
默认情况下,所有容器获得相同比例的blokIO带宽,这个比例值是500。要修改此比例,使用--blkio-weight设置容器的blkio相对于其他运行容器权重。它的取值范围是10~1000。 下面的例子中,设置了两个不同blkio:
Docker允许通过外部访问容器或容器互联的方式来提供网络服务.
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过-P或-p参数来指定端口映射.
当使用-P标记时,Docker会随机映射一个49000-49900的端口到内部容器开放的网络端口.
当使用-p(小写的)则可以指定要映射的端口,并且在一个指定端口上只可以绑定一个容器,支持可是有ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort.
映射到指定地址的指定端口
查看映射端口配置
容器的连接(linking)系统是除了端口映射外,另一种跟容器中应用交互的方式
该系统会在源和接受容器之间创建一个隧道,接受容器可以看到源容器指定的信息.
连接系统依据容器的名称来执行。因此,首先需要自定义一个好记的容器命名。
虽然当创建容器的时候,系统默认会分配一个名字。自定义命名容器有2个好处:
使用 --name标记可以为容器自定义命名
使用--link参数可以让容器之间安全的进行交互
当Docker启动时,会自动在主机上创建一个docker0虚拟网桥,实际上是Linux 的一个bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。
同时,Docker随机分配一个本地未占用的私有网段(在 RFC1918 中定义)中的一个地址给 docker0接口。比如典型的 172.17.42.1,掩码为 255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16 )的地址。
当创建一个Docker容器的时候,同时会创建了一对 veth pair接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0 ;另一端在本地并被挂载到docker0网桥,名称以 veth开头(例如 vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。
容器访问外部网络
容器的访问控制,主要通过Linux上的iptables防火墙来进行管理和实现,iptables是linux上默认的防火墙,且大多数发行版都自带.
容器之间访问
容器之间相互访问,需要两方面的支持
容器的网络拓扑是否已经失联,默认情况下,所有容器都会被连接到docker0网桥上.
本地系统的防火墙软件iptables是否允许通过.
当启动docker服务的时候,默认会添加一条转发策略到iptables的FORWARD链上,策略为通过(ACCEPT)还是禁止(DROP)取决于配置--icc=true(缺省值)还是--icc=false,当然,如果手动指定--iptables=false则不会添加iptables规则.
可见,默认情况下,不同容器之间是允许网络互通的,为了安全考虑,可以在/etc/default/docker文件配置DOCKER_OPTS=--icc=false来禁止它。
在通过-icc=false关闭网络访问后,还可以通过--link=CONTAINER_NAME:ALIAS选项来访问容器的开放端口.
例如,在启动Docker服务时,可以同时使用icc=false --iptables=true参数关闭允许相互的网络访问,并让Docker可以修改系统中的iptables规则.之后,启动容器(docker run)时使用--link=CONTAINER_NAME:ALIAS选项,docker会在iptable中为两个容器分别添加一条ACCEPT规则,允许相互访问开放的端口(取决于Dockerfile中的EXPOSE行),当添加了--link=CONTAINER_NAME:ALIAS选项后,添加了iptables规则.
注意: --link=CONTAINER_NAME:ALIAS中的CONTAINER_NAME目前必须是Docker分配的名字,或使用--name参数指定的名字,否则主机名不会被识别.
映射容器端口到宿主机的实现
默认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器。
外部访问容器实现容器允许外部访问可以通过-P或者-p来启用,但不管哪种办法,其实是在本地的iptable的nat表添加相应的规则。
如果希望永久绑定到某个固定的IP地址,可以在Docker配置文件/etc/default/docker中指定 DOCKER_OPTS="--ip=IP_ADDRESS",之后重启Docker服务即可生效.
__EOF__
标签:org 连接 copy second bridge address 环境变量 权限 不用
原文地址:https://www.cnblogs.com/lonelyxmas/p/13125949.html