前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除
本章节的快速目录导航:
3.3、解决 daemon.json 文件和启动脚本之间的冲突
4.6、为 Docker 守护进程配置 HTTP/HTTPS 代理
一、配置Docker对象
使用Docker的主要工作是创建和使用各类对象。如镜像、容器、网络、卷、插件等
1.1、Docker对象的标记
Docker标记是一种用于为Docker对象(如镜像、容器等)添加元数据的机制
- 标记用途:组织镜像、记录许可信息、注释关系、执行业务或应用操作
- 标记格式:键值对,以字符串形式存储,每个键在对象中唯一
- 键规则:可含句点、连字符、字母和数字
- 值规则:任何可序列化为字符串的数据类型,如 JSON、XML、CSV 或 YAML
- 序列化:需将值转换为字符串,例如使用 JSON.stringify()
- 查询限制:Docker 不反序列化标记值,查询时不能使用嵌套结构,可能需第三方工具
1.2、格式化命令和日志的输出
Docker使用Go模板和一系列函数来管理命令和日志的输出格式
(1)join: 连接字符串列表为单个字符串,用指定分隔符
docker inspect --format='{{join .Args "" 1}}' container
(2) json: 将元素编码为 JSON 字符串
docker inspect --format='{{json . Mounts }}' container
(3) lower: 将字符串转换为小写
docker inspect --format='{{lower .Name}}' container
(4)split: 将字符串按分隔符切分为列表
docker inspect --format='{{split (join .Names "/") "/"}}' container
(5)title: 将字符串的每个单词首字母转为大写
docker inspect --format='{{title .Name}}' container
(6)upper: 将字符串转换为大写
docker inspect --format='{{upper .Name}}' container
(7)println: 使每个输出值占一行
docker inspect --format='{{range .NetworkSettings.Networks}}{{println .IPAddress}}{{end}}' container
# 如果要知道可被输出的内容,可以以JSON格式显示全部内容
docker container ls --format='{{json.}}'
二、示例:
2.1、管理Docker对象的标记
标记机制:Docker 对象如镜像、容器等可以添加标记,这些标记在对象生命周期内通常是静态的,需要重新创建对象才能更改。
动态更新:Swarm 集群节点和服务上的标记支持动态更新。
# 为容器添加标记:
[root@docker ~]# docker run -d --label test-redis --name redis redis
d75e715b2...
# 按标记过滤容器列表:
root@docker ~]# docker ps --filter label=test-redis
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d75e715b27d8 redis "docker-entrypoint.s…" 22 seconds ago Up 20 seconds 6379/tcp redis
2.2、删除不用的 Docker 对象
- 垃圾回收:Docker使用保守方法清理未使用的对象,如镜像、容器、卷和网络
- Prune命令:提供了prune命令来清理这些对象
- 系统清理:使用docker system prune一次性清理多种类型的对象
# 清理镜像、容器和网络:
[root@docker ~]# docker system prune
WARNING! This will remove:
- all stopped containers # 所有停止的容器
- all networks not used by at least one container # 未被任何容器使用的网络
- all dangling images # 所有虚悬的镜像
- unused build cache # 所有构建缓存
Are you sure you want to continue? [y/N] # 输入y键确认执行
# 在新版本中清理卷:
docker system prune --volumes
# 强制删除无提示
docker system prune -f
三、配置和管理 Docker 守护进程
Docker 守护进程(dockerd)是 Docker 的后台应用程序,可以通过dockerd命令进行配置和管理
3.1、Docker 守护进程的启动
Docker 守护进程通常由系统工具自动启动,简化了系统重启时 Docker 的启动过程
# 启动Docker:
systemctl start docker
# 重启Docker:
systemctl restart docker
# 停止Docker:
systemctl stop docker
# 设置开机启动:
systemctl enable docker
# 禁用开机启动:
systemctl disable docker
如果需要手动启动或测试,可以使用 dockerd命令:
dockerd
3.2、 Docker 守护进程的配置方式
Docker 守护进程可以使用以下两种方式进行配置:
3.2.1、使用 JSON 配置文件
Linux 系统配置文件位置:/etc/docker/daemon.json
Windows 系统配置文件位置:C:\ProgramData\docker\config\daemon.json
{
"debug": true,
"tls": true,
"tlscert": "/var/docker/server.pem",
"tlskey": "/var/docker/serverkey.pem",
"hosts": ["tcp://192.168.199.53:2376"]
}
采用这个配置,Docker守护进程将以调试模式运行,其使用TLS安全机制,在2376监听路由到IP地址192.168.199.53的流量
3.2.2、使用选项手动启动 Docker 守护进程
dockerd --debug \
--tls=true \
--tlscert=/var/docker/server.pem \
--tlskey=/var/docker/serverkey.pem \
--host tcp://192.168.199.53:2376
3.3、解决 daemon.json 文件和启动脚本之间的冲突
如果daemon.json配置文件和启动脚本中定义了相同的选项,会导致 Docker 启动失败。解决冲突需要调整相关选项或配置文件。
3.4、Docker 守护进程目录
- Linux 默认目录:/var/lib/docker
Windows 默认目录:C:\ProgramData\docker
四、示例
4.1、检查Docker是否在运行
可以通过多种方式检查 Docker 是否在运行:
- 使用docker info命令,这是跨操作系统的方法。
- 使用系统工具,如systemctl is-active docker、systemctl status docker或 service docker status。
- 使用ps或 top 等 Linux 命令在进程列表中检查 dockerd进程。
4.2、从 Docker 守护进程获取实时事件
使用docker events命令查看 Docker服务器端的实时事件信息:
docker events [选项]
- -f 选项用于过滤事件。
- --since选项显示自某个时间戳开始的所有事件。
--until选项显示截至指定时间的所有事件。
演示:(1)在一个终端窗口执行以下命令监听事件:
[root@docker ~]# docker events
(2)打开另一个终端,先启动容器然后停止该容器
[root@docker ~]# docker create --name test alpine:latest top
...
0b78a4e23fe021d0f2e32d534cd564a2d62ee23e5ce134919ce3d9faf31b9d9d
[root@docker ~]# docker start test
test
[root@docker ~]# docker stop test
test
(3)切换回前面的终端窗口,发现显示上述操作的详细事件:
[root@docker ~]# docker events
2024-05-11T22:37:58.519619364+08:00 image pull alpine:latest (name=alpine)
2024-05-11T22:37:58.548749579+08:00 container create
...
(4)按下Ctrl+C组合退出docker events命令
4.3、查看 Docker 守护进程日志
Docker 守护进程日志有助于诊断问题:
在使用 systemctl的 inux 系统上,使用journalctl -u docker.service查看日志。
[root@docker ~]# journalctl -u docker.service -- Logs begin at Thu 2024-05-09 10:42:29 CST, end at Sat 2024-05-11 22:40:54 CST. -- May 09 10:42:36 docker systemd[1]: Starting Docker Application Container Engine... May 09 10:42:39 docker dockerd[1126]: time="2024-05-09T10:42:39.326030877+08:00" level=info msg="Starting up" ...
在其他操作系统上,查看相应的日志文件,例如/var/log/messages或/var/log/upstart/docker.log。
如果 Docker 守护进程没有响应,可以发送SIGUSR1信号来记录堆栈跟踪:
kill -SIGUSR1 $(pidof dockerd)
4.4、开启 Docker 守护进程的调试模式
启用调试模式有两种方法:
- 在daemon.json文件中设置 "debug": true。
发送SIGHUP信号到守护进程,使其重新加载配置:
kill -SIGHUP $(pidof dockerd)
或者直接使用 -D选项手动重启Docker守护进程。
[root@docker ~]# systemctl stop docker
[root@docker ~]# dockerd -D
4.5、自定义 Docker 守护进程选项
使用daemon.json文件配置守护进程选项,例如:
{
"data-root": "/mnt/docker-data",
"storage-driver": "overlay"
}
data-root选项设置的是运行时目录,即Docker镜像、容器和卷所使用的磁盘空间
4.6、为 Docker 守护进程配置 HTTP/HTTPS 代理
配置 HTTP/HTTPS 代理:
(1)创建etc/systemd/system/docker.service.d/http-proxy.conf文件:
mkdir -p /etc/systemd/system/docker.service.d
(2) 添加环境变量定义:
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80"
(3) 重新加载 systemd 配置并重启 Docker:
systemctl daemon-reload
systemctl restart docker
(4)验证配置:
systemctl show --property=Environment docker
致谢
在此,我要对所有为知识共享做出贡献的个人和机构表示最深切的感谢。同时也感谢每一位花时间阅读这篇文章的读者,如果文章中有任何错误,欢迎留言指正。
学习永无止境,让我们共同进步!!