目录
- 用户权限配置
- 格式化输出
- 时间格式与输出控制
- 容器和镜像 ID 使用技巧
- 镜像和容器清理
- Registry 与 Repository 理解
- 容器快照
- 容器资源限制
- 磁盘占用检查
- 容器重命名
- Docker 命令组合
- Docker 构建高级选项
1,添加普通用户docker组权限
默认情况下,非 root 用户无法启动 Docker。需要将用户添加到 docker 组。
解决方案
shell
# 1. 检查 docker 组是否存在
getent group docker
# 2. 如果不存在,创建 docker 组
sudo groupadd docker
# 3. 将用户添加到 docker 组
sudo usermod -aG docker 用户名
# 4. 重新登录或刷新组权限
newgrp docker
# 5. 验证权限
docker ps
注意事项
- 使用 yum 安装 Docker 后,默认会创建 docker 组,但不会自动添加用户
- 添加用户到 docker 组后,需要重新登录才能生效
- 或者使用 newgrp docker 临时刷新组权限
2,格式化输出
Docker 支持使用 Go 模板格式化输出,让输出更清晰易读。
常用格式字段
| 字段 | 说明 | 实例 |
|---|---|---|
| .ID | 容器/镜像 ID | a1b2c3d4e5f6 |
| .Repository | 镜像仓库名 | nginx |
| .Tag | 镜像标签 | latest |
| .Digest | 镜像摘要 | sha256:... |
| .Name | 容器名称 | my-container |
实用示例
shell
# 只显示容器 ID(等同于 docker ps -q)
docker ps --format "{{.ID}}"
# 显示镜像的仓库名和标签
docker images --format "{{.Repository}}:{{.Tag}}"
# 自定义格式:显示容器名和状态
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
# 显示镜像的完整信息
docker images --format "{{.Repository}}:{{.Tag}} ({{.ID}})"
高级用法
shell
# 显示容器名、镜像、状态和创建时间
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.CreatedAt}}"
# 只显示运行中的容器名称
docker ps --format "{{.Names}}" --filter "status=running"
# 显示镜像大小
docker images --format "{{.Repository}}:{{.Tag}}\t{{.Size}}"
3,时间格式与输出控制
时间格式控制
shell
# 显示完整时间戳(不隐藏时间)
docker history -H=false imageId
# 默认情况下,Docker 会隐藏时间列,使用 -H=false 可以显示
未截断输出
当输出被截断时,使用 --no-trunc 查看完整内容:
shell
# 显示完整的容器信息(不截断)
docker ps --no-trunc
# 显示完整的镜像历史(不截断)
docker history --no-trunc imageId
# 显示完整的容器日志
docker logs --no-trunc containerId
组合使用
shell
# 显示完整的容器 ID 和命令
docker ps --no-trunc --format "{{.ID}}\t{{.Command}}"
4,容器和镜像 ID 使用技巧
Docker 支持使用 ID 的缩写形式,提高操作效率。
ID 缩写规则
- Docker 会自动识别 ID 的前缀
- 只要前缀足够唯一,可以使用任意长度的前缀
- 如果只有一个容器/镜像,甚至可以使用第一个字符
实用示例
shell
# 使用完整 ID
docker logs a1b2c3d4e5f6
# 使用前 6 位(通常足够唯一)
docker logs a1b2c3
# 使用前 3 位(如果唯一)
docker logs a1b
# 如果只有一个容器,甚至可以使用第一个字符
docker logs a
# 查看容器日志(使用短 ID)
docker logs --tail 10 -f a
最佳实践
shell
# 1. 先查看容器列表,确认 ID
docker ps
# 2. 使用足够长的前缀确保唯一性
docker exec -it a1b2c3 bash
# 3. 在脚本中使用完整 ID 或长前缀
CONTAINER_ID=$(docker ps -q --filter "name=myapp")
docker logs $CONTAINER_ID
5,镜像和容器清理
定期清理未使用的资源可以释放磁盘空间。
清理未使用的镜像
shell
# 清理未使用、未打标签的镜像(交互式)
docker image prune
# 清理未使用、未打标签的镜像(强制,不询问)
docker image prune -f
# 清理所有未使用的镜像(包括有标签但未被容器使用的)
docker image prune -a
# 强制清理所有未使用的镜像
docker image prune -af
清理未使用的容器
shell
# 清理所有停止的容器(交互式)
docker container prune
# 清理所有停止的容器(强制)
docker container prune -f
全面清理
shell
# 清理所有未使用的资源(镜像、容器、网络、构建缓存)
docker system prune
# 强制清理所有未使用的资源
docker system prune -f
# 清理所有未使用的资源,包括未使用的镜像
docker system prune -a
# 清理所有未使用的资源,包括卷(谨慎使用)
docker system prune -a --volumes
清理策略建议
shell
# 定期清理脚本示例
#!/bin/bash
# 清理未使用的镜像和容器
docker image prune -af
docker container prune -f
# 查看清理后的磁盘使用情况
docker system df
6,Registry 与 Repository 理解
理解 Docker 镜像的命名规范很重要。
镜像命名格式
{注册中心}/{命名空间}/{镜像仓库名称}:{版本}
完整示例
registry.cn-beijing.aliyuncs.com/my_namespace/tomcat:8.5.85
组成部分:
- Registry(注册中心):registry.cn-beijing.aliyuncs.com
- 命名空间:my_namespace
- 镜像仓库名称:tomcat
- 版本标签:8.5.85
常见 Registry
shell
# Docker Hub(默认,可省略)
docker.io/library/nginx:latest
# 或简写为
nginx:latest
# 阿里云容器镜像服务
registry.cn-beijing.aliyuncs.com/namespace/image:tag
# 华为云
swr.cn-north-4.myhuaweicloud.com/namespace/image:tag
# 私有 Registry
registry.example.com:5000/namespace/image:tag
实际应用
shell
# 拉取镜像
docker pull registry.cn-beijing.aliyuncs.com/my_namespace/tomcat:8.5.85
# 推送镜像
docker tag local-image:tag registry.cn-beijing.aliyuncs.com/my_namespace/tomcat:8.5.85
docker push registry.cn-beijing.aliyuncs.com/my_namespace/tomcat:8.5.85
7,容器快照
容器快照用于导出和导入容器文件系统。
导出容器
shell
# 导出容器为 tar 文件
docker export -o container.tar containerId
# 或使用重定向
docker export containerId > container.tar
# 导出并压缩
docker export containerId | gzip > container.tar.gz
导入容器
shell
# 从 tar 文件导入为镜像
docker import container.tar
# 导入并指定名称和标签
docker import container.tar my-image:tag
# 从压缩文件导入
gunzip -c container.tar.gz | docker import - my-image:tag
使用场景
- 备份容器文件系统
- 迁移容器到其他环境
- 创建基础镜像
注意事项
shell
# export/import 与 save/load 的区别:
# - export: 导出容器文件系统(不包含历史记录和元数据)
# - save: 导出镜像(包含完整历史和元数据)
# 导出镜像(推荐用于镜像迁移)
docker save -o image.tar image:tag
# 导入镜像
docker load -i image.tar
8,容器资源限制
合理设置资源限制可以防止容器占用过多系统资源。
内存限制
shell
# 设置内存限制为 300MB,swap 无限制,内核内存 50MB
docker run -m 300M --memory-swap -1 --kernel-memory 50M centos:latest /bin/bash
# 参数说明:
# -m, --memory: 容器内存限制
# --memory-swap: swap 限制(-1 表示无限制)
# --kernel-memory: 内核内存限制
内存限制示例
shell
# 限制内存为 512MB,swap 为 1GB
docker run -m 512M --memory-swap 1G nginx:latest
# 限制内存为 1GB,不允许使用 swap
docker run -m 1G --memory-swap 1G nginx:latest
# 限制内存为 256MB,swap 无限制
docker run -m 256M --memory-swap -1 nginx:latest
CPU 限制
Docker 提供两种 CPU 限制方式:
方式 1:CPU 权重(--cpu-shares)
shell
# 设置 CPU 权重(可选值 0-1024)
docker run -c 512 nginx:latest
# 更新运行中容器的 CPU 权重
docker update -c 1024 containerId
权重说明:
- 默认权重为 1024
- 权重越高,分配的 CPU 时间越多
- 只在 CPU 资源紧张时生效
方式 2:CPU 数量(--cpus)
shell
# 限制容器使用 1 个 CPU 核心
docker run --cpus=1 nginx:latest
# 限制容器使用 0.5 个 CPU 核心
docker run --cpus=0.5 nginx:latest
# 更新运行中容器的 CPU 限制
docker update --cpus=1 containerId
CPU 限制示例
shell
# 限制为 1 个 CPU 核心
docker run --cpus=1 nginx:latest
# 限制为 2 个 CPU 核心
docker run --cpus=2 nginx:latest
# 限制为 1.5 个 CPU 核心
docker run --cpus=1.5 nginx:latest
# 同时限制 CPU 和内存
docker run --cpus=1 -m 512M nginx:latest
组合资源限制
shell
# 完整的资源限制示例
docker run \
--cpus=1 \
-m 512M \
--memory-swap 1G \
--kernel-memory 128M \
nginx:latest
9,磁盘占用检查
定期检查 Docker 磁盘使用情况,及时清理。
查看磁盘使用
shell
# 查看 Docker 磁盘使用情况
docker system df
# 输出示例:
# TYPE TOTAL ACTIVE SIZE RECLAIMABLE
# Images 5 3 2.5GB 1.2GB (48%)
# Containers 10 2 500MB 400MB (80%)
# Local Volumes 3 1 100MB 66.67MB (66%)
# Build Cache 0 0 0B 0B
详细查看
shell
# 查看镜像占用
docker system df -v
# 查看特定类型的占用
docker system df --type images
docker system df --type containers
docker system df --type volumes
清理建议
shell
# 根据磁盘使用情况决定清理策略
docker system df
# 如果镜像占用大
docker image prune -a
# 如果容器占用大
docker container prune
# 如果卷占用大
docker volume prune
10,容器重命名
重命名容器可以更好地管理容器。
重命名命令
shell
# 重命名容器
docker rename old_name new_name
# 示例
docker rename my-old-container my-new-container
重命名容器可以更好地管理容器。
注意事项
- 新名称必须唯一
- 重命名后,容器 ID 不会改变
实用示例
shell
# 重命名
docker rename old_name new_name
# 启动重命名后的容器
docker start new_name
11,Docker 命令组合
理解 Docker 命令的组合关系有助于更好地使用 Docker。
docker run = docker create + docker start
shell
# docker run 等价于以下两个命令的组合
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
docker start [OPTIONS] CONTAINER [CONTAINER...]
# 示例对比:
# 方式 1:直接运行
docker run -d --name myapp nginx:latest
# 方式 2:分步执行
docker create -d --name myapp nginx:latest
docker start myapp
使用场景
使用 docker run(推荐):
- 一次性创建并启动容器
- 简单快速的场景
使用 docker create + docker start:
- 需要先创建容器,稍后启动
- 需要修改配置后再启动
- 批量创建容器
实际应用
shell
# 创建容器但不启动
docker create --name myapp nginx:latest
# 检查容器配置
docker inspect myapp
# 修改配置后启动
docker start myapp
# 或者直接运行
docker run -d --name myapp nginx:latest
12,Docker 构建高级选项
使用高级选项优化 Docker 构建过程。
完整构建命令示例
shell
docker build \
--pull \
--ulimit nofile=200000:200000 \
--ulimit nproc=65535:65535 \
--rm \
-t "registry.cn-beijing.aliyuncs.com/my_namespace/tomcat:8.5.85_openjdk8.222.10" \
-f "/usr/local/src/docker/Dockerfile" \
"/usr/local/src/docker"
参数说明
--pull
作用: 确保使用最新的基础镜像
shell
# 构建前拉取最新基础镜像
docker build --pull -t myimage:tag .
--ulimit
作用: 设置容器运行时的资源限制
格式: --ulimit <type>=<soft>:<hard>
shell
# 设置文件描述符限制
--ulimit nofile=200000:200000
# 设置进程数限制
--ulimit nproc=65535:65535
--rm
作用: 自动清理构建过程中的临时容器
shell
# 构建成功后删除中间容器
docker build --rm -t myimage:tag .
-t, --tag
作用: 为构建的镜像打标签
shell
# 指定镜像名称和标签
-t "registry.cn-beijing.aliyuncs.com/my_namespace/tomcat:8.5.85_openjdk8.222.10"
-f, --file
作用: 使用非默认名称的 Dockerfile
shell
# 指定 Dockerfile 路径
-f "/usr/local/src/cticloud-docker/Dockerfile"
其他常用构建选项
shell
# 构建时不使用缓存
docker build --no-cache -t myimage:tag .
# 指定构建参数
docker build --build-arg VERSION=1.0 -t myimage:tag .
# 指定目标平台
docker build --platform linux/amd64 -t myimage:tag .
# 显示构建过程
docker build --progress=plain -t myimage:tag .
总结
本文介绍了 Docker 的常用技巧和操作:
- 用户权限配置:将非 root 用户添加到 docker 组
- 格式化输出:使用 Go 模板自定义输出格式
- 时间格式和输出控制:显示完整信息和时间戳
- ID 缩写:使用短 ID 提高操作效率
- 资源清理:定期清理未使用的镜像和容器
- 镜像命名:理解 Registry 和 Repository 的格式
- 容器快照:导出和导入容器文件系统
- 资源限制:合理设置内存和 CPU 限制
- 磁盘管理:检查和管理 Docker 磁盘占用
- 容器管理:重命名和组合使用命令
- 构建优化:使用高级选项优化构建过程
掌握这些技巧可以提升 Docker 使用效率,更好地管理容器化应用。
快速参考
常用命令速查
shell
# 用户权限
sudo usermod -aG docker $USER
# 格式化输出
docker ps --format "{{.Names}}\t{{.Status}}"
docker images --format "{{.Repository}}:{{.Tag}}"
# 清理资源
docker system prune -af
docker image prune -af
docker container prune -f
# 资源限制
docker run --cpus=1 -m 512M nginx:latest
docker update --cpus=2 containerId
# 磁盘检查
docker system df
# 容器快照
docker export -o container.tar containerId
docker import container.tar my-image:tag
希望这篇文章对你有帮助。如需补充或修改,请告知。