docker资源限制以及compose基础应用

docker资源限制以及compose基础应用


docker资源限制

  • 在使用docker运行容器时,一台主机上可能会运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的CPU,内存和磁盘资源。如果不对容器使用的资源进行限制,那么容器之间会互相影响,小的来说会导致容器资源使用不公平;大的来说,可能会导致主机和集群资源耗尽,服务完全不可用.docker

  • 作为容器的管理者,自然提供了控制容器资源的功能。正如使用内核的命名空间来做赚容器之间的隔离,docker也是通过内核的cgroups来做容器的资源限制。

1. 内存(不可压缩资源)

  • 1.1 了解耗尽内存的风险
  • 不让正在运行的容器消耗太多的主机内存是很重要的。在 Linux 主机上,如果内核检测到没有足够的内存来执行重要的系统功能,它会抛出一个 OOME内存耗尽 或 Out Of Memory Exception,并开始查杀进程以释放内存。任何进程都可能被杀掉,包括 Docker 和其他重要应用程序。如果终止了错误进程,有可能导致系统宕机。

  • Docker 尝试通过调整 Docker 守护进程的 OOM 优先级来降低这些风险,从而使其和系统上的其他进程相比更不容易被杀掉。容器的 OOM 优先级不调整。这使得单个容器被杀死的可能性要比 Docker 守护进程或其他系统进程被终止的可能性要大。不应该通过手动将守护程序或容器上的 –oom-score-adj 设置为极端负数,或通过在容器上设置 –oom-disable-kill 来尝试规避这些安全措施。

  • 生产环境一般不建议使用swap,因为使用swap会严重影响服务器性能。
  • 选项 描述

    • -m 或 –memory= 容器可用的最大内存。如果设置了这个值,最小可用内存是 4MB。
    • –memory-swap* 允许容器放入磁盘 swap 中的内存数量。
    • –memory-swappiness 默认情况下,主机内核可以交换容器使用的匿名页面的百分比。可以设置为介于0和100之间的值,以调整此百分比。用来定义系统是使用的交换分区的倾向性(数值越大越倾向使用,数值越低越少越晚的使用能不用则不用)
    • –memory-reservation 软限制。指定一个小于 –memory 的软限制,当 Docker 检测到主机上的争用或内存不足时,会采用这个限制来替换 –memory。如果使用这个限制,则必须将其设置为低于 –memory,以使其优先。不能保证容器不会超出限制。
    • –kernel-memory 容器可以使用的最大内核内存量。允许的最小值是 4m。由于内核内存不能被换出,因此内核内存不足的容器可能会阻塞主机资源,这会对主机和其他容器产生副作用。
    • –oom-kill-disable 默认情况下,如果发生内存不足(OOM)错误,内核会杀死容器中的进程。使用 –oom-kill-disable 选项可以更改此行为。注意只能在同时设置了-m/–memory 选项的容器上使用此选项,因为如果未设置 -m 标志,可能会耗尽主机的内存,导致内核需要终止主机系统的进程以释放内存。
  • 1.2 限制容器对内存的访问

    • Docker 可以对内存实施两种限制:硬限制,允许容器使用不超过给定数量的用户或系统内存;软限制,允许容器使用尽可能多的内存,除非满足某些条件,例如内核检测到内存不足或主机上的争用。其中一些选项在单独使用或同时设置多个选项时会有不同的效果。
    • 这些选项大多数都是一个正整数,后跟一个后缀 b,k,m,g,以表示字节,千字节,兆字节或千兆字节。

  • 1.3 –memory-swap 详情

    • –memory-swap 是一个修饰符标志,只有在 –memory 也被设置时才有意义。使用 swap 使得容器可以在耗尽所有可用 RAM 时,将多余的内存需求写入磁盘。对于经常将内存交换到磁盘的应用程序会有性能损失。
    • 其设置可能会产生复杂的效果:

      • 如果 –memory-swap 设置为正整数,那么 –memory 和 –memory-swap 都需要设置。–memory-swap 表示所有可用的内存和 swap 之和,并且 –memory 控制非 swap 内存数量。因此,如果 –memory=”300m” 和 –memory-swap=”1g”,则容器可以使用 300MB 内存和 700MB swap。
      • 如果 –memory-swap 设置为 0,则会忽略这个设置。
      • 如果 –memory-swap 设置的值与 –memory相同,并且 –memory 设置为正整数,则容器无法访问 swap。
      • 如果 –memory-swap 未设置,并且 –memory 设置了,如果主机容器配置了交换内存,则容器会使用 –memory 设置值的两倍作为 swap 的大小。例如,如果 –memory=”300m”,–memory-swap没有设置,则容器可以使用 300MB 内存和 600MB swap。
      • 如果 –memory-swap 显式设置为 -1,允许容器使用无限制的 swap,直到达到主机系统可用值。
  • 禁止容器使用 SWAP

    • 如果 –memory-swap 设置的值与 –memory相同,则容器无法访问 swap。这是因为 –memory-swap 设置的值是可用的内存与 swap 之和,而 –memory 是可用的物理内存量。
  • 1.4 –memory-swappiness 详情

    • 值为 0 时,关闭匿名页的 swap。
    • 值为 100 时,所有匿名页都可以 swap。
    • 默认情况下,如果没有设置 –memory-swappiness,会从主机继承这个值。
  • 1.5 –kernel-memory 详情
    • 内核内存限制以分配给指定容器的全部内存来表示。考虑以下情况:
      • 无限内存,无限内核内存:这是默认行为。
      • 无限内存,有限内核内存:当所有 cgroup 所需的内存大于主机上实际存在的内存时,这是合适的。可以将内核内存配置为永远不会覆盖主机上可用的内容,而需要更多内存的容器需要等待。
      • 有限内存,无限内核内存:整个内存是有限的,但内核内存不是。
      • 有限内存,有限内核内存:限制用户和内核内存可用于调试与内存相关的问题。如果某个容器对任意一种内存的使用数量超量,则会导致内存不足但不会影响其他容器或主机。在此设置下,如果内核内存限制低于用户内存限制,则内核内存用尽会导致容器遇到 OOM 错误。如果内核内存限制高于用户内存限制,则内核限制不会导致容器体验 OOM。
  • 当打开任何内核内存限制时,主机会在每个进程的基础上跟踪“high water mark”(高位标记)统计信息,以便跟踪哪些进程(在这种情况下是容器)正在使用多余的内存。可以通过在主机上查看 /proc//status 来查看每个进程。

2. CPU(可压缩资源)

  • 默认情况下,每个容器对主机 CPU 的周期访问是无限的。可以设置各种约束来限制给定容器访问主机的 CPU 周期。大多数用户使用和配置默认的 CFS 调度器。在 Docker 1.13 及更高版本中,还可以配置实时调度器

  • 2.1 配置默认的 CFS 调度器

    • CFS 是用于普通 Linux 进程的 Linux 内核 CPU 调度程序。几个运行时标志允许配置容器的 CPU 资源访问量。使用这些设置时,Docker 会修改主机上容器的 cgroup 设置。

压测

此镜像可以进行压测,参考镜像地址:https://hub.docker.com/r/lorel/docker-stress-ng

1
2
3
4
5
拖下测试镜像
[root@centos7 ~]# docker pull lorel/docker-stress-ng

查看镜像的使用帮助
[root@centos7 ~]# docker run --name pc1 -it --rm lorel/docker-stress-ng --help

docker compose容器编排工具

官网:https://docs.docker.com/compose/

  • 1.Compose介绍

    • Docker Compose是一个用来定义和运行复杂应用的Docker工具。一个使用Docker容器的应用,通常由多个容器组成。使用Docker Compose不再需要使用shell脚本来启动容器。
    • Compose 通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。
  • 2.Compose和Docker兼容性

范例:打算部署一个wordpress

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
WordPress:

1. 在你的主文件夹中创建一个名为my_wordpress的新目录,并将cd放入其中:
#yum install docker-compose
# systemctl start docker
# mkdir ~/my_wordpress/
# cd ~/my_wordpress/
# docker pull wordpress:latest
# docker pull mysql:5.7


2. 创建一个名为docker-compose的文件。并在此文件夹中添加以下内容。为WORDPRESS_DB_PASSWORD、MYSQL_ROOT_PASSWORD和MYSQL_PASSWORD环境选项设置您自己的密码。为WORDPRESS_DB_PASSWORD和MYSQL_PASSWORD输入的密码应该相同。

# rpm -q docker-compose
#docker-compose-1.18.0-2.el7.noarch

vim docker-compose.yml
version: '3.3'

services:
wordpress: #服务
depends_on:
- db
image: wordpress:latest #互联网镜像为wordpress(http、php、php-mysql、wordpress)
volumes:
- wordpress_files:/var/www/html
ports:
- "80:80" #端口映射,左侧宿主机右侧容器
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: my_wordpress_db_password

db: #服务
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: my_db_root_password
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: my_wordpress_db_password
volumes:
wordpress_files:
db_data:



3. 从my_wordpress目录,开始你的Docker容器:

# docker-compose up -d


4. Docker容器启动WordPress和MySQL需要一到两分钟。之后,您可以在web浏览器中访问您的IP地址,您应该被引导到WordPress设置表单。

文档出处,
https://www.linode.com/docs/quick-answers/linux/wordpress-with-docker-compose/

docker ps 命令:

过滤器:过滤标志(-f或–filter)格式是key=value。如果超过一个过滤,就传递多个标志(如–filter “foo=bar” –filter “bif=baz”)
目前支持的过滤有如下这些:

    id(容器id)
    label(label=或label=>)
    name(容器名称)
    exited(整数 – 容器退出码。只在使用–all才有用)
    status (created restarting running paused exited dead)
    ancestor([:], or ) – 过滤从指定镜像创建的容器。
    before (容器的名称或id) – 过滤在给定id或名称之前创建的容器。
    since (容器的名称或id) – 过滤在给定id或名称之后创建的容器。
    isolation (default process hyperv) (Windows daemon only)
    volume (数据卷名称或挂载点) – 过滤挂载有指定数据卷的容器。
    network (网络id或名称) – 过滤连接到指定网络的容器。

--format为格式化输出。格式化选项(–format)使用Go模板来美化打印容器输出。
Go模板有效的占位符如下:

    .ID 容器ID
    .Image 镜像ID
    .Command Quoted command
    .CreatedAt 创建容器的时间点.
    .RunningFor 从容器创建到现在过去的时间.
    .Ports 暴露的端口.
    .Status 容器状态.
    .Size 容器占用硬盘大小.
    .Names 容器名称.
    .Labels 容器所有的标签.
    .Label 指定label的值 例如'{{.Label “com.docker.swarm.cpu”}}’
    .Mounts 挂载到这个容器的数据卷名称



Docker参考手册:
    https://docs.docker.com/engine/reference/commandline/dockerd/
-------------------码字不易尊重原创转载标注不胜感激-------------------
Yes or no?
0%