带你了解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)