Docker 已经成为现代软件开发与部署的事实标准。无论你是开发者、运维工程师,还是刚接触容器技术的小白,掌握 Docker 常用命令都是必备技能。本文将系统性地梳理 Docker 命令的方方面面,从镜像管理到容器生命周期,再到网络与卷,并辅以实战示例,助你快速上手。
一、Docker 基础架构回顾
在开始命令学习之前,简单回顾 Docker 的核心组件:
- 镜像(Image):只读模板,包含运行应用所需的代码、库、环境变量等。
- 容器(Container):镜像的运行实例,拥有独立文件系统、网络等资源。
- 仓库(Registry):存储镜像的地方,如 Docker Hub。
- 网络(Network):容器间通信的虚拟网络。
- 卷(Volume):持久化存储,独立于容器生命周期。
理解这些概念后,命令就变得有迹可循。
二、镜像管理命令
镜像是容器的基石,掌握镜像命令是第一步。
1. 拉取镜像
bash
# 从 Docker Hub 拉取一个镜像
docker pull nginx:latest
# 拉取指定版本
docker pull ubuntu:20.04
docker pull 会下载镜像到本地。如果不指定标签,默认拉取 latest。
2. 列出本地镜像
bash
# 列出所有镜像
docker images
# 或
docker image ls
# 只显示镜像 ID
docker images -q
# 查看镜像大小等详细信息
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
3. 构建镜像
bash
# 基于当前目录的 Dockerfile 构建
docker build -t myapp:v1 .
# 指定 Dockerfile 路径
docker build -f /path/to/Dockerfile -t myapp:v1 .
-t 为镜像指定名称和标签,. 表示构建上下文路径。
4. 删除镜像
bash
# 删除指定镜像
docker rmi nginx:latest
docker image rm ubuntu:20.04
# 强制删除(即使有容器依赖)
docker rmi -f nginx:latest
# 删除所有未使用的镜像(悬空镜像)
docker image prune
5. 给镜像打标签
bash
# 为本地镜像添加新标签
docker tag myapp:v1 myusername/myapp:v1
# 通常用于准备推送到远程仓库
docker tag myapp:v1 myregistry.com/myapp:latest
6. 推送镜像到仓库
bash
# 登录 Docker Hub
docker login
# 推送镜像
docker push myusername/myapp:v1
三、容器生命周期命令
容器是镜像的运行实例,掌握容器命令是日常操作的核心。
1. 运行容器
bash
# 简单运行一个 nginx 容器,并映射端口
docker run -d --name mynginx -p 8080:80 nginx
# 参数说明:
# -d:后台运行(detach)
# --name:给容器命名
# -p:端口映射,主机端口:容器端口
# 交互式运行并进入容器
docker run -it --name ubuntu_test ubuntu:20.04 /bin/bash
# -it:分配交互式终端,常用作调试
# 挂载卷
docker run -v /host/data:/container/data -d myapp
# 设置环境变量
docker run -e MY_ENV=production -d myapp
# 限制资源
docker run --memory="512m" --cpus="1.5" -d myapp
2. 查看容器
bash
# 查看运行中的容器
docker ps
# 查看所有容器(包括已停止)
docker ps -a
# 只显示容器 ID
docker ps -q
# 格式化输出
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
3. 启动、停止、重启、暂停、恢复容器
bash
# 启动已存在的容器
docker start mynginx
# 停止运行中的容器
docker stop mynginx
# 强制停止(相当于 kill)
docker kill mynginx
# 重启
docker restart mynginx
# 暂停容器进程(保留内存)
docker pause mynginx
# 恢复
docker unpause mynginx
4. 删除容器
bash
# 删除已停止的容器
docker rm mynginx
# 强制删除运行中的容器
docker rm -f mynginx
# 删除所有已停止的容器
docker container prune
# 删除所有容器(谨慎!)
docker rm -f $(docker ps -aq)
5. 进入容器内部
bash
# 执行新命令(推荐,不会影响主进程)
docker exec -it mynginx /bin/bash
# 如果容器内没有 bash,可用 sh
docker exec -it alpine sh
# 以交互式 shell 进入正在运行的容器
docker exec -it mynginx /bin/bash
6. 查看容器日志
bash
# 查看全部日志
docker logs mynginx
# 实时跟踪日志(类似 tail -f)
docker logs -f mynginx
# 查看最后 100 行
docker logs --tail 100 mynginx
7. 容器与主机文件复制
bash
# 从容器复制文件到主机
docker cp mynginx:/usr/share/nginx/html/index.html ./index.html
# 从主机复制到容器
docker cp ./myfile.txt mynginx:/tmp/
8. 查看容器详细信息
bash
# 输出容器的所有配置、网络、挂载等 JSON 信息
docker inspect mynginx
# 使用格式化提取特定信息(如 IP 地址)
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mynginx
四、网络管理命令
Docker 网络让容器间通信成为可能。默认有三种网络:bridge(桥接)、host(主机)、none。
1. 列出网络
bash
docker network ls
2. 创建网络
bash
# 创建一个自定义桥接网络
docker network create mynet
# 指定子网和网关
docker network create --subnet=172.20.0.0/16 --gateway=172.20.0.1 mynet
3. 将容器连接到网络
bash
# 运行容器时指定网络
docker run -d --name app --network mynet nginx
# 将已有容器连接到网络
docker network connect mynet app
# 断开网络
docker network disconnect mynet app
4. 查看网络详情
bash
docker network inspect mynet
5. 删除网络
bash
# 删除前需断开所有使用该网络的容器
docker network rm mynet
五、卷管理命令
卷用于持久化数据,独立于容器。
1. 列出卷
bash
docker volume ls
2. 创建卷
bash
docker volume create myvol
3. 查看卷详情
bash
docker volume inspect myvol
4. 挂载卷
bash
# 运行容器时挂载卷
docker run -d -v myvol:/data --name app myapp
# 使用 --mount 语法(更明确)
docker run -d --mount source=myvol,target=/data myapp
# 绑定挂载主机目录(不推荐用于生产数据卷)
docker run -v /host/path:/container/path myapp
5. 删除卷
bash
# 删除指定卷
docker volume rm myvol
# 删除所有未使用的卷
docker volume prune
六、系统信息与清理
1. 查看 Docker 系统信息
bash
# 显示系统级信息(版本、内核、镜像数量等)
docker info
# 查看客户端与服务端版本
docker version
2. 查看磁盘使用情况
bash
# 类似 df,显示镜像、容器、卷的占用
docker system df
# 详细模式
docker system df -v
3. 清理系统资源
bash
# 清理所有未使用资源(镜像、容器、网络、构建缓存)
docker system prune
# 自动确认,并清理卷
docker system prune -a --volumes
# 只清理构建缓存
docker builder prune
七、高级技巧与最佳实践
1. 组合命令(常用操作)
bash
# 停止并删除所有容器
docker stop $(docker ps -aq) && docker rm $(docker ps -aq)
# 删除所有悬空镜像
docker rmi $(docker images -f "dangling=true" -q)
# 批量删除包含特定关键词的容器
docker rm $(docker ps -aq --filter "name=myapp")
2. 使用别名提高效率
将常用命令添加到 ~/.bashrc 或 ~/.zshrc:
bash
alias d='docker'
alias dps='docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"'
alias dexec='docker exec -it'
alias dlogs='docker logs -f'
3. 容器自动重启策略
bash
docker run -d --restart=always --name myapp myapp
# 可选策略:no / on-failure / unless-stopped / always
4. 限制容器日志大小
防止容器日志占满磁盘:
bash
docker run -d --log-opt max-size=10m --log-opt max-file=3 myapp
5. 使用 Docker Compose(进阶)
虽然本文聚焦于单机命令,但多容器应用推荐使用 Compose。它基于 YAML 文件管理服务、网络、卷,命令更简洁:
bash
docker-compose up -d
docker-compose down
