【笔记】docker实用技巧与常见操作

目录

  1. 用户权限配置
  2. 格式化输出
  3. 时间格式与输出控制
  4. 容器和镜像 ID 使用技巧
  5. 镜像和容器清理
  6. Registry 与 Repository 理解
  7. 容器快照
  8. 容器资源限制
  9. 磁盘占用检查
  10. 容器重命名
  11. Docker 命令组合
  12. 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

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 的常用技巧和操作:

  1. 用户权限配置:将非 root 用户添加到 docker 组
  2. 格式化输出:使用 Go 模板自定义输出格式
  3. 时间格式和输出控制:显示完整信息和时间戳
  4. ID 缩写:使用短 ID 提高操作效率
  5. 资源清理:定期清理未使用的镜像和容器
  6. 镜像命名:理解 Registry 和 Repository 的格式
  7. 容器快照:导出和导入容器文件系统
  8. 资源限制:合理设置内存和 CPU 限制
  9. 磁盘管理:检查和管理 Docker 磁盘占用
  10. 容器管理:重命名和组合使用命令
  11. 构建优化:使用高级选项优化构建过程

掌握这些技巧可以提升 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

希望这篇文章对你有帮助。如需补充或修改,请告知。

相关推荐
峰顶听歌的鲸鱼1 小时前
13.docker部署
linux·运维·笔记·docker·容器·云计算
WhiteLie7771 小时前
在 win11 (x86) docker destop 部署 ctyunos 2.0.1 (aarch64) 环境做(伪)容器嵌套
docker·ctyunos
a***59262 小时前
docker离线安装及部署各类中间件(x86系统架构)
docker·中间件·系统架构
程序辕日记2 小时前
Linux环境docker离线安装教程
linux·docker
可可苏饼干2 小时前
容器与 Docker
运维·笔记·学习·docker·容器
107102 小时前
Docker学习笔记
笔记·学习·docker
洛可可白2 小时前
Ubuntu 上安装 Docker
linux·ubuntu·docker