带你了解Docker背后的守护进程

# 带你了解Docker背后的守护进程 资料参考: [https://blog.51cto.com/u_15346415/4988712](https://blog.51cto.com/u_15346415/4988712) ## 守护进程的状态、启动、关闭、重启 ### (一)查看守护进程状态 **命令:** ``` # (一)查看守护进程状态 sudo service docker status # (二)启动、关闭、重启 # 停止守护进程 sudo service docker stop # 启动守护进程 sudo service docker start # 重启守护进程 sudo service docker restart # 备注:也可以适当使用init系统来管理和更新Docker守护进程的启动配置 ``` 运行说明: ``` [root@DC1-03-001 ~]# sudo service docker status Redirecting to /bin/systemctl status docker.service ● docker.service - Docker Application Container Engine Loaded: loaded (/etc/systemd/system/docker.service; disabled; vendor preset: disabled) Active: active (running) since Sat 2023-05-06 05:01:48 CST; 5 days ago Docs: https://docs.docker.com Main PID: 142562 (dockerd) Tasks: 181 Memory: 85.2M CGroup: /system.slice/docker.service ├─142562 /usr/bin/dockerd --selinux-enabled=false --insecure-registry=127.0.0.1 └─142594 containerd --config /var/run/docker/containerd/containerd.toml --log-level info May 08 02:46:11 DC1-03-001 dockerd[142562]: time="2023-05-08T02:46:11.880479220+08:00" level=info msg="shim reaped" id=6301c515f356aa193aacd356f69d94bf46d9b9568920d60ac01e7d3252c8232e May 08 02:46:11 DC1-03-001 dockerd[142562]: time="2023-05-08T02:46:11.890727040+08:00" level=info msg="ignoring event" module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDele> May 08 02:49:50 DC1-03-001 dockerd[142562]: time="2023-05-08T02:49:50.875885340+08:00" level=warning msg="Error getting v2 registry: Get https://mirror.ccs.tencentyun.com/v2/: dial tcp: lookup mirr> May 08 02:49:50 DC1-03-001 dockerd[142562]: time="2023-05-08T02:49:50.875949800+08:00" level=info msg="Attempting next endpoint for pull after error: Get https://mirror.ccs.tencentyun.com/v2/: dial> May 08 02:49:54 DC1-03-001 dockerd[142562]: time="2023-05-08T02:49:54.412319390+08:00" level=info msg="shim containerd-shim started" address="/containerd-shim/moby/1b1a7152043e3aaa431339733078c7fe8> May 08 02:49:54 DC1-03-001 dockerd[142562]: time="2023-05-08T02:49:54.779999240+08:00" level=info msg="shim reaped" id=1b1a7152043e3aaa431339733078c7fe86a7a0f015b4a96a681fbeb8bcd5273d May 08 02:49:54 DC1-03-001 dockerd[142562]: time="2023-05-08T02:49:54.790308850+08:00" level=info msg="ignoring event" module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDele> May 08 02:52:27 DC1-03-001 dockerd[142562]: time="2023-05-08T02:52:27.860503650+08:00" level=info msg="shim containerd-shim started" address="/containerd-shim/moby/ed0f04b3d765878297ceeb2c56ad2bd02> May 08 02:52:28 DC1-03-001 dockerd[142562]: time="2023-05-08T02:52:28.200237540+08:00" level=info msg="shim reaped" id=ed0f04b3d765878297ceeb2c56ad2bd0228ce572668cb047133ee68385b034c2 May 08 02:52:28 DC1-03-001 dockerd[142562]: time="2023-05-08T02:52:28.210511180+08:00" level=info msg="ignoring event" module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDele> lines 1-21/21 (END) ``` 比较: ``` [root@DC1-03-003 ~]# sudo service docker status Redirecting to /bin/systemctl status docker.service ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled) Active: failed (Result: exit-code) since Tue 2023-05-09 15:06:49 CST; 1 day 23h ago Docs: https://docs.docker.com Process: 324420 ExecStart=/usr/bin/dockerd --selinux-enabled=false --insecure-registry=127.0.0.1 (code=exited, status=1/FAILURE) Main PID: 324420 (code=exited, status=1/FAILURE) May 09 15:06:49 DC1-03-003 systemd[1]: docker.service: Service RestartSec=100ms expired, scheduling restart. May 09 15:06:49 DC1-03-003 systemd[1]: docker.service: Scheduled restart job, restart counter is at 3. May 09 15:06:49 DC1-03-003 systemd[1]: Stopped Docker Application Container Engine. May 09 15:06:49 DC1-03-003 systemd[1]: docker.service: Start request repeated too quickly. May 09 15:06:49 DC1-03-003 systemd[1]: docker.service: Failed with result 'exit-code'. May 09 15:06:49 DC1-03-003 systemd[1]: Failed to start Docker Application Container Engine. [root@DC1-03-003 ~]# ``` 配置Docker守护进程 [https://www.cnblogs.com/zuoyang/p/16355936.html](https://www.cnblogs.com/zuoyang/p/16355936.html) 有两种方式来配置 Docker 守护进程: 使用 JSON 配置文件。这是首选选项,因为它将所有配置保存在一个地方。 开始时使用标志dockerd。 只要您没有在标志和 JSON 文件中指定相同的选项,就可以同时使用这两个选项。如果发生这种情况,Docker 守护程序将不会启动并打印一条错误消息。 要使用 JSON 文件配置 Docker 守护程序,请在 Linux 系统:/etc/docker/daemon.json 或在 Windows:C:\ProgramData\docker\config\daemon.json 上创建一个文件。在 MacOS 上,转到任务栏中的鲸鱼 > 首选项 > 守护程序 > 高级。 下面是配置文件的样子: ``` { "debug": true, "tls": true, "tlscert": "/var/docker/server.pem", "tlskey": "/var/docker/serverkey.pem", "hosts": ["tcp://192.168.59.3:2376"] } ``` 使用此配置,Docker 守护程序以调试模式运行,使用 TLS,并侦听路由到 192.168.59.3 端口的流量 2376。您可以在 dockerd 参考文档中了解哪些配置选项可用 您还可以手动启动 Docker 守护程序并使用标志对其进行配置。这对于解决问题很有用。 下面是一个如何手动启动 Docker 守护进程的示例,使用与上述相同的配置: ` dockerd --debug \ --tls=true \ --tlscert=/var/docker/server.pem \ --tlskey=/var/docker/serverkey.pem \ --host tcp://192.168.59.3:2376 ` 您可以在 dockerd 参考文档中了解哪些配置选项可用,或者通过运行: `dockerd --help` Docker 文档中讨论了许多特定的配置选项。接下来要去的地方包括: 自动启动容器 [https://docs.docker.com/config/containers/start-containers-automatically/](https://docs.docker.com/config/containers/start-containers-automatically/) 限制容器的资源 [https://docs.docker.com/config/containers/resource_constraints/](https://docs.docker.com/config/containers/resource_constraints/) 配置存储驱动程序 [https://docs.docker.com/storage/storagedriver/select-storage-driver/](https://docs.docker.com/storage/storagedriver/select-storage-driver/) 容器安全 [https://docs.docker.com/engine/security/](https://docs.docker.com/engine/security/) # 检查 Docker 是否正在运行 检查 Docker 是否正在运行的独立于操作系统的方法是使用 docker info 命令询问 Docker。 您还可以使用操作系统实用程序,例如 sudo systemctl is-active docker 或 sudo status docker 或 sudo service docker status,或使用 Windows 实用程序检查服务状态。 最后,您可以使用或之dockerd类的命令检查进程的进程列表,pstop。 # 刷新更改并重新启动 Docker ` sudo systemctl daemon-reload sudo systemctl restart docker ` # 启用调试 有两种方法可以启用调试。推荐的方法是在 daemon.json 文件中将调试键设置为 true。此方法适用于每个 Docker 平台。 编辑 daemon.json 文件,该文件通常位于/etc/docker/。如果此文件尚不存在,您可能需要创建它。在 macOS 或 Windows 上,请勿直接编辑文件。相反,请转到 Preferences/Daemon/Advanced。 如果文件为空,请添加以下内容: `{ "debug": true }` 如果文件已经包含 JSON,只需添加 "debug": true。如果它不是右括号之前的最后一行,请注意在行尾添加逗号。还要验证是否设置了日志级别,是否将其设置为 info 或 debug。info是默认值,可能的值为debug, info, warn, error, fatal。 向守护程序发送HUP信号以使其重新加载其配置。在 Linux 主机上,使用以下命令。 `sudo kill -SIGHUP $(pidof dockerd)` 在 Windows 主机上,重新启动 Docker。 除了遵循此过程之外,您还可以停止 Docker 守护程序并使用调试标志手动重新启动它-D。但是,这可能会导致 Docker 使用与主机启动脚本创建的环境不同的环境重新启动,这可能会使调试更加困难。 守护程序日志可以帮助您诊断问题。日志可能保存在几个位置之一,具体取决于操作系统配置和使用的日志记录子系统: # Docker日志 |操作系统|地点| |-|-| |Linux |使用命令journalctl -xu docker.service(或读取/var/log/syslog或/var/log/messages,取决于您的 Linux 发行版)| |macOS(dockerd日志)|~/Library/Containers/com.docker.docker/Data/log/vm/dockerd.log| |macOS(containerd日志) |~/Library/Containers/com.docker.docker/Data/log/vm/containerd.log| |Windows (WSL2)(dockerd日志)|AppData\Roaming\Docker\log\vm\dockerd.log| |Windows (WSL2)(containerd日志)|AppData\Roaming\Docker\log\vm\containerd.log| |Windows(Windows 容器)|日志位于 Windows 事件日志中| 要在 macOS 上查看dockerd 日志,请打开终端窗口,然后使用 tail 带有 -f 标志的命令来“关注”日志。将打印日志,直到您使用以下命令终止命令CTRL+c: `tail -f ~/Library/Containers/com.docker.docker/Data/log/vm/dockerd.log` # Docker守护进程目录 Docker 守护进程将所有数据保存在一个目录中。这会跟踪与 Docker 相关的所有内容,包括 containers, images, volumes, service definition 和 secrets。 默认情况下,此目录为: /var/lib/docker 在 Linux 上。 C:\ProgramData\docker 在 Windows 上。 您可以使用配置选项将 Docker 守护程序配置为使用不同的目录 data-root。 由于 Docker 守护程序的状态保存在此目录中,因此请确保为每个守护程序使用专用目录。如果两个守护进程共享同一个目录,例如 NFS 共享,您将遇到难以排除的错误。 # 以非 root 用户身份管理 Docker [https://www.cnblogs.com/zuoyang/p/16355382.html](https://www.cnblogs.com/zuoyang/p/16355382.html) Docker 守护进程绑定到 Unix 套接字而不是 TCP 端口。默认情况下,Unix 套接字归用户所有root,其他用户只能使用sudo。 Docker 守护程序始终以root用户身份运行。 如果您不想在 docker 命令前加上sudo,请创建一个名为 Unix 组 docker 并将用户添加到其中。当 Docker 守护进程启动时,它会创建一个可供 docker 组成员访问的 Unix 套接字。 警告: 该docker组授予与root 用户等效的权限。有关这如何影响系统安全性的详细信息,请参阅 Docker Daemon Attack Surface(https://docs.docker.com/engine/security/#docker-daemon-attack-surface)。 注意: 要在没有 root 权限的情况下运行 Docker,请参阅 以非 root 用户身份运行 Docker 守护程序(无根模式 https://docs.docker.com/engine/security/rootless/)。 要创建docker组并添加您的用户: 1、创建 docker 用户组: 1 sudo groupadd docker 2、将您的用户添加到docker组中。 1 sudo usermod -aG docker $USER 3、注销并重新登录,以便重新评估您的组成员身份。 1 newgrp docker 4、验证您是否可以在docker没有sudo. 1 docker run hello-world 此命令下载 test image 并在容器中运行它。当容器运行时,它会打印一条消息并退出。 如果您sudo在将用户添加到docker组之前最初使用 Docker CLI 命令运行,您可能会看到以下错误,这表明您的~/.docker/目录是由于sudo命令而使用不正确的权限创建的。 1 2 WARNING: Error loading config file: /home/user/.docker/config.json - stat /home/user/.docker/config.json: permission denied 要解决此问题,请删除~/.docker/目录(它会自动重新创建,但会丢失任何自定义设置),或使用以下命令更改其所有权和权限: 1 2 sudo chown "$USER":"$USER" /home/"$USER"/.docker -R sudo chmod g+rwx "$HOME/.docker" -R # Docker从入门到精通——编写 Dockerfile 的最佳实践 [https://www.cnblogs.com/zuoyang/p/16355632.html](https://www.cnblogs.com/zuoyang/p/16355632.html)