Docker 命令大全:从入门到实战,这一篇就够了!
💡 写在前面:学 Docker,命令是基础。这篇文章涵盖了日常开发、运维中 90% 以上用到的 Docker 命令,配上场景说明和实用示例,建议收藏备用!
🐳 一、Docker 是什么?先聊两句
Docker 就像一个「集装箱」,把你的应用和它的运行环境打包在一起,不管在哪台机器上跑,表现都一样。告别「我本地没问题啊」的灵魂拷问!
📦 二、镜像(Image)命令
镜像是容器的模板,就像装机用的 ISO 文件。
搜索镜像
docker search nginx # 搜索 nginx 相关镜像
docker search --limit 5 redis # 只显示前5个结果
拉取镜像
docker pull nginx # 拉取最新版
docker pull nginx:1.24 # 拉取指定版本
docker pull ubuntu:22.04 # 拉取 Ubuntu 22.04
查看镜像
docker images # 列出本地所有镜像
docker images -a # 包含中间层镜像
docker images nginx # 只看 nginx 镜像
docker image inspect nginx # 查看镜像详细信息
删除镜像
docker rmi nginx # 删除镜像
docker rmi nginx:1.24 # 删除指定版本
docker image prune # 删除所有悬空镜像(dangling)
docker image prune -a # 删除所有未使用的镜像 ⚠️ 慎用
构建镜像
docker build -t myapp:1.0 . # 用当前目录的 Dockerfile 构建
docker build -t myapp:1.0 -f Dockerfile.prod . # 指定 Dockerfile
docker build --no-cache -t myapp . # 不使用缓存重新构建
导入导出镜像
docker save -o myapp.tar myapp:1.0 # 导出镜像到文件
docker load -i myapp.tar # 从文件导入镜像
docker export container_id > app.tar # 导出容器文件系统
docker import app.tar myapp:new # 从文件导入为镜像
镜像标签与推送
docker tag myapp:1.0 username/myapp:1.0 # 打标签
docker push username/myapp:1.0 # 推送到 Docker Hub
docker login # 登录 Docker Hub
docker login registry.example.com # 登录私有仓库
🚀 三、容器(Container)命令
容器是镜像的运行实例,一个镜像可以启动多个容器。
运行容器
# 基础运行
docker run nginx # 前台运行(Ctrl+C 停止)
docker run -d nginx # 后台运行(detach 模式)
docker run -d --name my-nginx nginx # 指定容器名
# 端口映射
docker run -d -p 8080:80 nginx # 宿主机8080 -> 容器80
docker run -d -p 127.0.0.1:8080:80 nginx # 只绑定本地
docker run -d -P nginx # 随机映射所有暴露端口
# 环境变量
docker run -d -e MYSQL_ROOT_PASSWORD=123456 mysql
docker run -d --env-file .env myapp # 从文件读取环境变量
# 数据卷挂载
docker run -d -v /host/path:/container/path nginx # 挂载目录
docker run -d -v myvolume:/data nginx # 使用命名卷
# 资源限制
docker run -d --memory=512m --cpus=1 nginx # 限制内存和CPU
# 交互模式
docker run -it ubuntu:22.04 /bin/bash # 进入交互式终端
docker run --rm ubuntu:22.04 echo hello # 运行后自动删除容器
# 网络设置
docker run -d --network mynetwork nginx # 使用指定网络
docker run -d --network host nginx # 使用宿主机网络
查看容器
docker ps # 查看运行中的容器
docker ps -a # 查看所有容器(包括已停止)
docker ps -q # 只显示容器ID
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}" # 格式化输出
容器生命周期管理
docker start my-nginx # 启动已停止的容器
docker stop my-nginx # 优雅停止(发送 SIGTERM)
docker stop -t 30 my-nginx # 等待30秒后强制停止
docker kill my-nginx # 强制停止(发送 SIGKILL)
docker restart my-nginx # 重启容器
docker pause my-nginx # 暂停容器
docker unpause my-nginx # 恢复暂停的容器
删除容器
docker rm my-nginx # 删除已停止的容器
docker rm -f my-nginx # 强制删除(包括运行中的)
docker rm $(docker ps -aq) # 删除所有停止的容器
docker container prune # 清理所有停止的容器
进入容器
docker exec -it my-nginx /bin/bash # 进入运行中容器的 bash
docker exec -it my-nginx sh # 进入 sh(alpine 等轻量镜像用这个)
docker exec my-nginx ls /etc/nginx # 在容器内执行命令
docker attach my-nginx # 附着到容器前台(不推荐)
查看容器信息
docker logs my-nginx # 查看日志
docker logs -f my-nginx # 实时跟踪日志(tail -f 效果)
docker logs --tail 100 my-nginx # 只看最后100行
docker logs --since 1h my-nginx # 查看最近1小时的日志
docker inspect my-nginx # 查看容器详细信息(JSON)
docker stats # 实时查看所有容器资源使用
docker stats my-nginx # 查看指定容器资源使用
docker top my-nginx # 查看容器内运行的进程
docker port my-nginx # 查看端口映射
文件复制
docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf # 容器 -> 宿主机
docker cp ./nginx.conf my-nginx:/etc/nginx/nginx.conf # 宿主机 -> 容器
💾 四、数据卷(Volume)命令
数据卷用于持久化数据,容器删了数据还在!
docker volume create myvolume # 创建数据卷
docker volume ls # 列出所有数据卷
docker volume inspect myvolume # 查看数据卷详情
docker volume rm myvolume # 删除数据卷
docker volume prune # 删除所有未使用的数据卷 ⚠️
# 使用数据卷
docker run -d -v myvolume:/var/lib/mysql mysql
🌐 五、网络(Network)命令
容器间通信靠网络,不要总用 --link(已过时)!
docker network create mynetwork # 创建网络(默认bridge)
docker network create --driver overlay mynetwork # 创建 overlay 网络(Swarm用)
docker network ls # 列出所有网络
docker network inspect mynetwork # 查看网络详情
docker network rm mynetwork # 删除网络
docker network prune # 删除未使用的网络
# 连接/断开容器与网络
docker network connect mynetwork my-nginx # 将容器加入网络
docker network disconnect mynetwork my-nginx # 将容器移出网络
网络类型速查:
| 类型 | 说明 |
|---|---|
| bridge | 默认,单机容器互通 |
| host | 共享宿主机网络栈 |
| none | 无网络 |
| overlay | 跨主机,Swarm/K8s 用 |
| macvlan | 容器拥有独立 MAC 地址 |
🔧 六、Docker Compose 命令
多容器应用编排神器,一个 YAML 文件搞定所有!
# 启动服务
docker compose up # 前台启动所有服务
docker compose up -d # 后台启动所有服务
docker compose up -d nginx # 只启动指定服务
docker compose up --build # 重新构建后启动
# 停止服务
docker compose down # 停止并删除容器、网络
docker compose down -v # 同时删除数据卷 ⚠️
docker compose stop # 只停止,不删除容器
# 查看状态
docker compose ps # 查看服务状态
docker compose logs # 查看所有服务日志
docker compose logs -f nginx # 实时跟踪指定服务日志
# 管理服务
docker compose restart nginx # 重启服务
docker compose exec nginx bash # 进入服务容器
docker compose run --rm nginx env # 临时运行命令
docker compose pull # 拉取最新镜像
docker compose build # 构建服务镜像
docker compose config # 验证并查看 compose 配置
# 扩缩容
docker compose scale web=3 # 将 web 服务扩展到3个实例
🏗️ 七、Dockerfile 最佳实践速查
# 好的 Dockerfile 示例
FROM node:18-alpine # 用轻量镜像
WORKDIR /app # 设置工作目录
# 先复制依赖文件(利用缓存层)
COPY package*.json ./
RUN npm ci --only=production
# 再复制源码
COPY . .
EXPOSE 3000 # 声明端口
CMD ["node", "server.js"] # 启动命令
Dockerfile 常用指令:
FROM # 基础镜像
LABEL # 添加元数据标签
RUN # 构建时执行命令
COPY # 复制文件(推荐)
ADD # 复制文件(支持URL和解压tar)
WORKDIR # 设置工作目录
ENV # 设置环境变量
ARG # 构建参数(只在构建时有效)
EXPOSE # 声明容器监听端口
VOLUME # 声明数据卷挂载点
USER # 切换用户
CMD # 容器启动命令(可被覆盖)
ENTRYPOINT # 入口命令(不可被覆盖)
HEALTHCHECK # 健康检查
ONBUILD # 触发器指令
🧹 八、系统清理命令
磁盘不够用了?Docker 占了大量空间?一键清理!
docker system df # 查看 Docker 磁盘使用情况
docker system df -v # 详细显示
# 清理命令(从安全到危险排列)
docker container prune # 删除所有停止的容器
docker image prune # 删除悬空镜像
docker volume prune # 删除未使用的数据卷
docker network prune # 删除未使用的网络
# 一键清理所有!(慎用)
docker system prune # 清理停止容器+悬空镜像+未用网络
docker system prune -a # 额外清理未使用的镜像 ⚠️ 很危险
docker system prune -a --volumes # 连数据卷也清了 ☠️ 极度危险
🔍 九、调试与问题排查
# 查看 Docker 系统信息
docker info # Docker 详细信息
docker version # 客户端和服务端版本
# 容器调试
docker inspect --format='{{.State.ExitCode}}' my-nginx # 查看退出码
docker inspect --format='{{.NetworkSettings.IPAddress}}' my-nginx # 查看IP
docker events # 实时监控 Docker 事件
docker events --filter container=my-nginx # 过滤指定容器事件
# 健康检查
docker inspect --format='{{.State.Health.Status}}' my-nginx
#