使用 systemd 配置守护进程

本页介绍如何在使用 systemd 时自定义守护进程设置。

自定义 Docker 守护进程选项

Docker 守护进程的大多数配置选项都是使用daemon.json 配置文件设置的。有关更多信息,请参阅Docker 守护进程配置概述。

手动创建 systemd 单元文件

在没有包管理器的情况下安装二进制文件时,您可能希望将 Docker 与 systemd 集成。为此,请将GitHub 存储库service中的两个单元文件 (和 socket) 安装 到./etc/systemd/system

配置 Docker 守护进程以使用代理服务器

Docker 守护进程在其启动环境中使用以下环境变量来配置 HTTP 或 HTTPS 代理行为:

  • HTTP_PROXY
  • http_proxy
  • HTTPS_PROXY
  • https_proxy
  • NO_PROXY
  • no_proxy

在 Docker Engine 23.0 及更高版本中,您还可以在daemon.json文件中为守护进程配置代理行为:

{
  "proxies": {
    "http-proxy": "http://proxy.example.com:3128",
    "https-proxy": "https://proxy.example.com:3129",
    "no-proxy": "*.test.example.com,.example.org,127.0.0.0/8"
  }
}

这些配置会覆盖默认的docker.servicesystemd 文件。

如果您位于 HTTP 或 HTTPS 代理服务器后面(例如在公司设置中),则必须在 systemd 服务文件中指定守护程序代理配置,而不是在文件中daemon.json或使用环境变量。

无根模式注意事项

在无根模式下运行 Docker 时,systemd 配置文件的位置有所不同 。当以无根模式运行时,Docker 作为用户模式 ​​systemd 服务启动,并使用存储在每个用户主目录中的文件 ~/.config/systemd/user/docker.service.d/。此外,必须在不带标志和带标志的systemctl情况下执行。如果您在无根模式下运行 Docker,请选择下面的“无根模式”选项卡。sudo--user


  1. 为该服务创建一个 systemd 放置目录docker

    $ sudo mkdir -p /etc/systemd/system/docker.service.d
    
  2. /etc/systemd/system/docker.service.d/http-proxy.conf 创建一个名为添加环境​​变量的文件HTTP_PROXY

    [Service]
    Environment="HTTP_PROXY=http://proxy.example.com:3128"

    如果您位于 HTTPS 代理服务器后面,请设置HTTPS_PROXY环境变量:

    [Service]
    Environment="HTTPS_PROXY=https://proxy.example.com:3129"

    可设置多个环境变量;设置非 HTTPS 和 HTTPs 代理;

    [Service]
    Environment="HTTP_PROXY=http://proxy.example.com:3128"
    Environment="HTTPS_PROXY=https://proxy.example.com:3129"

    笔记

    代理值中的特殊字符(例如#?!()[]{})必须使用 进行双重转义%%。例如:

    [Service]
    Environment="HTTP_PROXY=http://domain%%5Cuser:complex%%23pass@proxy.example.com:3128/"
  3. 如果您有需要在不使用代理的情况下联系的内部 Docker 注册表,则可以通过NO_PROXY环境变量指定它们。

    NO_PROXY变量指定一个字符串,其中包含应从代理中排除的主机的逗号分隔值。您可以指定以下选项来排除主机:

    • IP 地址前缀 ( 1.2.3.4)
    • 域名,或特殊的 DNS 标签 ( *)
    • 域名与该名称和所有子域相匹配。以“.”开头的域名仅匹配子域。例如,给定域 foo.example.comexample.com
      • example.com匹配example.comfoo.example.com, 和
      • .example.com仅匹配foo.example.com
    • 单个星号 ( *) 表示不应进行代理
    • 1.2.3.4:80IP 地址前缀 ( ) 和域名 ( foo.example.com:80)接受文字端口号

    例子:

    [Service]
    Environment="HTTP_PROXY=http://proxy.example.com:3128"
    Environment="HTTPS_PROXY=https://proxy.example.com:3129"
    Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp"
  4. 刷新更改并重新启动 Docker

    $ sudo systemctl daemon-reload
    $ sudo systemctl restart docker
    
  5. 验证配置是否已加载并与您所做的更改相匹配,例如:

    $ sudo systemctl show --property=Environment docker
    
    Environment=HTTP_PROXY=http://proxy.example.com:3128 HTTPS_PROXY=https://proxy.example.com:3129 NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp
    
  1. 为该服务创建一个 systemd 放置目录docker

    $ mkdir -p ~/.config/systemd/user/docker.service.d
    
  2. ~/.config/systemd/user/docker.service.d/http-proxy.conf 创建一个名为添加环境​​变量的文件HTTP_PROXY

    [Service]
    Environment="HTTP_PROXY=http://proxy.example.com:3128"

    如果您位于 HTTPS 代理服务器后面,请设置HTTPS_PROXY环境变量:

    [Service]
    Environment="HTTPS_PROXY=https://proxy.example.com:3129"

    可设置多个环境变量;设置非 HTTPS 和 HTTPs 代理;

    [Service]
    Environment="HTTP_PROXY=http://proxy.example.com:3128"
    Environment="HTTPS_PROXY=https://proxy.example.com:3129"

    笔记

    代理值中的特殊字符(例如#?!()[]{})必须使用 进行双重转义%%。例如:

    [Service]
    Environment="HTTP_PROXY=http://domain%%5Cuser:complex%%23pass@proxy.example.com:3128/"
  3. 如果您有需要在不使用代理的情况下联系的内部 Docker 注册表,则可以通过NO_PROXY环境变量指定它们。

    NO_PROXY变量指定一个字符串,其中包含应从代理中排除的主机的逗号分隔值。您可以指定以下选项来排除主机:

    • IP 地址前缀 ( 1.2.3.4)
    • 域名,或特殊的 DNS 标签 ( *)
    • 域名与该名称和所有子域相匹配。以“.”开头的域名仅匹配子域。例如,给定域 foo.example.comexample.com
      • example.com匹配example.comfoo.example.com, 和
      • .example.com仅匹配foo.example.com
    • 单个星号 ( *) 表示不应进行代理
    • 1.2.3.4:80IP 地址前缀 ( ) 和域名 ( foo.example.com:80)接受文字端口号

    例子:

    [Service]
    Environment="HTTP_PROXY=http://proxy.example.com:3128"
    Environment="HTTPS_PROXY=https://proxy.example.com:3129"
    Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp"
  4. 刷新更改并重新启动 Docker

    $ systemctl --user daemon-reload
    $ systemctl --user restart docker
    
  5. 验证配置是否已加载并与您所做的更改相匹配,例如:

    $ systemctl --user show --property=Environment docker
    
    Environment=HTTP_PROXY=http://proxy.example.com:3128 HTTPS_PROXY=https://proxy.example.com:3129 NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp