4、docker常用命令

发布于:2025-06-09 ⋅ 阅读:(18) ⋅ 点赞:(0)

docker run

# 基础运行容器(前台运行)
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# 示例:
docker run ubuntu:22.04
# 注释:运行 Ubuntu 22.04 镜像的容器,执行默认命令后退出

# 运行容器并进入交互模式
docker run -it ubuntu:22.04 /bin/bash
# 注释:
#   -i 保持标准输入打开
#   -t 分配伪终端
#   /bin/bash 启动 Bash shell

# 后台运行容器(守护态)
docker run -d --name my_nginx nginx:latest
# 注释:
#   -d 后台运行
#   --name 指定容器名称

# 端口映射(宿主机端口:容器端口)
docker run -d -p 8080:80 nginx
# 注释:将宿主机的 8080 端口映射到容器的 80 端口

# 挂载数据卷(宿主机目录:容器目录)
docker run -v /host/data:/container/data ubuntu
# 注释:将宿主机的 /host/data 目录挂载到容器的 /container/data

# 设置环境变量
docker run -e "ENV_VAR=value" node:18
# 注释:设置环境变量 ENV_VAR 的值为 value

# 使用自定义网络
docker run --net=mynetwork --net-alias=app1 nginx
# 注释:
#   --net=mynetwork:将容器连接到名为 mynetwork 的自定义网络。
#   --net-alias=app1:为容器在 mynetwork 网络中设置别名 app1,其他容器可以通过 app1 访问它

# 资源限制
docker run --cpus=1.5 --memory=512m python:3.9
# 注释:
#   --cpus 限制 CPU 核数
#   --memory 限制内存使用

# 自动删除容器(退出后清理)
docker run --rm alpine echo "Hello"
# 注释:容器退出后自动删除

# 文件挂载(临时目录)
docker run --mount type=bind,source=/host/path,target=/container/path nginx
# 注释:更灵活的挂载方式(推荐替代 -v)
# --mount:指定挂载配置,支持更详细的参数定义。
# type=bind:表示使用绑定挂载(Bind Mount),将宿主机的文件或目录挂载到容器内。
# source=/host/path:宿主机上的路径(绝对路径),需要提前存在。
# target=/container/path:容器内的目标路径,容器启动时会自动创建该目录。
# 挂载(Mount)是指将宿主机的文件或目录与容器内的文件系统进行绑定,使得容器可以直接访问宿主机的文或目录。宿主机的文件修改会立即反映到容器中。容器内对挂载目录的修改也会同到宿主机。


# 传递环境变量文件
docker run --env-file .env mysql
# 注释:从 .env 文件读取环境变量

# 设置容器工作目录
docker run -w /app python:3.9 python script.py
# 注释:
#   -w /app 设置工作目录为 /app

# 连接其他容器
docker run -d --name web --link db:database nginx
# 注释:将 web 容器连接到 db 容器(database 为别名)

# 重启策略
docker run --restart=always redis
# 注释:
#   always: 退出时自动重启
#   on-failure: 非0退出时重启
#   unless-stopped: 除非手动停止

 docker exec

# 1. 在容器内执行单次命令(非交互式)
# 语法:docker exec <容器名或ID> <命令>
docker exec my_container ls /app  # 在名为 my_container 的容器中列出 /app 目录内容

# 2. 启动交互式 Bash 会话(常用调试)
# -it 组合:分配伪终端并保持标准输入打开
docker exec -it my_container /bin/bash  # 进入容器的交互式 Bash 终端

# 3. 以特定用户身份执行命令(如 MySQL 容器)
docker exec -it mysql_db mysql -u root -p  # 进入 MySQL 交互命令行
docker exec -u postgres postgres_container psql  # 以 postgres 用户身份执行 psql

# 4. 后台执行命令(不占用当前终端)
# -d 选项:分离模式(后台运行)
docker exec -d my_container python /app/script.py  # 在后台运行 Python 脚本

# 5. 设置环境变量
# -e 选项:传递环境变量
docker exec -e DEBUG=1 my_container python script.py  # 设置 DEBUG=1 后执行脚本

# 6. 指定工作目录
# -w 选项:设置命令的工作目录
docker exec -w /app/logs my_container tail error.log  # 在 /app/logs 目录下查看日志

# 7. 组合使用选项(典型调试场景)
docker exec -it -u root -w /tmp my_container /bin/sh  # 以 root 身份在 /tmp 目录启动 shell

# 8. 执行特定程序的命令
docker exec nginx nginx -t          # 检查 Nginx 配置
docker exec redis redis-cli ping    # 测试 Redis 服务
docker exec webapp python manage.py migrate  # 在 Django 容器中执行数据库迁移
选项 全称 作用
-i --interactive 保持标准输入打开(通常与 -t 联用)
-t --tty 分配伪终端(实现交互式 shell)
-d --detach 后台运行命令
-e --env 设置环境变量(可多次使用)
-w --workdir 指定命令执行的工作目录
-u --user 指定执行命令的用户名或 UID

 docker ps

# 1. 列出正在运行的容器(默认)
docker ps

# 2. 列出所有容器(包括已停止的)
docker ps -a

# 3. 仅显示容器ID(静默模式)
docker ps -q
docker ps -a -q  # 包括已停止的容器ID

# 4. 显示容器大小(增加磁盘占用列)
docker ps -s

# 5. 自定义输出格式(Go模板语法)
docker ps --format "{{.ID}}\t{{.Image}}\t{{.Status}}"
docker ps --format "table {{.Names}}\t{{.Ports}}\t{{.State}}"  # 表格形式

# 6. 过滤显示结果
docker ps --filter "status=running"     # 按状态过滤(running | exited)
docker ps --filter "name=my_container"  # 按名称过滤
docker ps --filter "label=env=prod"     # 按标签过滤
docker ps --filter "ancestor=nginx"     # 按基础镜像过滤

# 7. 显示最近创建的N个容器
docker ps -n 3  # 显示最近创建的3个容器(包括停止的)

# 8. 显示完整输出(不截断信息)
docker ps --no-trunc

# 9. 组合使用示例:列出运行中容器的ID和名称
docker ps -q --filter "status=running" --format "{{.ID}}: {{.Names}}"

# 10. 显示容器端口映射
docker ps --format "table {{.Names}}\t{{.Ports}}"
参数 作用
-a / --all 显示所有容器(默认只显示运行中的)
-q / --quiet 仅输出容器ID(常用于脚本操作)
-s / --size 显示容器磁盘占用
--format 自定义输出格式(支持 tablejson 和 Go 模板)
--filter 按条件过滤(常用过滤器:statusnamelabelancestor 等)
-n 显示最近创建的容器(数量)
--no-trunc 显示完整信息(不截断ID和命令)

docker build

# 1. 基本构建命令(使用当前目录的 Dockerfile)
docker build .

# 2. 指定 Dockerfile 路径和构建上下文
docker build -f /path/to/Dockerfile /path/to/build/context

# 3. 为镜像设置名称和标签
docker build -t my-image:latest .

# 4. 设置构建参数(ARG 变量)
docker build --build-arg APP_VERSION=1.0.0 -t my-app .

# 5. 使用特定目标阶段(多阶段构建)
docker build --target builder-stage -t my-builder .

# 6. 不缓存构建过程(强制重新执行所有步骤)
docker build --no-cache -t fresh-image .

# 7. 移除中间容器(构建成功后自动删除)
docker build --rm=true -t clean-image .

# 8. 设置内存限制和 CPU 配额
docker build --memory=1g --cpus=2.0 -t resource-limited .

# 9. 使用特定平台构建(跨平台构建)
docker build --platform linux/arm64 -t arm-image .

# 10. 高级用法:构建时传递 SSH 密钥
docker build --ssh default -t ssh-image .

# 11. 压缩构建上下文(减少传输大小)
docker build --compress -t compressed-build .

# 12. 设置超时时间(防止卡死)
docker build --timeout=30m -t safe-build .

# 13. 组合使用示例:完整构建命令
docker build \
  -t my-registry/app:v2 \          # 镜像名称和标签
  -f dockerfiles/prod.Dockerfile \ # 指定 Dockerfile
  --build-arg NODE_ENV=production \ # 构建参数
  --target runtime-stage \         # 多阶段目标
  --no-cache \                     # 禁用缓存
  --platform linux/amd64 \         # 目标平台
  --memory=2g \                    # 内存限制
  .                                # 构建上下文
参数 说明
-t / --tag 设置镜像名称和标签(格式:name:tag,可多次使用)
-f / --file 指定 Dockerfile 路径(默认:PATH/Dockerfile
--build-arg 传递构建参数(覆盖 Dockerfile 中的 ARG
--target 多阶段构建时指定目标阶段
--no-cache 禁用构建缓存(从头开始构建)
--rm 构建成功后删除中间容器(默认:true
--platform 设置目标平台(如 linux/amd64linux/arm64
--compress 使用 gzip 压缩构建上下文
--ssh 允许构建时访问 SSH 代理(安全访问私有仓库)
--memory 设置构建容器的内存限制
--cpus 设置 CPU 配额(如 1.5 表示 1.5 个 CPU 核心)
--timeout 设置构建超时时间(单位:s/m/h
. 构建上下文路径(决定 COPY/ADD 的文件范围)

docker pull

# 基础语法:从Docker仓库拉取镜像(不指定标签时默认使用:latest)
docker pull [镜像名称]

# =============== 常用命令示例 ===============

# 示例1:拉取官方Ubuntu镜像的最新版本(等价于 ubuntu:latest)
docker pull ubuntu

# 示例2:拉取指定标签的镜像(这里拉取Ubuntu 20.04版本)
docker pull ubuntu:20.04

# 示例3:拉取私有仓库的镜像(需先登录)
docker pull myregistry.example.com:5000/myapp:v1.0

# 示例4:拉取其他架构的镜像(如ARM64平台)
docker pull --platform=linux/arm64 nginx

# 示例5:拉取镜像但跳过内容验证(适用于可信源)
docker pull --disable-content-trust mysql:8.0

# 示例6:后台静默拉取(不显示进度信息)
docker pull -q redis

# 示例7:拉取Alpine Linux镜像(轻量级Linux发行版)
docker pull alpine:3.18

# 示例8:拉取带完整操作系统的镜像(如CentOS)
docker pull centos:7

# =============== 组合使用技巧 ===============

# 技巧1:拉取镜像后立即运行容器
docker run -d --name my_nginx $(docker pull -q nginx:alpine) nginx

# 技巧2:批量拉取多个镜像(Bash循环)
for image in ubuntu:22.04 alpine:latest redis:7; do
  docker pull $image
done

# =============== 注意事项 ===============
# 1. 标签说明:
#    :latest    → 默认标签(不一定是"最新"版本)
#    :alpine    → 基于Alpine Linux的镜像(体积小)
#    :bullseye  → Debian特定版本的镜像
#
# 2. 查看可用标签:
#    访问 Docker Hub 官网搜索:https://hub.docker.com
#
# 3. 认证提示:
#    私有仓库需先执行 docker login
#
# 4. 空间管理:
#    定期使用 `docker image prune` 清理未使用的镜像
参数 说明
:<tag> 指定镜像版本(如 python:3.11
--platform 跨平台拉取(支持 linux/amd64linux/arm64 等)
-q / --quiet 静默模式(仅输出镜像ID)
--disable-content-trust 跳过镜像签名验证(生产环境慎用)

docker push

# 1. 基本推送命令(推送到 Docker Hub)
docker push username/image-name:tag

# 2. 推送到私有仓库(需先登录)
docker push registry.example.com:5000/my-app:v1.0

# 3. 推送多个标签(需分别执行)
docker push username/image-name:latest
docker push username/image-name:v1.2

# 4. 使用不同格式的镜像标识
docker push my-image-id  # 使用镜像ID推送(不推荐)
docker push my-image@sha256:abc123...  # 使用摘要推送

# 5. 强制推送(覆盖已有镜像)
docker push --force username/image-name:latest

# 6. 禁用内容信任(开发环境使用)
docker push --disable-content-trust my-private-reg/image

# 7. 组合使用示例
docker tag local-image:dev username/prod-image:v2.1  # 先打标签
docker push username/prod-image:v2.1                # 再推送

# 8. 推送多平台镜像(需用 buildx 构建)
docker buildx build --platform linux/amd64,linux/arm64 -t username/multi-arch-image:latest --push .
参数 说明
--disable-content-trust 跳过镜像签名验证(默认开启)
--quiet / -q 静默模式(只输出错误信息)
--force / -f 强制覆盖远程同名镜像(谨慎使用)
--all-tags / -a 注意:docker push 不支持此参数

docker images

# 基础语法:列出本地Docker镜像
docker images [选项] [镜像名]

# =============== 常用命令示例 ===============

# 示例1:列出所有本地镜像(默认显示)
docker images

# 示例2:按镜像名过滤(显示特定仓库的镜像)
docker images ubuntu

# 示例3:显示完整镜像ID(不截断)
docker images --no-trunc

# 示例4:仅显示镜像ID(适用于脚本处理)
docker images -q

# 示例5:显示镜像摘要信息(验证镜像完整性)
docker images --digests

# 示例6:按时间排序(最新创建的在前)
docker images --sort=created

# 示例7:按大小排序(大镜像在前)
docker images --sort=size

# 示例8:过滤悬空镜像(未被任何容器引用的中间层镜像)
docker images -f "dangling=true"

# 示例9:显示镜像创建时间(人类可读格式)
docker images --format "{{.CreatedAt}}\t{{.Repository}}"

# 示例10:自定义输出格式(表格形式)
docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}\t{{.Size}}"

# =============== 组合使用技巧 ===============

# 技巧1:列出所有镜像ID(去重排序)
docker images -q | sort -u

# 技巧2:删除所有悬空镜像(清理磁盘空间)
docker images -f "dangling=true" -q | xargs docker rmi

# 技巧3:查找特定标签的镜像(通配符搜索)
docker images --filter=reference='*:20.04'

# 技巧4:统计镜像总大小(MB为单位)
docker images --format "{{.Size}}" | sed 's/MB//' | awk '{sum += $1} END {print sum "MB"}'

# =============== 输出列说明 ===============
# REPOSITORY   → 镜像仓库名称
# TAG          → 镜像标签(版本)
# IMAGE ID     → 镜像唯一标识(SHA256)
# CREATED      → 镜像创建时间
# SIZE         → 镜像占用空间

### 关键参数解析:
| 参数 | 说明 |
|------|------|
| `-a, --all`     | 显示所有镜像(包括中间层) |
| `--digests`     | 显示镜像摘要(Digest) |
| `-f, --filter`  | 按条件过滤(如 `dangling=true`) |
| `--format`      | 自定义输出格式(Go模板) |
| `--no-trunc`    | 显示完整镜像ID |
| `-q, --quiet`   | 仅显示镜像ID |
| `--sort`        | 按字段排序(size/created/repository等) |

### 格式化输出模板字段:
```bash
.ID        → 短镜像ID
.ImageID   → 完整镜像ID
.Repository → 仓库名
.Tag       → 标签
.Digest    → 摘要
.CreatedAt → 创建时间
.Size      → 占用空间

docker login

# 登录默认 Docker Hub 仓库(交互式输入认证信息)
docker login
# 注释:
#   执行后需手动输入用户名、密码
#   登录凭证默认保存在 `~/.docker/config.json`

# 指定用户名登录 Docker Hub(密码手动输入)
docker login -u your_username
# 注释:
#   -u 指定用户名
#   执行后会提示输入密码(避免密码出现在命令历史)

# 完整认证登录私有仓库
docker login -u user -p passwd registry.example.com:5000
# 注释:
#   -p 直接提供密码(注意安全隐患)
#   registry.example.com:5000 指定私有仓库地址
#   适合自动化脚本(但需确保密码安全)

# 从文件读取密码登录(避免密码暴露)
cat ~/password.txt | docker login -u user --password-stdin registry.example.com
# 注释:
#   --password-stdin 从标准输入读取密码
#   cat 命令将密码文件内容通过管道传递
#   避免密码被记录在历史命令或日志中

# 登录第三方公共仓库
docker login -u token_username -p access_token ghcr.io
# 注释:
#   ghcr.io GitHub Container Registry
#   access_token 通常为平台生成的访问令牌
#   适用于 GitHub/GitLab 等容器服务

# 退出当前仓库登录
docker logout registry.example.com
# 注释:
#   删除本地存储的指定仓库凭证
#   不指定仓库则默认清除 Docker Hub 登录状态

docker logout

# 登出默认 Docker Hub 仓库
docker logout
# 注释:清除当前用户登录 Docker Hub 的凭证 (~/.docker/config.json)

# 登出私有仓库(指定仓库地址)
docker logout registry.example.com:5000
# 注释:
#   清除指定私有仓库的登录凭证
#   格式:仓库域名/IP + 端口号(非默认端口必须指定)

# 登出 GitHub Container Registry
docker logout ghcr.io
# 注释:
#   清除 GitHub 容器仓库的凭证
#   适用于第三方容器仓库(GitLab 对应 gitlab.example.com)

# 登出所有仓库(需手动实现)
# 注释:Docker 没有直接清除所有凭证的命令,需手动删除配置文件
rm ~/.docker/config.json
# 警告:此操作将删除所有容器仓库的登录凭证!

docker search

# 基础搜索(默认最多返回25条结果)
docker search nginx
# 注释:在Docker Hub中搜索与"nginx"相关的公共镜像,显示OFFICIAL标记、星标和描述等基础信息

# 限制返回结果数量(--limit)
docker search --limit 5 ubuntu
# 注释:
#   --limit 5 限制只显示5个匹配结果
#   适用于快速查看头部匹配镜像(默认25条,最大值100)

# 过滤官方镜像(--filter is-official=true)
docker search --filter is-official=true python
# 注释:
#   --filter is-official=true 仅显示Docker官方认证的镜像
#   官方镜像由原厂维护,通常更安全可靠

# 过滤星标数量(--filter stars=数字)
docker search --filter stars=100 --limit 3 mysql
# 注释:
#   --filter stars=100 仅显示星标≥100的镜像
#   结合--limit 3展示头部3个高星镜像

# 显示完整描述(不截断文本)
docker search --no-trunc redis
# 注释:
#   --no-trunc 显示完整的镜像描述文本
#   默认会截断过长的描述信息

# 组合使用示例
docker search --filter is-official=false --filter stars=50 --limit 3 alpine
# 注释:
#   搜索非官方(is-official=false)但星标≥50的alpine镜像
#   限制显示3条结果,常用于筛选高质量社区镜像

docker version

# 显示完整的 Docker 版本信息(默认格式)
docker version
# 注释:
#   输出客户端(Client)和服务端(Server)的完整版本信息
#   包括 API 版本、Go 版本、Git Commit、构建时间等
#   若服务端未运行,仅显示客户端信息

# 仅显示客户端版本信息
docker version --format '{{.Client.Version}}'
# 注释:
#   --format 使用 Go 模板提取特定字段
#   输出示例:24.0.7

# 仅显示服务端(引擎)版本
docker version --format '{{.Server.Version}}'
# 注释:
#   当 Docker 守护进程运行时才显示
#   输出示例:24.0.7

# 显示 JSON 格式的原始数据
docker version --format json
# 注释:
#   输出机器可读的完整 JSON 数据
#   适合自动化脚本处理版本信息

# 检查特定组件版本
docker version --format 'Client: {{.Client.Version}}\nServer: {{.Server.Version}}'
# 注释:
#   自定义输出格式
#   输出示例:
#     Client: 24.0.7
#     Server: 24.0.7

# 验证客户端最低版本要求
docker version --format '{{.Client.Version}}' | grep -qE '2[0-9]+\.[0-9]+\.[0-9]+'
# 注释:
#   结合 grep 检查版本是否 ≥20.x
#   常用于安装脚本的版本校验
# 输出字段说明:
Client: Docker Engine - Community  # 客户端名称
 Version:           24.0.7         # 主版本号
 API version:       1.43           # 兼容的API版本
 Go version:        go1.20.10      # 编译使用的Go语言版本
 Git commit:        afdd53b        # 代码提交ID
 Built:             Thu Oct 26 09:07:41 2023  # 编译时间
 OS/Arch:           linux/amd64    # 运行平台

Server: Docker Engine - Community  # 服务端名称(需守护进程运行)
 Engine:                           # 引擎详情
  Version:          24.0.7
  API version:      1.43
  ...

docker info

# 显示完整的 Docker 系统信息(默认格式)
docker info
# 注释:
#   输出 Docker 系统的全面状态报告
#   包括容器/镜像数量、存储驱动、运行时、内核版本、硬件资源等

# 仅显示关键摘要信息
docker info --format '{{json .}}' | jq -c '[.ServerVersion, .OSType, .Architecture, .NCPU, .MemTotal]'
# 注释:
#   --format 输出 JSON 格式
#   结合 jq 工具提取核心参数:版本、OS类型、架构、CPU核数、总内存

# 检查存储驱动配置
docker info --format '{{.Driver}}'
# 注释:
#   显示当前使用的存储驱动(如 overlay2, btrfs, zfs)

# 验证容器运行时
docker info --format '{{.DefaultRuntime}}'
# 注释:
#   显示默认容器运行时(通常 runc 或 containerd)

# 检查安全增强配置
docker info --format '{{.SecurityOptions}}'
# 注释:
#   输出启用的安全特性(如 seccomp, apparmor, cgroupns)

# 查看网络插件信息
docker info --format '{{range .Plugins.Network}}{{.}}{{end}}'
# 注释:
#   枚举已安装的网络驱动(bridge, host, macvlan 等)

# 显示镜像存储路径
docker info --format '{{.DockerRootDir}}'
# 注释:
#   输出 Docker 数据根目录(默认 /var/lib/docker)

# 检查资源限制状态
docker info --format '{{.CgroupDriver}} - MemoryLimit: {{.MemoryLimit}} - SwapLimit: {{.SwapLimit}}'
# 注释:
#   Cgroup 驱动类型及内存/SWAP 限制启用状态