第 12 章 Linux 容器

12.1. 使用 Docker 技术的 Linux 容器

Red Hat Enterprise Linux Atomic Host 7.1.4 包括以下更新:

docker 软件包升级为 upstream 版本 1.7.1,该版本中包含对版本 1.7 的改进,即包括对 Red Hat Enterprise Linux Atomic Host 7.1.3 中版本 1.6 的各种改进。有关版本 1.6 和 1.7.1 之间修复及功能完整列表日志变更,请查看:https://github.com/docker/docker/blob/master/CHANGELOG.md。另外,Red Hat Enterprise Linux Atomic Host 7.1.4 包含以下变更:
    • Docker 容器现在支持 firewalld。如果在该系统中运行 firewalld,则可通过 firewalld 添加规则。如果重新载入 firewalld,则会重新应用该配置。
    • Docker 现在将具体容器的 cgroup 信息挂载到 /sys/fs/cgroup 目录下。有些应用程序是根据其可用资源量做决定。例如:Java 虚拟机(JVM)会检查它们可以使用的内存,以便分配足够大的池,提高其性能。这样可通过读取 /sys/fs/cgroup/memory 文件让应用程序了解其最多可使用的内存。
    • 现在如果在环回设备中使用设备映射器,docker run 命令会弹出一条警告信息。强烈建议在产品环境中使用 dm.thinpooldev 作为存储选项。请勿在产品环境中使用 loopback
    • 现在可以使用 --init=systemd 标签中 systemd 模式中运行容器。如果要将 systemd 作为 PID 1 运行容器,则这个标签会启动所有 systemd 功能,允许其在非特权容器中运行。将 container_uuid 设定为环境变量,以便 systemd 了解 /etc/machine-id 文件中保存的内容 。这个文件将容器内的 journald 与外部日志链接。将主机目录挂载到容器中以便 systemd 在将主机日志目录挂载到容器时不需要特权。如果在容器中运行 journald,则主机中的 journalctl 程序就可以显示其内容。将 /run 目录作为 tmpfs 挂载。然后如果指定 --systemd 选项,则会在容器中将 /sys/fs/cgroup 目录自动挂载为只读。
    • 改进在容器中使用 docker search 命令搜索的体验:
      • 现在可以在搜索结果中预置索引。
      • 可使用注册名作为远程名称前缀。
      • 如果不是 IP 地址则可缩短索引名称。
      • 添加 --no-index 选项避免列出索引名称。
      • 更改保留索引后的条目排序方式:可根据 index_namestart_countregistry_namenamedescription 排序。
      • 更改省略索引后的条目排序方式:可根据 registry_namestar_countnamedescription 排序。
    • 可使用 Docker 信息 API 显示配置的注册列表。

Red Hat Enterprise Linux Atomic Host 7.1.3 包括以下更新:

  • docker-storage-setup
    • docker-storage-setup 现在依赖逻辑卷管理器(LVM)自动扩展其精简池。默认情况下,卷组中 60% 的剩余空间会用于精简池,并根据 LVM 的大小自动增长。精简池占用 60% 后,会以 20% 的速度增长。
    • 现在 docker-storage-setup 的默认配置文件为 /usr/lib/docker-storage-setup/docker-storage-setup。可编辑 /etc/sysconfig/docker-storage-setup 文件覆盖默认配置文件中的设置。
    • 删除为创建精简池而为 docker 服务提供裸块设备的支持。现在 docker-storage-setup 服务会创建 LVM 精简池,并将其提供给 docker。
    • 将精简池的区块大小从 64K 增加到 512K。
    • 默认情况下,root 用户的分区表不会增长。可通过在 /etc/sysconfig/docker-storage-setup 文件中设定 GROWPART=true 选项改变这一行为。
    • 现在使用 skip_block_zeroing 功能设置精简池。就是说在池中提供新块时,不会将其归零。这样做是出于性能考虑。使用 --zero 选项可改变这一行为。
      lvchange --zero y thin-pool
    • 默认情况下,使用 devicemapper 圆形驱动器的 docker 存储会在环回设备中运行。强烈建议不要使用这个设置,因为它尚不可用于产品环境。会为用户显示警告信息。使用这个选项的用户可使用 dm.no_warn_on_loop_devices=true 标签跳过这个警告。
  • 有关在使用 Docker 格式化的容器中处理存储的关系:
    • 添加使用 SELinux 验证的 NFS 卷插件。这包括在以 NFS 挂载的 GlusterFS 中使用 NFS 卷插件。
    • 添加只为 NFS 卷插件验证的持久卷支持。
    • 添加使用 SELinux 验证的本地存储(HostPath 卷插件)。(需要本文档中描述的临时解决方案)
    • 添加使用 SELinux 验证的 iSCSI 卷插件。
    • 添加使用 SELinux 验证的 GCEPersistentDisk 卷插件。(需要本文档中描述的临时解决方案)

Red Hat Enterprise Linux Atomic Host 7.1.2 包括以下更新:

  • docker-1.6.0-11.el7
    • 完全重新架构后的注册表以及 Docker 支持的注册表 API,可显著提高性能及可靠性。
    • 新的日志驱动程序 API 可让您向添加到 docker 程序的其他系统发送容器日志。在 docker run 命令中添加 --log driver 选项,该选项可使用三个子选项:JSON 文件、syslog 或 none。可在包含非重要详细日志的应用程序中使用 none 选项。
    • 现在可在提交和导入时使用 Dockerfile 说明。这样还添加了在运行的映像中进行修改而无需创建整个映像的功能。可使用 commit --changeimport --change 选项指定应用于新映像的标准变更。这些是 Dockerfile 句法中的表达式,并可用于修改映像。
    • 这个发行本添加了自定义 cgroup 支持。可使用 --cgroup-parent 标签提供运行容器的具体 cgroup。这样就可以创建并管理 cgroup 本身。可为那些 cgroup 规定自定义资源,并将容器放在通用上级组中。
    • 现在可在配置 Docker 守护进程时,使用这个更新为所有容器指定默认无限设置。例如:
      docker -d --default-ulimit nproc=1024:2048
      这个命令为所有容器设定了一个子进程软限制(1024)和一个子进程硬限制(2048)。可为不同的无限值多次设定这个选项,例如:
      --default-ulimit nproc=1024:2408 --default-ulimit nofile=100:200
      可在创建类似如下容器时覆盖这些设置:
      docker run -d --ulimit nproc=2048:4096 httpd
      这样就会覆盖守护进程使用的默认 nproc 值。
    • 使用 --block-registry 标签阻止注册表的功能。
    • 支持一次搜索多个注册表。
    • 将本地映像推入公共注册表时需要确认。
    • 短名称会在本地根据按顺序配置的注册表列表解析,docker.io 注册表在最后。永远使用完全限定域名提取。

Red Hat Enterprise Linux Atomic Host 7.1.1 包括以下更新:

  • docker-1.5.0-28.el7
    • IPv6 支持:可用于全局路由及本地链接地址支持。
    • 只读容器:这个选项只用于防止将容器中的应用程序写入整个文件系统。
    • 统计 API 及端点:现在可统计容器串流实时 CPU、内存、网络 IO 及块 IO 数据。
    • 使用 docker build -f docker_file 命令指定用于 docker 构建的 dockerfile 以外的其他文件。
    • 可在非限定请求和搜索中指定要使用的附加注册表。之前只能在公用 Docker 集线器中搜索非限定名称。
    • 可使用 --block-registry=<registry> 标签阻断与某些注册表之间的沟通。这包括阻断公用 Docker 集线器的功能,以及阻断指定注册表以外的所有集线器的功能。
    • 推入公共注册表时要求确认。
    • 现在列出时所有存储库均为完全限定。docker images 输出结果会为所有请求的映像列出源注册表名称。docker search 输出会为所有结果列出源注册表名称。