docker容器管理

参数 说明 -i, –interactive 即使不是交互模式也保持stdin打开 -d, –detach 后台运行容器并打印容器ID -t, –tty 分配一个伪TTY 添加自定义主机映射 bash 1 2 3 4 5 6 $ docker run -tid --add-host docker-node:10.0.0.1 centos 61d5824c720f1a32c743a3d0f434e17a7f6860dba1cb5559653a80c064da8073 $ docker exec 61d5824c720f1a32c cat /etc/hosts ff02::2 ip6-allrouters 10.0.0.1 docker-node 172.17.0.2 61d5824c720f 添加linux功能 linux内核特性,提供权限访问控制。如需要特殊权限,不赋权限容器将不能正常运行。 将容器pid写入一个文件内 bash 1 2 3 4 $ docker run -itd --cidfile /tmp/pid centos 458d9f4b3cc51a4f0f3abffbc78c643b98a89eef3cdfe263e762ac05d3f5f47d $ cat /tmp/pid 458d9f4b3cc51a4f0f3abffbc78c643b98a89eef3cdfe263e762ac05d3f5f47d 将主机列表添加到容器中 bash 1 --device list 设置自定义dns bash 1 2 3 4 5 $ docker run -it centos cat /etc/resolv....

 ·  · 

Docker网络

docker的四种网络模式 Bridge模式(默认) 当Docker进程启动时,会在宿主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。 默认ip段172.17.0.1/16;从docker0子网中分配一个IP给容器使用,并设置docker0的IP为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。 使用 docker run -p 时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用 iptables -t nat -nL 查看。 host模式 启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。 none模式 使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。 container模式 这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。 容器外部访问原理 bash 1 2 3 4 5 6 7 8 docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0 inet6 fe80::42:a5ff:fe59:2034 prefixlen 64 scopeid 0x20<link> ether 02:42:a5:59:20:34 txqueuelen 0 (Ethernet) RX packets 56986 bytes 2746876 (2.6 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 64106 bytes 503304169 (479....

 ·  · 

macvlan实现docker跨宿主机访问

关于vlan说明 Macvlan和ipvlan是Linux网络驱动程序,它们将底层或主机接口直接暴露给在主机中运行的VM或容器。 Macvlan允许单个物理接口使用macvlan子接口具有多个mac和ip地址。这与使用vlan在物理接口上创建子接口不同。使用vlan子接口,每个子接口使用vlan属于不同的L2域,所有子接口都具有相同的mac地址。使用macvlan,每个子接口将获得唯一的mac和ip地址,并将直接暴露在底层网络中。Macvlan接口通常用于虚拟化应用程序,每个macvlan接口都连接到Container或VM。每个容器或VM可以直接从公共服务器获取dhcp地址,就像主机一样。这将有助于希望Container成为传统网络的客户使用他们已有的IP寻址方案。Macvlan有4种类型(Private, VEPA, Bridge, Passthru)。常用的类型是Macvlan网桥,它允许单个主机中的端点能够在没有数据包离开主机的情况下相互通信。对于外部连接,使用底层网络。下图显示了两个使用macvlan网桥相互通信以及外部世界的容器。两个容器将使用Macvlan子接口直接暴露在底层网络中。 使用mavvlan构建docker网络 Macvlan,MACVLAN或MAC-VLAN允许您在单个物理接口上配置多个第2层(即以太网MAC)地址。 Macvlan允许您配置父物理以太网接口(也称为上层设备)的子接口(也称为从设备),每个接口都有自己唯一的(随机生成的)MAC地址,因此也有自己的IP地址。然后,应用程序、VM和容器可以绑定到特定的子接口,以使用自己的MAC和IP地址直接连接到物理网络。 Mavlan子接口不能直接与父接口通信,即VM不能直接与主机通信。如果需要VM主机通信,则应添加另一个macvlan子接口并将其分配给主机。 Macvlan子接口使用 eth0.20@eth0 表示法来清楚地识别子接口及其父接口。子接口状态绑定到其父级状态。如果eth0关闭,则 eth0.20@eth0 也会关闭。 配置macvlan先决条件 至少需要Linux内核版本3.9以上,建议使用4.0或更高版本。 环境准备 主机名 IP地址 地位 软件环境 物理机 10.0.0.1 物理机 windows10 网关 10.0.0.2 宿主机网关 vmvare网关 c1 10.0.0.3 容器01 docker c2 10.0.0.4 容器02 docker node01 10.0.0.15 宿主机01(vm虚拟机) centos 7.3/docker-ce1806 node02 10.0.0.16 宿主机02(vm虚拟机) centos 7.3/docker-ce1806 2.3 启动网卡混合模式 两台主机网卡使用桥接模式,网卡混杂模式开启全部允许。 主机上配置的eth0网卡和创建的vlan网卡,均需要开启混杂模式。如果不开启混杂模式会导致macvlan网络无法访问外界,具体在不使用vlan时,表现为无法ping通路由,无法ping通同一网络内其他主机。 sh 1 2 ip link set eth0 promisc on ip link set eth0 promisc off 开启后查看网卡状态 sh 1 2 3 4 5 6 7 $ ip addr 2: eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:84:f3:29 brd ff:ff:ff:ff:ff:ff inet 10....

 ·  · 

容器的资源限制

默认情况下,容器没有任何资源限制,因此几乎耗尽docker主机之上,内核可分配给当前容器的所有资源。可以使用主机内核调度程序允许的尽可能多的给定资源。在此基础上Docker provides提供了控制容器可以使用多少内存,CPU或块IO的方法,设置docker run命令的运行时配置标志。 容器得以实现主要依赖于内核中的两个属性namespace cgroup。其中许多功能都要求您的内核支持Linux功能。要检查支持,可以使用docker info命令。 Memory OOME 在Linux主机上,如果内核检测到没有足够的内存来执行重要的系统功能,它会抛出OOME或Out of Memory Exception异常,并开始终止进程以释放内存资源。一旦发生OOME,任何进程都有可能被杀死,包括docker daemon自身在内。为此,Docker特地调整了docker daemon的OOM优选级,以免它被内核“正法”,但容器的优选级并未被调整。 工作逻辑为 在宿主机上跑有很多容器并包括系统级进程。系统级进程也包括docke daemon自身。当内核执行系统管理操作,如内核需要使用内存,发现可以内存已经为空,会启动评估操作,评估谁占用内存高。我们认为哪个资源占用内存高就该将其kill来释放内存空间。(需要注意的是占用内存高的进程也不一定被kill掉。A进程分配10G已使用5G,进程B分配1G已使用1G。A只使用50%内存,而B已经耗尽所有内存)。内核会提供这些进程进行评分,按照优先级逆序强制kill,直至可使用内存空间足够。此时内核就可以使用内存资源创建其他进程。 每一个进程被计算之后会有一个oom scores,得分越高就会被优先kill。得分是由内存申请分配空间等一系列复杂计算得知。当进程得分最高也不能被kill掉时,如docker daemon,此时需要调整优先级。每一个进程有一个oom.adj的参数,将优先级调整越低,计算的分数就越少。 在docker run时可以直接调整容器的OOM.adj参数。如果想限制容器能使用多少内存资源、或CPU资源,有专门的选项可以实现。非常重要的容器化应用需要在启动容器时调整其OOM.adj,还可以定义容器的策略,一旦被kill直接restart Limit a container’s resources 限制一个容器能使用多少内存资源或CPU资源docker有专门的选项来实现 -m 限制容器可用RAM空间。选项参数可以使用KB M G等作为接受单位使用。可单独使用。 --memory-swap 设置容器可用交换分区大小。使用swap允许容器在容器耗尽可用的所有RAM时将多余的内存需求写入磁盘。--memory-swap是一个修饰符标志,只有在设置了–memorys时才有意义。 --memory-swap --memory-swap --memory 功能 正数S 正数 M 容器可用总空间为S,其中可用ram为M 0 正数 M相当于未设置swap(unset) unset(未设置) 正数 M 若主机(Docker Host)启用了swap,则容器的可用swap为 2*M -1 正数M 若主机(Docker Host)启用了swap,则容器可使用交换分区总空间大小为宿主机上的所有swap空间的swap资源 注意:在容器内使用free命令可以看到的swap空间并不具有其所展现出的空间指示意义。 –memory-swappiness 用来限定容器使用交换分区的倾向性。 –memory-reservation 预留的内存空间 –oom-kill-disable 禁止oom被kill掉 默认情况下,每个容器对主机CPU周期的访问权限是不受限制的。可以设置各种约束来限制给定容器访问主机的CPU周期。大多数用户使用和配置默认CFS调度程序。在Docker 1.13及更高版本中,还可以配置实时调度程序。 CPU Limit a container’s resources 内核中进程管理子系统当中最重要的组件为进程角度器scheduler,非实时优先级,有效范围为100-139[-20,19]。因此每个进程的默认优先级为120。实时优先级0-99。调度100-139之间的进程有个非常重要的调度器CFS scheduler(完全公平调度器),公平调度每一个进程在需要执行时,去分配scores到这个进程上。...

 ·  · 

使用weave实现docker跨宿主机通讯

项目地址:https://github.com/weaveworks/weave 注:weave公司与2024年关门 weaves说明 Weave是由weaveworks公司开发的解决Docker跨主机网络的解决方案,它能够创建一个虚拟网络,用于连接部署在多台主机上的Docker容器,这样容器就像被接入了同一个网络交换机,那些使用网络的应用程序不必去配置端口映射和链接等信息。 外部设备能够访问Weave网络上的应用程序容器所提供的服务,同时已有的内部系统也能够暴露到应用程序容器上。Weave能够穿透防火墙并运行在部分连接的网络上,另外,Weave的通信支持加密,所以用户可以从一个不受信任的网络连接到主机。 weaves实现原理 weave launch初始化时会自动下载三个docker容器来辅助运行,并且创建linux网桥与docker网络 weave 运行了三个容器: weave 是主程序,负责建立weave网络,收发数据,提供 DNS 服务等。 weavevolumes容器提供卷存储 weavedb容器提供数据存储 sh 1 2 3 4 5 6 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE weaveworks/weavedb latest 15c78a9b1895 4 weeks ago 698B weaveworks/weaveexec 2.4.0 bf0c403ea58d 4 weeks ago 151MB weaveworks/weave 2.4.0 7aa67bc6bc43 4 weeks ago 96.7MB 自动创建网桥 sh 1 2 3 4 5 $ brctl show bridge name bridge id STP enabled interfaces docker0 8000....

 ·  ·