Docker管理指南(5) – 使用systemd控制和配置Docker

许多Linux发行版本使用systemd来启动docker daemon。本文介绍如何自定义docker设置的一些示例。

启动docker daemon

docker安装后,开始启动docker daemon。

  1. $ sudo systemctl start docker
  2. # 或旧的发行版本,使用
  3. $ sudo service docker start

设置docker开机启动:
$ sudo systemctl enable docker
# 或旧的发行版本,使用
$ sudo chkconfig docker on

自定义docker daemon选项

有几种方法来配置docker daemon的参数和环境变量。
推荐的方法是使用systemd的drop-in文件。这些是在/etc/systemd/system/docker.service.d目录的命名为.conf的本地文件。也可以放置在/etc/systemd/system/docker.service文件,会覆盖默认的/lib/systemd/system/docker.service文件。
不过如果你使用包管理器安装了docker,那么可能EnvironmentFile已经存在,为了向后兼容,在/etc/systemd/system/docker.service.d放置一下.conf文件,内容如下:

  1. [Service]
  2. EnvironmentFile=-/etc/sysconfig/docker
  3. EnvironmentFile=-/etc/sysconfig/docker-storage
  4. EnvironmentFile=-/etc/sysconfig/docker-network
  5. ExecStart=
  6. ExecStart=/usr/bin/dockerd $OPTIONS \
  7.           $DOCKER_STORAGE_OPTIONS \
  8.           $DOCKER_NETWORK_OPTIONS \
  9.           $BLOCK_REGISTRY \
  10.           $INSECURE_REGISTRY

检查docker.service是否使用了EnvironmentFile:

  1. $ systemctl show docker | grep EnvironmentFile
  2.  
  3. EnvironmentFile=-/etc/sysconfig/docker (ignore_errors=yes)

或者找出service文件放置的位置:

  1. $ systemctl show --property=FragmentPath docker
  2.  
  3. FragmentPath=/usr/lib/systemd/system/docker.service
  4.  
  5. $ grep EnvironmentFile /usr/lib/systemd/system/docker.service
  6.  
  7. EnvironmentFile=-/etc/sysconfig/docker

你可以使用一个覆盖文件来自定义docker daemon选项。位于/usr/lib/systemd/system或/lib/systemd/system目录的文件包含了默认的选项,不应该去编辑它。

运行时目录和存储驱动

你可能想控制docker镜像,容器和volumes占用的硬盘空间,这个可以把它们移动到一个单独的分区。
在这个示例中,我们假设你的docker.service文件类似如下:

  1. [Unit]
  2. Description=Docker Application Container Engine
  3. Documentation=https://docs.docker.com
  4. After=network.target
  5.  
  6. [Service]
  7. Type=notify
  8. # the default is not to use systemd for cgroups because the delegate issues still
  9. # exists and systemd currently does not support the cgroup feature set required
  10. # for containers run by docker
  11. ExecStart=/usr/bin/dockerd
  12. ExecReload=/bin/kill -s HUP $MAINPID
  13. # Having non-zero Limit*s causes performance problems due to accounting overhead
  14. # in the kernel. We recommend using cgroups to do container-local accounting.
  15. LimitNOFILE=infinity
  16. LimitNPROC=infinity
  17. LimitCORE=infinity
  18. # Uncomment TasksMax if your systemd version supports it.
  19. # Only systemd 226 and above support this version.
  20. #TasksMax=infinity
  21. TimeoutStartSec=0
  22. # set delegate yes so that systemd does not reset the cgroups of docker containers
  23. Delegate=yes
  24. # kill only the docker process, not all processes in the cgroup
  25. KillMode=process
  26.  
  27. [Install]
  28. WantedBy=multi-user.target

我们可以在/etc/systemd/system/docker.service.d目录放置一个drop-in文件,包含如下内容:

  1. [Service]
  2. ExecStart=
  3. ExecStart=/usr/bin/dockerd --graph="/mnt/docker-data" --storage-driver=overlay

可以在这个文件设置其它的环境变量,例如,HTTP_PROXY。
要更改ExecStart配置,可以在一行空的ExecStart的下一行放置一个新的ExecStart:

  1. [Service]
  2. ExecStart=
  3. ExecStart=/usr/bin/dockerd --bip=172.17.42.1/16

HTTP proxy

此示例覆盖了默认的docker.service文件。
如果你的主机需要通过Http代理服务器连网,你需要在docker systemd service文件配置一个http代理。
1.为docker service创建一个systemd drop-in目录:

  1. $ mkdir /etc/systemd/system/docker.service.d

2.创建/etc/systemd/system/docker.service.d/http-proxy.conf文件,添加HTTP_PROXY环境变量:

  1. [Service]
  2. Environment="HTTP_PROXY=http://proxy.example.com:80/"

3.可以使用NO_PROXY指定不需要代理的一些地址:

  1. Environment="HTTP_PROXY=http://proxy.example.com:80/" "NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"

4.重载配置

  1. $ sudo systemctl daemon-reload

5.验证配置是否已经加载:

  1. $ systemctl show --property=Environment docker
  2. Environment=HTTP_PROXY=http://proxy.example.com:80/

6.重启docker

  1. $ sudo systemctl restart docker

手动创建systemd单元文件

如果你不是使用包管理器安装的docker,但想整合docker进systemd便于管理。可以从https://github.com/docker/docker/tree/master/contrib/init/systemd下载两个单元文件安装到/etc/systemd/system目录即可。

标签:SystemdDocker 发布于:2019-11-20 00:29:04