Docker 基础命令
本章将介绍 Docker 最常用的命令,包括镜像操作和容器操作。掌握这些命令是使用 Docker 的基础。
Docker 命令结构
Docker 命令的基本格式:
docker [选项] 命令 [参数]
命令分类
| 分类 | 命令 | 说明 |
|---|---|---|
| 镜像管理 | docker image | 管理镜像 |
| 容器管理 | docker container | 管理容器 |
| 网络管理 | docker network | 管理网络 |
| 数据卷管理 | docker volume | 管理数据卷 |
| 系统管理 | docker system | 管理系统 |
镜像操作
搜索镜像
在 Docker Hub 搜索镜像:
# 搜索镜像
docker search nginx
# 限制结果数量
docker search --limit 5 nginx
# 过滤官方镜像
docker search --filter=is-official=true nginx
输出解释:
NAME DESCRIPTION STARS OFFICIAL
nginx Official build of Nginx. 18000 [OK]
- NAME:镜像名称
- DESCRIPTION:镜像描述
- STARS:收藏数量
- OFFICIAL:是否为官方镜像
拉取镜像
从仓库下载镜像到本地:
# 拉取最新版本
docker pull nginx
# 拉取指定版本
docker pull nginx:1.24
# 拉取指定平台
docker pull --platform linux/arm64 nginx
# 拉取所有标签
docker pull -a nginx
镜像标签格式:镜像名:标签
- 不指定标签时默认使用
latest - 标签可以是版本号、操作系统等
镜像分层:
Docker 镜像由多个只读层组成,每层代表 Dockerfile 中的一条指令。这种分层设计带来了几个好处:
- 共享基础层:多个镜像可以共享相同的基础层,节省存储空间
- 增量更新:只有变化的层需要重新构建和传输
- 缓存复用:构建时可以利用缓存,加快构建速度
查看镜像
列出本地镜像:
# 列出所有镜像
docker images
docker image ls
# 显示镜像 ID
docker images -q
# 显示镜像摘要
docker images --digests
# 过滤镜像
docker images --filter "dangling=true" # 显示悬空镜像
docker images --filter "reference=nginx"
# 格式化输出
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
输出解释:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 2 weeks ago 141MB
nginx 1.24 4cdc5dd7eaad 3 months ago 142MB
- REPOSITORY:镜像仓库名
- TAG:镜像标签
- IMAGE ID:镜像唯一标识
- CREATED:创建时间
- SIZE:镜像大小
查看镜像详情
# 查看镜像详细信息
docker image inspect nginx
# 查看特定信息
docker image inspect --format='{{.Architecture}}' nginx
docker image inspect --format='{{.Size}}' nginx
docker image inspect --format='{{.Config.Cmd}}' nginx
查看镜像历史
# 查看镜像构建历史
docker history nginx
# 显示完整信息
docker history --no-trunc nginx
删除镜像
# 删除镜像
docker rmi nginx
# 强制删除(即使有容器使用)
docker rmi -f nginx
# 删除悬空镜像
docker image prune
# 删除所有未使用的镜像
docker image prune -a
# 批量删除
docker rmi nginx:latest nginx:1.24
悬空镜像:没有标签指向的镜像,通常由构建新镜像产生。当你用相同标签构建新镜像时,旧镜像就会变成悬空镜像。
导出和导入镜像
# 导出镜像为 tar 文件
docker save -o nginx.tar nginx:latest
# 导出多个镜像
docker save -o images.tar nginx:latest redis:latest
# 从 tar 文件导入镜像
docker load -i nginx.tar
# 从容器创建镜像
docker commit [容器ID] my-nginx:v1
# 带说明信息
docker commit -m "自定义 Nginx" -a "作者" [容器ID] my-nginx:v1
镜像标签
# 创建镜像标签
docker tag nginx:latest my-registry/nginx:v1
# 推送到私有仓库
docker push my-registry/nginx:v1
容器操作
创建并运行容器
# 基本运行
docker run nginx
# 后台运行
docker run -d nginx
# 指定名称
docker run -d --name my-nginx nginx
# 交互式运行
docker run -it ubuntu bash
# 端口映射
docker run -d -p 8080:80 nginx
# 多端口映射
docker run -d -p 8080:80 -p 8443:443 nginx
# 随机端口映射
docker run -d -P nginx
# 环境变量
docker run -d -e MYSQL_ROOT_PASSWORD=123456 mysql
# 多个环境变量
docker run -d -e VAR1=value1 -e VAR2=value2 nginx
# 从文件读取环境变量
docker run -d --env-file .env nginx
docker run 常用选项:
| 选项 | 说明 |
|---|---|
-d | 后台运行(detached 模式) |
-i | 保持 STDIN 打开 |
-t | 分配伪终端 |
--name | 指定容器名称 |
-p | 端口映射(主机端口:容器端口) |
-P | 随机端口映射 |
-v | 挂载数据卷 |
-e | 设置环境变量 |
--env-file | 从文件读取环境变量 |
--restart | 重启策略 |
--network | 指定网络 |
--rm | 容器退出后自动删除 |
容器重启策略
重启策略决定了容器退出时 Docker 是否自动重启它:
# 不自动重启(默认)
docker run -d --restart=no nginx
# 总是重启
docker run -d --restart=always nginx
# 除非手动停止,否则总是重启(推荐用于生产环境)
docker run -d --restart=unless-stopped nginx
# 失败时重启,最多重启 3 次
docker run -d --restart=on-failure:3 nginx
重启策略选择建议:
- 开发环境:使用
no或on-failure - 生产环境:使用
unless-stopped或always - 定时任务容器:使用
on-failure
查看容器
# 查看运行中的容器
docker ps
docker container ls
# 查看所有容器(包括已停止)
docker ps -a
# 只显示容器 ID
docker ps -q
# 显示容器大小
docker ps -s
# 过滤容器
docker ps --filter "name=nginx"
docker ps --filter "status=running"
docker ps --filter "ancestor=nginx"
# 格式化输出
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
docker ps --format "{{.Names}}: {{.Status}}"
状态说明:
- created:已创建,未启动
- running:运行中
- paused:已暂停
- restarting:重启中
- exited:已退出
- dead:已死亡
容器操作
# 启动容器
docker start [容器名或ID]
# 停止容器
docker stop [容器名或ID]
# 重启容器
docker restart [容器名或ID]
# 暂停容器
docker pause [容器名或ID]
# 恢复容器
docker unpause [容器名或ID]
# 强制停止
docker kill [容器名或ID]
# 等待容器停止
docker wait [容器名或ID]
stop 和 kill 的区别:
docker stop:发送 SIGTERM 信号,等待容器优雅退出(默认 10 秒),超时后发送 SIGKILLdocker kill:直接发送 SIGKILL 信号,强制终止容器
进入容器
# 执行命令
docker exec [容器名或ID] ls /app
# 进入交互终端
docker exec -it [容器名或ID] bash
# 以 root 用户进入
docker exec -it -u 0 [容器名或ID] bash
# 指定工作目录
docker exec -it -w /app [容器名或ID] bash
# 使用 attach 连接到容器主进程
docker attach [容器名或ID]
# 注意:Ctrl+C 会停止容器,Ctrl+P Ctrl+Q 退出但保持容器运行
exec 和 attach 的区别:
exec:在容器中创建新进程,退出不影响容器attach:连接到容器主进程(PID 1),退出可能导致容器停止
查看容器日志
# 查看日志
docker logs [容器名或ID]
# 实时跟踪日志
docker logs -f [容器名或ID]
# 显示最近 100 行
docker logs --tail 100 [容器名或ID]
# 显示时间戳
docker logs -t [容器名或ID]
# 查看指定时间段的日志
docker logs --since 2024-01-01 [容器名或ID]
docker logs --since 2h [容器名或ID]
docker logs --until 2024-01-02 [容器名或ID]
查看容器信息
# 查看容器详情
docker inspect [容器名或ID]
# 查看特定信息
docker inspect --format='{{.State.Status}}' [容器名或ID]
docker inspect --format='{{.NetworkSettings.IPAddress}}' [容器名或ID]
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [容器名或ID]
# 查看容器进程
docker top [容器名或ID]
# 查看容器资源使用
docker stats [容器名或ID]
docker stats --no-stream [容器名或ID]
# 查看容器端口映射
docker port [容器名或ID]
查看容器变更
# 查看容器文件系统变更
docker diff [容器名或ID]
输出说明:
A:新增文件C:修改文件D:删除文件
文件复制
# 从容器复制文件到主机
docker cp [容器名或ID]:/app/config.yml ./config.yml
# 从主机复制文件到容器
docker cp ./config.yml [容器名或ID]:/app/config.yml
# 复制目录
docker cp ./data [容器名或ID]:/app/
删除容器
# 删除已停止的容器
docker rm [容器名或ID]
# 强制删除运行中的容器
docker rm -f [容器名或ID]
# 删除所有停止的容器
docker container prune
# 删除所有容器
docker rm -f $(docker ps -aq)
# 删除容器及其关联的卷
docker rm -v [容器名或ID]
资源限制
内存限制
# 限制内存为 512MB
docker run -d --memory="512m" nginx
# 限制内存和交换内存
docker run -d --memory="512m" --memory-swap="1g" nginx
# 设置内存软限制
docker run -d --memory-reservation="256m" nginx
内存限制参数说明:
--memory:硬限制,容器使用的内存不能超过此值--memory-swap:内存 + 交换分区的总限制--memory-reservation:软限制,系统内存紧张时会尝试限制到此值
CPU 限制
# 限制 CPU 配额为 0.5 个 CPU
docker run -d --cpus="1.5" nginx
# 指定 CPU 核心
docker run -d --cpuset-cpus="0,1" nginx
# 设置 CPU 权重(默认 1024)
docker run -d --cpu-shares=512 nginx
CPU 限制参数说明:
--cpus:限制容器可以使用的 CPU 核心数--cpuset-cpus:绑定到特定的 CPU 核心--cpu-shares:相对权重,多个容器竞争 CPU 时生效
IO 限制
# 限制读写速度
docker run -d \
--device-read-bps=/dev/sda:10mb \
--device-write-bps=/dev/sda:10mb \
nginx
# 限制读写 IOPS
docker run -d \
--device-read-iops=/dev/sda:1000 \
--device-write-iops=/dev/sda:1000 \
nginx
清理系统
# 清理未使用的容器、网络、镜像(悬空)
docker system prune
# 清理所有未使用的资源
docker system prune -a
# 包括数据卷
docker system prune -a --volumes
# 查看磁盘使用情况
docker system df
# 显示详细信息
docker system df -v
项目初始化(docker init)
docker init 是 Docker Desktop 提供的便捷命令,可以快速为项目生成 Docker 相关的配置文件。它能自动检测项目类型并创建合理的默认配置。
什么是 docker init?
手动编写 Dockerfile 和 compose.yaml 文件可能繁琐且容易出错。docker init 通过交互式向导,引导你完成以下文件的创建:
.dockerignore- 排除不需要复制到镜像的文件Dockerfile- 构建镜像的脚本compose.yaml- 多容器编排配置README.Docker.md- Docker 使用说明文档
支持的项目类型
| 模板 | 适用场景 |
|---|---|
| Go | Go 服务器应用 |
| Java | 使用 Maven 的 Java 应用 |
| Node | Node.js 服务器应用 |
| PHP with Apache | PHP Web 应用 |
| Python | Python 服务器应用 |
| Rust | Rust 服务器应用 |
| ASP.NET Core | .NET Core 应用 |
| Other | 通用起始模板 |
使用示例
基本用法:
# 在项目目录中运行
docker init
# 交互式选择项目类型
? What application platform does your project use? [Use arrows to move]
> Go
Java
Node
PHP with Apache
Python
Rust
ASP.NET Core
Other
Go 项目示例:
$ docker init
? What application platform does your project use? Go
? What version of Go do you want to use? 1.21
? What's the relative directory of your main package? .
? What port does your server listen on? 8080
CREATED: .dockerignore
CREATED: Dockerfile
CREATED: compose.yaml
CREATED: README.Docker.md
✔ Your Docker files are ready!
Take a moment to review them and tailor them to your application.
When you're ready, start your application by running: docker compose up --build
Node.js 项目示例:
$ docker init
? What application platform does your project use? Node
? What version of Node do you want to use? 18
? Which package manager do you want to use? npm
? Do you want to run "npm run build" before starting your server? Yes
? What directory is your build output? dist
? What command do you want to use to start the app? npm start
? What port does your server listen on? 3000
CREATED: .dockerignore
CREATED: Dockerfile
CREATED: compose.yaml
CREATED: README.Docker.md
Python 项目示例:
$ docker init
? What application platform does your project use? Python
? What version of Python do you want to use? 3.11
? What port do you want your app to listen on? 8000
? What is the command to run your app? python app.py
CREATED: .dockerignore
CREATED: Dockerfile
CREATED: compose.yaml
CREATED: README.Docker.md
生成的文件说明
运行 docker init 后,生成的文件需要根据实际项目进行调整。以下是一些常见注意事项:
Dockerfile:
- 检查基础镜像版本是否符合需求
- 确认端口暴露是否正确
- 验证启动命令是否准确
- 根据需要添加额外的依赖安装
compose.yaml:
- 调整服务配置(环境变量、卷挂载等)
- 添加依赖服务(数据库、缓存等)
- 配置网络和卷
.dockerignore:
- 确认是否排除了所有不需要的文件
- 添加项目特定的排除规则
注意事项
- 如果目标文件已存在,
docker init会提示是否覆盖 - 覆盖操作不可恢复,建议先备份重要文件
- 生成的文件是起点模板,需要根据项目实际情况调整
- 该命令需要 Docker Desktop 环境
上下文管理(docker context)
Docker Context 允许你在多个 Docker 环境之间切换,比如本地 Docker、远程服务器、云平台或 Swarm 集群。这对于管理多环境部署非常有用。
什么是 Context?
Context 是一组连接配置,定义了如何连接到 Docker daemon。每个 Context 包含:
| 配置项 | 说明 |
|---|---|
| Endpoint | Docker daemon 的连接地址 |
| TLS 配置 | 安全连接所需的证书 |
| 元数据 | Context 的描述信息 |
默认情况下,Docker 使用名为 default 的 Context,连接到本地 Docker daemon。
查看和管理 Context
列出所有 Context:
# 列出所有 context
docker context ls
# 输出示例
NAME DESCRIPTION DOCKER ENDPOINT ERROR
default * Current DOCKER_HOST based configuration unix:///var/run/docker.sock
my-remote Remote Docker server ssh://[email protected]
swarm-cluster Swarm cluster tcp://swarm-manager:2376
查看当前使用的 Context:
# 显示当前 context 名称
docker context show
# 输出:default
查看 Context 详情:
# 查看详细信息
docker context inspect default
# 以 JSON 格式输出
docker context inspect --format json default
创建 Context
通过 SSH 连接远程 Docker:
# 创建连接到远程服务器的 context
docker context create my-remote \
--docker "host=ssh://[email protected]"
# 指定 SSH 密钥
docker context create my-remote \
--docker "host=ssh://[email protected]" \
--description "Production server"
通过 TCP 连接:
# 创建 TCP 连接的 context(需要 TLS)
docker context create my-tcp \
--docker "host=tcp://192.168.1.100:2376" \
--docker "ca=/path/to/ca.pem" \
--docker "cert=/path/to/cert.pem" \
--docker "key=/path/to/key.pem"
连接到 Swarm 集群:
# 创建 Swarm context
docker context create swarm-cluster \
--docker "host=tcp://swarm-manager:2376" \
--description "Production Swarm cluster"
切换 Context
# 切换到指定 context
docker context use my-remote
# 验证当前 context
docker context show
# 输出:my-remote
# 后续命令将在该 context 上执行
docker ps
docker info
更新和删除 Context
# 更新 context 配置
docker context update my-remote \
--description "Updated description"
# 删除 context(不能删除当前使用的 context)
docker context rm my-remote
# 强制删除
docker context rm -f my-remote
导入导出 Context
# 导出 context 到文件
docker context export my-remote -o my-remote.dockercontext
# 从文件导入
docker context import my-remote-import my-remote.dockercontext
使用环境变量切换
除了使用 docker context use,还可以通过环境变量切换:
# 方式 1:使用 DOCKER_CONTEXT 环境变量
export DOCKER_CONTEXT=my-remote
docker ps # 在 my-remote context 上执行
# 方式 2:使用 DOCKER_HOST 环境变量(直接指定连接地址)
export DOCKER_HOST=ssh://[email protected]
docker ps
# 单次命令指定 context
DOCKER_CONTEXT=my-remote docker ps
优先级:-H 参数 > DOCKER_HOST 环境变量 > DOCKER_CONTEXT 环境变量 > 当前 context
Context 使用场景
| 场景 | 说明 |
|---|---|
| 开发与生产切换 | 在本地开发和生产环境之间快速切换 |
| 多集群管理 | 管理多个 Kubernetes 或 Swarm 集群 |
| 远程调试 | 连接到远程服务器进行调试 |
| CI/CD 流水线 | 在不同环境间部署应用 |
实际示例:
# 开发环境(本地)
docker context use default
docker compose up -d
# 切换到测试环境
docker context use test-server
docker compose up -d
# 切换到生产环境
docker context use production
docker service ls
Context 配置文件
Context 配置存储在 Docker 配置目录中:
- Linux/macOS:
~/.docker/contexts/ - Windows:
C:\Users\<username>\.docker\contexts\
每个 context 有独立的目录,包含配置文件和证书。
Docker Desktop 命令行
Docker Desktop 提供了一组命令行工具,可以直接管理 Docker Desktop 应用程序本身。
常用命令
# 启动 Docker Desktop
docker desktop start
# 停止 Docker Desktop
docker desktop stop
# 重启 Docker Desktop
docker desktop restart
# 查看 Docker Desktop 状态
docker desktop status
# 打开 Docker Desktop 设置
docker desktop settings
# 打开 Docker Desktop Dashboard
docker dashboard
# 更新 Docker Desktop
docker desktop update
# 查看版本信息
docker desktop version
# 诊断问题
docker desktop diagnose
# 查看日志
docker desktop logs
使用场景
快速重启:
# 当 Docker Desktop 出现问题时快速重启
docker desktop restart
故障诊断:
# 运行诊断工具
docker desktop diagnose
# 查看日志定位问题
docker desktop logs --tail 100
后台启动:
# 在 CI/CD 脚本中后台启动
docker desktop start --wait
# --wait 参数会等待 Docker 完全启动后再返回
CLI 配置文件
Docker CLI 的配置存储在配置目录中:
配置文件位置:
- Linux/macOS:
~/.docker/config.json - Windows:
C:\Users\<username>\.docker\config.json
常用配置项:
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "base64-encoded-credentials"
}
},
"credsStore": "desktop",
"currentContext": "default",
"plugins": {
"compose": {
"enabled": true
}
},
"proxies": {
"default": {
"httpProxy": "http://proxy.example.com:8080",
"httpsProxy": "http://proxy.example.com:8080",
"noProxy": "localhost,127.0.0.1"
}
}
}
配置项说明:
| 配置项 | 说明 |
|---|---|
auths | 镜像仓库认证信息 |
credsStore | 凭据存储后端 |
currentContext | 当前使用的 context |
plugins | CLI 插件配置 |
proxies | 代理配置 |
命令速查
镜像命令
| 命令 | 说明 |
|---|---|
docker pull | 拉取镜像 |
docker images | 列出镜像 |
docker rmi | 删除镜像 |
docker tag | 创建标签 |
docker save | 导出镜像 |
docker load | 导入镜像 |
docker build | 构建镜像 |
docker history | 查看镜像历史 |
docker inspect | 查看镜像详情 |
容器命令
| 命令 | 说明 |
|---|---|
docker run | 创建并运行容器 |
docker start | 启动容器 |
docker stop | 停止容器 |
docker restart | 重启容器 |
docker rm | 删除容器 |
docker ps | 列出容器 |
docker logs | 查看日志 |
docker exec | 执行命令 |
docker cp | 复制文件 |
docker stats | 资源统计 |
docker top | 查看进程 |
docker port | 查看端口 |
小结
Docker 基础命令的使用要点:
- 命令结构:
docker [选项] 命令 [参数],分为镜像、容器、网络、数据卷等子命令 - 镜像操作:
docker pull拉取、docker images列出、docker rmi删除、docker save/load导出导入 - 容器操作:
docker run创建运行、docker start/stop/restart生命周期管理、docker exec进入容器、docker logs查看日志 - 资源限制:
--memory内存限制、--cpusCPU 限制、--device-read-bpsIO 限制 - 系统清理:
docker system prune清理未使用资源、docker system df查看磁盘使用
练习
- 拉取 nginx 镜像并运行一个容器
- 使用端口映射访问 nginx 服务
- 进入容器修改默认页面
- 查看容器日志和资源使用情况
- 清理所有停止的容器和悬空镜像