版本: 18.3
官网: https://docs.docker.com/config/daemon/
本篇讲述docker的配置项。
配置随机器自启动
#centOS:
systemctl enable docker
#ubuntu
# 在ubuntu系统自动配置为随机自启动 , 取消使用下面命令
$ echo manual | sudo tee /etc/init/docker.override
$ sudo chkconfig docker on
手动启动
若不想后台运行或者想测试,可以手动执行。
命令 dockerd
该命令会使之前台执行 并将日志直接打印在控制台。
通过 Ctrl+C 终止之。
配置docker daemon
有两种方式 :
- 通过json配置文件
- 通过启动dockerd时传递参数
json配置文件的位置在 :/etc/docker/daemon.json
或 C:\ProgramData\docker\config\daemon.json
配置文件示例:
{
"debug": true,
"tls": true,
"tlscert": "/var/docker/server.pem",
"tlskey": "/var/docker/serverkey.pem",
"hosts": ["tcp://192.168.59.3:2376"]
}
传递参数示例:
dockerd --debug \
--tls=true \
--tlscert=/var/docker/server.pem \
--tlskey=/var/docker/serverkey.pem \
--host tcp://192.168.59.3:2376
全量可配置参数:
https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file
{
"authorization-plugins": [],
"data-root": "",
"dns": [],
"dns-opts": [],
"dns-search": [],
"exec-opts": [],
"exec-root": "",
"experimental": false,
"storage-driver": "",
"storage-opts": [],
"labels": [],
"live-restore": true,
"log-driver": "",
"log-opts": {},
"mtu": 0,
"pidfile": "",
"cluster-store": "",
"cluster-store-opts": {},
"cluster-advertise": "",
"max-concurrent-downloads": 3,
"max-concurrent-uploads": 5,
"default-shm-size": "64M",
"shutdown-timeout": 15,
"debug": true,
"hosts": [],
"log-level": "",
"tls": true,
"tlsverify": true,
"tlscacert": "",
"tlscert": "",
"tlskey": "",
"swarm-default-advertise-addr": "",
"api-cors-header": "",
"selinux-enabled": false,
"userns-remap": "",
"group": "",
"cgroup-parent": "",
"default-ulimits": {},
"init": false,
"init-path": "/usr/libexec/docker-init",
"ipv6": false,
"iptables": false,
"ip-forward": false,
"ip-masq": false,
"userland-proxy": false,
"userland-proxy-path": "/usr/libexec/docker-proxy",
"ip": "0.0.0.0",
"bridge": "",
"bip": "",
"fixed-cidr": "",
"fixed-cidr-v6": "",
"default-gateway": "",
"default-gateway-v6": "",
"icc": false,
"raw-logs": false,
"allow-nondistributable-artifacts": [],
"registry-mirrors": [],
"seccomp-profile": "",
"insecure-registries": [],
"no-new-privileges": false,
"default-runtime": "runc",
"oom-score-adjust": -500,
"node-generic-resources": ["NVIDIA-GPU=UUID1", "NVIDIA-GPU=UUID2"],
"runtimes": {
"cc-runtime": {
"path": "/usr/bin/cc-runtime"
},
"custom": {
"path": "/usr/local/bin/my-runc-replacement",
"runtimeArgs": [
"--debug"
]
}
}
}
可使用的全量选项参见: https://docs.docker.com/engine/reference/commandline/dockerd/
或使用dockerd --help
查看 。
docker daemon 目录
Docker守护进程将所有数据保存在一个目录中。 这将跟踪与Docker相关的所有内容,包括containers, images, volumes, service definition, and secrets.
默认情况下该目录为:
- /var/lib/docker
- C:\ProgramData\docker
可以使用 data-root
选项来配置不同的目录。
由于Docker守护进程的状态保留在此目录中,因此请确保为每个守护进程使用专用目录。 如果两个守护程序共享相同的目录(例如NFS共享),则您将遇到难以排除故障的错误。
配置项与传递参数不一致错误
当在daemon.json中配置和 传递给dockerd的参数选项不一致时会报错, 报错信息如下类似 :
unable to configure the Docker daemon with file /etc/docker/daemon.json:
the following directives are specified both as a flag and in the configuration
file: hosts: (from flag: [unix:///var/run/docker.sock], from file: [tcp://127.0.0.1:2376])
注意: 在windows和Mac中 不支持 daemon.json中的hosts设置。
OOME (Out Of Memory Exceptions )
当容器期望获取的内存大于系统可用时,可能会出现OOME ,并且容器或docker 守护进程可能会被杀掉。 为避免该异常,请确保主机上运行的应用分配何时的内存。
参见 限制容器资源 https://docs.docker.com/config/containers/resource_constraints/
查看日志
守护进程日志可用于定位问题, 不同类型的机器上日志位置不同。
开启debug模式
编辑deamon.json , 通常在/etc/docker/目录下, 对于linux系统,若不存在则创建之。 对于mac 和windows ,不要直接编辑之,使用 Preferences / Daemon / Advanced.
若daemon.json空 ,则加入下行:
{
"debug": true
}
若不空,需要注意json格式和换行问题。
同时需要注意 log-level 配置的值, 默认为info , 支持的值为 debug, info, warn, error, fatal.
- 对于linux系统发送HUP信号使之重新加载配置
sudo kill -SIGHUP $(pidof dockerd)
对于windows , 重启之。
也可以不遵从上面的流程, 换做先stop , 然后使用-D选项手工启动之。
但是,这可能会导致运行环境与原使用脚本启动的环境不一致,导致debug更加困难。
强制堆栈追踪日志
若守护进程没反映, 可以通过发送SIGUSR1 信号 以记录全部堆栈信息到日志中。
对于linux系统:
sudo kill -SIGUSR1 $(pidof dockerd)
对于windows , 需要下载docker-signal , 然后执行 。
这会在不中断守护进程的情况下记录堆栈日志 。
堆栈日志可以用来诊断守护进程中各个线程的状态。
查看 堆栈
- 对于使用systemctl的linux , 使用 journalctl -u docker.service
注意: 对于mac 和windows , 不能手工生成堆栈日志, 但是可以通过Diagnose and feedback 来查看。
查看docker是否正在运行
通过 docker info 命令来查看。
通过操作系统工具来查看 , 如 sudo systemctl is-active docker or sudo status docker or sudo service docker status