前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除
本章节的快速目录导航:
一、配置Docker对象
1.1、Docker对象的标记
1.2、格式化命令和日志的输出
二、示例:
2.1、管理Docker对象的标记
2.2、删除不用的 Docker 对象
三、配置和管理 Docker 守护进程
3.1、Docker 守护进程的启动
3.2、 Docker 守护进程的配置方式
3.3、解决 daemon.json 文件和启动脚本之间的冲突
3.4、Docker 守护进程目录
四、示例
4.1、检查Docker是否在运行
4.2、从 Docker 守护进程获取实时事件
4.3、查看 Docker 守护进程日志
4.4、开启 Docker 守护进程的调试模式
4.5、自定义 Docker 守护进程选项
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
致谢
在此,我要对所有为知识共享做出贡献的个人和机构表示最深切的感谢。同时也感谢每一位花时间阅读这篇文章的读者,如果文章中有任何错误,欢迎留言指正。
学习永无止境,让我们共同进步!!