Docker 网络介绍及资源限制

Docker 网络介绍及资源限制

  • 官方文档:https://docs.docker.com/network/

1、Docker默认网络通信

  • Docker服务安装完成之后,默认在每个宿主机会生成一个名称为dockelinux系统r0的网卡其IP地址都是 172.17.0.1/16
  • 宿主机多了一个虚拟网卡,和容器的网卡组合成一个网卡,比如系统/运维: 137: veth8ca6d43@if136,而在容器docker资源限制内的网卡名为136,可以看出和宿主机的网卡之间的关联

  • 容器会自动获取一个linux172.17.0.0/16网段的随机地址,默认从172.17.0.2开始,第二次容器为172.17linux系统安装.0.3,以此类推

  • 容器获取的地址并不固定,每次容器重启,可能会发生地址变化
[root@fsl ~]# ip a
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:c9:12:04:d5 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:c9ff:fe12:4d5/64 scope link 
       valid_lft forever preferred_lft forever
6: br-243483a5bcdb: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:52:ee:57:0c brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-243483a5bcdb
       valid_lft forever preferred_lft forever
    inet6 fe80::42:52ff:feee:570c/64 scope link 
       valid_lft forever preferred_lft forever
4622: veth2fa3dbb@if4621: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-243483a5bcdb state UP group default 
    link/ether 8a:eb:3b:2f:58:84 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::88eb:3bff:fe2f:5884/64 scope link 
       valid_lft forever preferred_lft forever
4624: vethb8acb9c@if4623: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-243483a5bcdb state UP group default 
    link/ether de:9a:3a:4c:fc:7d brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::dc9a:3aff:fe4c:fc7d/64 scope link 
       valid_lft forever preferred_lft forever
4626: veth5c74057@if4625: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-243483a5bcdb state UP group default 
    link/ether be:1c:0e:f4:77:14 brd ff:ff:ff:ff:ff:ff link-netnsid 2
    inet6 fe80::bc1c:eff:fef4:7714/64 scope link 
       valid_lft forever preferred_lft forever
4628: veth4a54be2@if4627: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-243483a5bcdb state UP group default 
    link/ether 3a:10:82:eb:6d:9d brd ff:ff:ff:ff:ff:ff link-netnsid 3
    inet6 fe80::3810:82ff:feeb:6d9d/64 scope link 
       valid_lft forever preferred_lft forever

2、 容器间通信

  • 同一个宿主机的不同容器可相互通信
    • 同一个宿主机的不同容器之间可以相互通信
    • 不同宿主机之间的容器IP地址重复,默认不能相互通信
dockerd --icc Enable inter-container communication (default true)
--icc=false #此配置可以禁止同一个宿主机的容器之间通信

3、容器名称互联

新建容器时,docker会自动分配容器名称,容器linux常用命令ID和IP地址,导致容器linux必学的60个命令名称,容器ID和IP都不固定,那么如何区分不同的容器,实现和确定目标容器的通信呢?解决方案是给容器起个固定的名称,容器之间通过固定名称实现确定目linux删除文件命令标的通信linux系统安装
有两种固定名docker是干什么的称:

  • 容器名称
  • 容器名称的别名

注意: 两种方式都最少需要两个容器才能实现

3.1 容器名称介绍

  • 即在同一个宿主机上的容器之间可以通过自定义的容器名称相互访问linux操作系统基础知识,比如: 一个业务前端静态页面是使用nginx,动态页面使用的是tomcat,另外还需要负载均衡调度器,如: hdocker镜像aproxy 对请求调度至nginx和tomcat的容器,由于容器在启动的时候其linux操作系统基础知识内部IP地址是DHCP 随机分配的,而给容器起个固定的名称,则是相对比较固定的,因此比较适用于此linux删除文件命令场景

注意: 如果被引用的容系统运维工资一般多少器地址变化,必须重docker网络管理启当前容器才能生效

  • docker run 创建容器,可使用--link选项实现容器名称的引用
--link list #Add link to another container
格式:
docker run --name <容器名称> #先创建指定名称的容器
docker run --link <目标通信的容器ID或容器名称> #再创建容器时引用上面容器的名称
[root@fsl ~]#docker run -it --name server1 --rm alpine:3.11 sh
[root@fsl ~]#docker run -it --rm --name server2 --link server1 alpine:3.11 sh

3.2 通过自定义容器别名互联

  • 自定义的容器名称可能docker资源限制后期会发生变化,那么一旦名称发生变化,容器内程序之间也必须要随之发生变化,比如:程序通过固定的容器名称进行服务调用,但是容器名称发生变化之后再使用之前的名称肯定是无法成功调用,每次都进行更改的话又比较麻烦,因此dockerhub可以使用自定义别名的方式解决,即容器名称可以随意更改,只要不更改别名即可
  • 容器别名实现
docker run --name <容器名称> #先创建指定名称的容器
docker run -d --name 容器名称 --link <目标容器名称>:<容器别名> #给上面创建的容器起别名,来创建新容器
[root@fsl ~]#docker run -it --rm --name server3 --link server1:server1-alias alpine:3.11 sh
[root@fsl ~]#docker run -it --rm --name server4 --link server1:"server1-alias1 server1-alias2" alpine:3.11 sh

4、dockerlinux删除文件命令 网络连接模式

Doc系统运维工作内容ker 的网络支持5linux命令种网络模式:

  • none
  • bridge
  • host
  • container
  • network-name

范例: 查看默认的网络模式:

[root@ubuntu1804 ~]#docker network ls
NETWORK ID NAME DRIVER SCOPE
fe08e6d23c4c bridge bridge local
cb64aa83626c host host local
10619d45dcd4 none null local

4.1 网络指定模式

默认新建的容器使用Bridge模式,创建容器时,docker run 命令使用以下选项指定docker菜鸟教程网络模式格式

docker run --network <mode>
docker run --net=<mode>
<mode>: 可是以下值
none
bridge
host
container:<容器名或容器ID>
<自定义网络名称>
  • bridge网络模式

本模式是docker的默认模式,即不指定任何模式就是bridge模式,也是使用比较多的模式,此模式创建
的容器会为每一个容器分配自己的网络 IP 等信息,并将容器连接到一个虚拟网桥与外linux界通信

docker网络管理以和外部网络之间进行通信,通过SNAT访问外网,使用DNAT可以让容器被外部主机访问,所以此模式也称为NAT模式

此模式宿主机需要启动ip_forward功能

bridge网络模式特点:

  • 网络资源隔离: 不同宿主机的容器无法直接通信,各自使用独立网络
  • 无需手动配置: 容器默认自动获取172.17.0.0/16的IP地址,此地址可以修改
  • 可访问外网docker常用命令: 利用宿主机的物理网卡,SNAdockersT连接外网
  • 外部主机无法直接访问容器:docker镜像 可以通过配置DNAT接受外网的访问
  • 低性能较低:linux删除文件命令 因为可通过NAT,网络转换带来更的损耗
  • 端口管理繁琐: 每个容器必须手动指定唯一的端口,容器产生端口冲容

4.2 Host 模式


                                            Docker 网络介绍及资源限制

如果指定host模式启动的容器,那么新创建的容器不会创建自己的虚拟网卡,而是直接使用宿主机的网卡和IP地系统运维工资一般多少址,因此在容器里面查看到的IP信息就系统/运维是宿主机的信息,访问linux重启命令容器的时候直接使用宿主机IP+容器端口即可,不过容器内除linux操作系统基础知识网络以外的其它资源,linux重启命令如: 文件系统、系统进程等仍然和宿主机保持隔离此模式由于直接使用宿主机的网络dockerhub无需转换,网络性能最高,linux但是各容器内使用的端口不能相同,适用于运行容器端口比较固定的业务

Host 网络模式特点:

  • 使用参数 --ndocker网络管理etwork host 指定
  • 共享宿主机网络
  • 网络性能无损耗
  • 网络故系统运维工程师障排除相对简单
  • 各容器网络无隔离
  • 网络资源无法分别统计docker菜鸟教程
  • 端口管理困难: 容易产生端口linux是什么操作系统冲突
  • 不支持端口映射

4.3 none模式

在使用none 模式linux操作系统基础知识后,Docker 容器不会进行任何网络配置,没有网卡、没有IP也docker容器没有路由,因此默认无法与外界通信,需要手动添加网卡配置IP等,所以极少使用

none模式特点:

  • 使用参数 --network none 指定
  • 默认无网络功能,无法和外部通信

4.4 Container 模式


                                            Docker 网络介绍及资源限制

使用此模式创建的容器需指定和一个已经存在的容器共享一个网络,而不是和宿主机共享网,新创建的容器不会创建自己的网卡也docker网络管理不会配置自己的IP,而是和一个被指定的已经存在的容器共linux操作系统基础知识享IP和端口范围,因此这个容器的端口不能和被指定容器的端口冲突,除了网络之外的文件系统、进程信息等仍然保持相互隔离,两个容器的进程可以通过lo网卡进linux是什么操作系统行通信

Container 模式特点:

  • 使用参数 –-network container:名称或ID 指定
  • 与宿主机网络空间隔离
  • 空器间共享网docker网络管理络空间
  • 适合频繁的容器间的网络通信
  • 直接使用对方的网络,较少使用

4.5 自定义网络模式

除了以上的网络模式,也可以自定义网络,使用自定义的网段地址,网关等信息

注意: 自定义网络内的容器可以直接通过容器名进行相互的访问,而无需使用 --link

可以使用自定义网络模式,实现不同集群应用的独立网络管理,而互不影响,而且在网一个网络内,可以直接利用容器名相互访问非常便利

[root@ubuntu1804 ~]#docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
docker network create -d <mode> --subnet <CIDR> --gateway <网关> <自定义网络名称>
#注意mode不支持host和none

查看自定义网络信息

docker network inspect <自定义网络名称或网络ID>

引用自定议网络

docker run --network <自定义网络名称> <镜像名称>

删除自定义网络

doccker network rm <自定义网络名称或网络ID>

5、dolinux删除文件命令cker 资系统运维工程师源限制

  • 系统运维工作内容方文档: htdocker常用命令tps://docs.docker.com/config/containers/resource_constraints/
  • 默认情况下,容器没有资源的使用限制,可以使用主机内核linux是什么操作系统调度linux系统程序允许的尽可能多的资源
  • Docker 提供了控制容器使用资源的方法,dockerhub可以限制容器使用多少内存或 CPU等, 在docker run 命令的运系统运维工作内容行时配置标志实现资源限制功能。
  • 其中许多功能都要求宿主机的内核支持,要检查是否支持这些功能,可以使用docker info 命令 ,如果内核中的某项特性可能会linux在输出结尾处看到警告, 如下docker安装部署所示:
WARNING: No swap limit support
  • 可通过修改内核参数消除以上警告
  • 官方文档: https系统/运维://docs.docker.com/install/linux/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities

5.1 OOM (Out of Memory Exception)

对于 Linux 主机,如果没有足够linux系统安装的内存来执行其他重要的系统任务,将会抛出OOM (Out of MemoryException,内存系统/运维溢出、内存泄漏、内存异常 )系统运维工资一般多少,随后系统会开始杀死进docker菜鸟教程程以docker菜鸟教程释放内存, 凡是运行在宿主机的进程都有可能被 kill ,包括 Dockerd和其它的应用程序, 如果重要的系统进程被 Kill,会导致和该进程相关的服务全部宕机。通常越消耗内存比较大的应用越容易被kill,比如: MySQL数据库,Java程序等


                                            Docker 网络介绍及资源限制

产生 OOM 异常docker是干什么的时, Dockerd尝试linux操作系统基础知识通过调整 Dockelinux系统安装r 守护程序上的 OOM 优先级来减系统运维工作内容轻这些风险,以便它比系统上的其他进程更不可能被杀死但是容器 的 OOM 优先级未调整, 这使得单个容器被杀死的可能性比 Docker守护程序或其他系统进程被杀死的可能性dockers什么品牌更大,不推荐通过在守护程序或容器上手动设置-- oom -score-adj为极端负docker安装部署数,或通过在容器上设置 --linux必学的60个命令 oom-kill-disable来绕过这些安全措施

OOM 优先级机制:

linux会为每个进程算一个分数,最终将分数最高的kill

/proc/PID/oom_score_adj
#范围为 -1000 到 1000,值越高容易被宿主机 kill掉,如果将该值设置为 -1000 ,则进程永远不会被
宿主机 kernel kill
/proc/PID/oom_adj
#范围为 -17 到+15 ,取值越高越容易被干掉,如果是 -17 , 则表示不能被 kill ,该设置参数的存在
是为了和旧版本的 Linux 内核兼容。
/proc/PID/oom_score
#这个值是系统综合进程的内存消耗量、 CPU 时间 (utime + 、存活时间 (uptime - start time)
和 oom_adj 计算出的进程得分 ,消耗内存越多得分越高,容易被宿主机 kernel 强制杀死

5.2 容器内存限制

Docker 可以linux系统安装强制执行硬性内存限制,即只允许容器使用给定的内存大小。

Docker 也可以执行非硬性内存限制,即容器可以使用尽可能多的内存,除非内核检测到主机上的内存不够用了

官文文档: https://docs.docker.com/config/conlinux必学的60个命令tainerdocker网络管理s/resource_constraints/

以下设置大部分的选项取正整数,跟着一个后缀b , k , m , g ,,表示字节,千字节,兆字节或千兆字节

-m , --memory= #容器可以使用的最大物理内存量,硬限制,此选项最小允许值为4m (4 MB),此项较常用

5.3 容器CPU限制

官方文档说明: https://docs.docker.com/confidocker镜像g/containers/resource_constraintslinux重启命令/

一个宿主机,有几十个核心的CPU,但是宿主机上可linux是什么操作系统以同时linux必学的60个命令运行成百上千个不同的进程用以处理不同的任务,多进linux操作系统基础知识程共用一个 CPU 的核docker菜鸟教程心为可压缩资源,即docker是干什么的一个核心的 CPU 可以通过调度而运行多个进程,但是同一个单位时间内只能有一docker容器个进程在 CPU 上运行,那么这么多linux操作系统基础知识进程怎么在 CPU 上执行和调度的呢?

Linux kernel 进程的调度基于CFS(Completely Fair Scheduler),完全公平调度

服务器资源密集型

  • CPU 密集型的场景:docker容器 优先级越低越好,计算密集型任务的特点是要进行大量的计算,消耗系统运维工作内容CPU 资源,比如计算圆周率、数据处理、对视频进行高清解码等等,全靠CPU 的运算能力。
  • IO 密集型的场景: 优先级值高点,涉及到网络、磁盘IO 的任务都是IO 密集型任务,这类任务的特点是 CPU 消耗很少,任务的大部分时间都在等待 Ilinux命令O 操作完成(因为 IO 的速度远远低于 CPU 和内存的速度),比如 Web 应用,linux命令高并发,数据量大的动态网站来说,数据库应该为IO 密集型

Clinux系统安装FS原理

cfs定义了进程调度的新模型,它给cdocker资源限制fs_rq(cfs的rundocker是干什么的 queue)中的每一个进程安排一个虚拟时钟vruntime。如果一dockers什么品牌个进程得以执行,随着时间的增长,其vrunlinux重启命令time将不断增大。没有得到执行的进程vruntime不变, 而调度器总是选择vruntime跑得最慢的那个进程来执行。这就是所谓的“完全公平”。为了区别不同优先级的进程,优先级高的进程vruntime增长得慢,以至于它可能得到更多的运行机会。CFS的意义在于, 在一个混杂着大量计算型进程和IO交互进程的系统中,CFS调度器相对linux系统其它调度器在对待IO交互进程要更加友善和公平。

默认情况下,每个容器对主机的CPU周期的访问都是不受限制的。可以设置各种约束,以限制给定容器对主机CPU周期的访问。大多数用户使用并配置 默认的CFS调度程序。在Docker 1.13及更高版本中,还可以配置 realtime scheduler。CFS是用dockers什么品牌于常规Linux进程的Linux内核CPU调度程序。通过几个运行时标志,可以配置对容器拥有的CPU资源的访问量。使用这些设置时,Docker会在主机上修改容器cgroup的设置。

--cpus=
#指定一个容器可以使用多少个可用的CPU核心资源。例如,如果主机有两个CPU,如果设置了--cpus="1.5" ,则可以保证容器最多使用1.5个的CPU(如果是4核CPU,那么还可以是4核心上每核用一点,但是总计是1.5核心的CPU)。这相当于设置--cpu-period="100000" 和--cpu-quota="150000" 。此设置可在Docker 1.13及更高版本中可用,目的是替代--cpu-period和--cpu-quota两个参数,从而使配置更简单,但是最大不能超出宿主机的CPU总核心数(在操作系统看到的CPU超线程后的数值),此项较常用

6、 压测工具

tress-nlinux操作系统基础知识g

7、可视化图形工具Portainer

Portainer是一个linux必学的60个命令可视化的容器镜像的图形管理工具,利用Portainer可以轻松构建,管理和维护Docker
环境。 而且完全免费,基于容器化的安装方式,方便高效部署。

官方站点: https://www.portainer.io/

官方安装说明: https://www.portainer.io/installation/

[root@ubuntu1804 ~]#docker search portainer |head -n 3
NAME DESCRIPTION STARS OFFICIAL
AUTOMATED
portainer/portainer Making Docker management easy. https://porta… 1569
portainer/agent An agent used to manage all the resources in… 54
#portainer项目废弃
[root@ubuntu1804 ~]#docker pull portainer/portainer
#portainer-ce项目代替portainer
[root@ubuntu1804 ~]#docker pull portainer/portainer-ce
[root@ubuntu1804 ~]#docker volume create portainer_data
portainer_data
[root@ubuntu1804 ~]#docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --
restart=always -v /var/run/docker.sock:/var/run/docker.sock -v
portainer_data:/data portainer/portainer-ce
20db26b67b791648c2ef6aee444a5226a9c897ebcf0160050e722dbf4a4906e3
[root@ubuntu1804 ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
20db26b67b79 portainer/portainer "/portainer" 5 seconds ago
Up 4 seconds 0.0.0.0:8000->8000/tcp, 0.0.0.0:9000->9000/tcp portainer

用浏览器访问: http://localhost:9000 可以看到以下界面
设置admin用户,需要输入两次超过8个linux命令linux重启命令符的相同的