Docker 命令大全:从入门到实战,这一篇就够了!

0 阅读7分钟

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

#