通过systemd配置Docker

2023年6月11日12:06:46

前面一直是用的1.8.2版本的Docker,最近集群中增加了几个节点装了1.9.1版本,结果在配置使用“--insecure-registry"方式不通过key直接登录local registry时,发现1.9.1版本中没有了"/etc/sysconfig/docker"文件,也没有”/etc/default/docker"这个文件。

后来参考官方文档通过配置systemd service文件的方式解决了这个问题。关于官方文档中介绍的更多通过systemd配置内容,请参考官方文档“Control and Configure Docker with systemd”。本文重点通过介绍配置--insecure-registry来介绍如何通过systemd配置Docker。

1. systemd Service相关目录

通常情况下,我们有3种方式可以配置etcd中的service。以docker为例,1)在目录/etc/systemd/system/docker.service.d目录下放systemd drop-in文件;2)通过修改/etc/systemd/system/docker.service文件;3)通过修改/lib/systemd/system/docker.service文件。如果2)和3)的文件同时存在,2)将覆盖3)。

默认情况下1)和2)都不存在,我们此处也用不着太复杂的去使用选项1)和2),直接修改3)就可以解决问题。

2. Version 1.8.2 到 Version 1.9.1 docker.service文件的变化

版本1.8.2的docker.service文件内容如下。可以看到“/etc/sysconfig/docker" 文件是如何被引用的,以及该文件中定义的”INSECURE_REGISTRY"变量是如何生效的。首先,在“/etc/sycconfig/docker" 中定义变量;然后通过“EnvironmentFile” 引用“/etc/sysconfig/docker"文件;最后在”ExecStart“启动daemon时,将”INSECURE_REGISTRY"变量作为daemon选项执行。

[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target
Wants=docker-storage-setup.service

[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
Environment=GOTRACEBACK=crash
ExecStart=/usr/bin/docker daemon $OPTIONS \
          $DOCKER_STORAGE_OPTIONS \
          $DOCKER_NETWORK_OPTIONS \
          $ADD_REGISTRY \
          $BLOCK_REGISTRY \
          $INSECURE_REGISTRY
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
MountFlags=slave
TimeoutStartSec=1min
Restart=on-failure

[Install]
WantedBy=multi-user.target


版本1.9.1的docker.service文件内容如下所示。可以看到一个很主要的区别就是1.9.1中缺少了对EnvironmentFile的引用,以及在‘ExecStart’启动docker daemon时对环境变量的使用。

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target docker.socket
Requires=docker.socket

[Service]
Type=notify
ExecStart=/usr/bin/docker daemon -H fd://
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity

3. 解决方案

1)参考1.8.2的方式,也为了保持与1.8.2的向上兼容。首先在创建"/etc/sysconfig/docker"文件,并在文件加入如下行:

<span style="font-size:14px;">INSECURE_REGISTRY='--insecure-registry=https://xingwangc.docker.rg --insecure-registry=xingwangc.docker.rg'</span>

注:上面变量定义中,第一个“--insecure-registry=https://xingwangc.docker.rg”用于通过用户名/密码登陆registry,第二个“--insecure-registry=xingwangc.docker.rg"用于向registry push image和从registry pull image。第二个定义中没有指明“https”协议,如果加了“https”将造成无法从registry pull/push。理解了这个过程之后,就可以定义任何变量名了。

2)修改/lib/systemd/system/docker,增加EnvironmentFile引用/etc/sysconfig/docker文件,并在ExecStart中增加对环境变量的引用。

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target docker.socket
Requires=docker.socket

[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/docker
ExecStart=/usr/bin/docker daemon -H fd:// $INSECURE_REGISTRY
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity

[Install]
WantedBy=multi-user.target

3)在刷新改动前,先查看下是否使用了EnvironmentFile,默认的是没有引用EnvironmentFile的。使用命令“systemctl show”

sudo systemctl show docker | grep EnvironmentFile EnvironmentFile=-

通过systemd配置Docker

4)刷新改动,并重启docker,并检查EnvironmentFile

sudo systemctl daemon-reload
sudo systemctl restart docker

通过systemd配置Docker


5)验证登陆registry,pull image

通过systemd配置Docker

参考链接:

Control and Configure Docker with Systemd

  • 作者:xingwangc2014
  • 原文链接:https://blog.csdn.net/xingwangc2014/article/details/50513946
    更新时间:2023年6月11日12:06:46 ,共 3098 字。