--- tags: - docker - devops - containerization - reference create time: 2026-04-28 14:40 --- # Docker 常用命令 > 按「容器生命周期」组织的命令速查手册。从拉取镜像到清理收尾,日常 90% 的操作都在以下命令中。建议收藏,用时直接翻。 ## 概述 Docker 的命令体系看似庞杂,但本质上围绕四个核心对象展开:**镜像(Image)→ 容器(Container)→ 网络(Network)→ 数据卷(Volume)**。 > [!tip] 记忆框架 > 理解这个生命周期,所有命令就不需要死记了: ```mermaid flowchart LR A["拉取镜像"] --> B["构建镜像"] B --> C["运行容器"] C --> D["调试/监控"] D --> E["停止/删除"] E --> F["清理回收"] F --> A style A fill:#e3f2fd style B fill:#fff3e0 style C fill:#e8f5e9 style D fill:#f3e5f5 style E fill:#fce4ec style F fill:#efebe9 ``` --- ## 正文 ### 一、镜像管理(Image) > [!info] 镜像 = 只读模板 > 镜像是容器的"蓝图"。同一个镜像可以运行多个容器实例,它们互不影响。 ```bash # 拉取镜像 docker pull nginx:latest # 拉取最新标签 docker pull redis:7-alpine # 拉取精简版(alpine 体积更小) docker pull node:20-slim # 查看所有镜像 docker images # 或 docker image ls # 搜索镜像 docker search nginx # 搜索官方和社区镜像 # 给镜像打标签 docker tag my-app:latest myrepo/my-app:v1.0 # 删除镜像 docker rmi nginx # 删除单个 docker rmi $(docker images -q) # 删除所有镜像(谨慎!) # 构建镜像 docker build -t my-app:v1.0 . # 当前目录构建(默认用 Dockerfile) docker build -t my-app:v1.0 -f Dockerfile.prod . # 指定 Dockerfile ``` > [!tip] 镜像分层缓存 > `docker build` 从上到下逐行执行,每一行都会生成一层缓存。把**不变的部分放前面**(安装依赖),**变化的部分放后面**(复制代码),充分利用缓存加速。 --- ### 二、容器管理(Container) > [!abstract] 容器 = 镜像的运行实例 > 容器是轻量级、隔离的进程。删除容器 = 停止进程 + 释放资源,容器内部写入的数据默认会丢失(除非挂载了 Volume)。 ```bash # 运行容器 docker run -d -p 8080:80 --name web nginx # -d 后台运行(detached) # -p 8080:80 宿主机端口:容器端口 # --name 容器名称(方便后续操作) # 前台运行(查看日志用) docker run -it --rm nginx bash # -i 交互式 -t 终端 --rm 退出后自动删除 # 查看所有容器(含已停止的) docker ps -a # 或 docker container ls -a # 查看运行中的容器 docker ps # 启动/停止/重启容器 docker start web docker stop web # 优雅停止(发 SIGTERM,等 10s 后 SIGKILL) docker restart web docker kill web # 强制停止(发 SIGKILL) # 进入运行中的容器 docker exec -it web bash # 在运行中的容器里执行命令 docker exec -it web sh # 有些精简镜像没有 bash,用 sh # 删除容器 docker rm web # 删除已停止的容器 docker rm -f web # 强制删除运行中的容器 # 查看容器日志 docker logs web docker logs -f web # 实时跟踪日志(类似 tail -f) docker logs --tail 100 web # 只看最后 100 行 ``` **`docker run` 常用参数速查:** | 参数 | 作用 | |------|------| | `-d` | 后台运行 | | `-p host:container` | 端口映射 | | `-v host:container` | 挂载卷 | | `-e KEY=VALUE` | 设置环境变量 | | `--name` | 容器名称 | | `--network` | 指定网络 | | `--restart=always` | 容器崩溃/开机自动重启 | | `--rm` | 退出后自动删除(临时调试用) | | `-it` | 交互式终端 | | `--gpus all` | 启用 GPU(NVIDIA) | --- ### 三、网络管理(Network) > [!question] 为什么容器能互相"看见"? > 答:Docker 为每个容器分配独立 IP,同一网络下的容器可以通过**容器名**(自动 DNS 解析)互相通信。 ```bash # 查看所有网络 docker network ls # 创建自定义网络 docker network create my-network # 容器加入指定网络 docker run -d --name web1 --network my-network nginx docker run -d --name db1 --network my-network mysql # 容器间通过名称互相访问(自动 DNS 解析) docker exec web1 ping db1 # 在同一网络下可直接 ping 容器名 # 删除网络 docker network rm my-network ``` > [!note] 为什么需要自定义网络? > Docker 默认的 `bridge` 网络不支持容器名 DNS 解析。自定义网络可以让容器通过**名字**互相通信。 --- ### 四、数据卷(Volume) > [!danger] 容器是易失的(ephemeral) > 删除容器 = 容器内数据消失!必须用 `-v` 把数据持久化到 Volume 或宿主机目录。 ```bash # 查看所有卷 docker volume ls # 创建卷 docker volume create my-data # 挂载卷到容器 docker run -d -v my-data:/data --name app nginx # 挂载宿主机目录到容器(bind mount) docker run -d -v /host/path:/container/path nginx # 只读挂载 docker run -d -v my-data:/data:ro nginx # 查看卷详情 docker volume inspect my-data ``` --- ### 五、日志与调试 ```bash # 进入容器 docker exec -it <容器名> bash # 查看容器资源占用 docker stats # 查看容器详情(JSON 格式) docker inspect web # 查看容器进程 docker top web # 拷贝文件进出容器 docker cp container.log web:/tmp/ docker cp web:/tmp/remote.log ./local.log # 查看镜像构建历史 docker history my-app:v1.0 ``` --- ### 六、清理命令(重要!) > [!warning] 磁盘占用会持续增长 > 停止的容器、未使用的镜像、悬空卷会悄悄吃掉磁盘空间。定期清理是好习惯。 ```bash # 删除所有已停止的容器 docker container prune # 删除所有未使用的镜像 docker image prune -a # 删除所有未使用的卷 docker volume prune # 一键清理(容器+镜像+卷+网络,谨慎使用) docker system prune -a # 查看磁盘占用 docker system df ``` --- ### 七、常用完整命令场景 #### 7.1 运行 Nginx ```bash docker run -d \ -p 80:80 \ -v ./nginx.conf:/etc/nginx/nginx.conf:ro \ -v ./html:/usr/share/nginx/html \ --name my-nginx \ --restart=always \ nginx:alpine ``` #### 7.2 运行 MySQL ```bash docker run -d \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=root123 \ -e MYSQL_DATABASE=mydb \ -v mysql-data:/var/lib/mysql \ --name my-mysql \ --restart=always \ mysql:8.0 ``` #### 7.3 运行 Redis ```bash docker run -d \ -p 6379:6379 \ -v redis-data:/data \ --name my-redis \ --restart=always \ redis:7-alpine redis-server --appendonly yes ``` #### 7.4 运行 Node 开发环境 ```bash docker run -it \ -p 3000:3000 \ -v $(pwd):/app \ -w /app \ node:20 \ bash # -v $(pwd):/app 挂载项目目录,修改代码实时生效 # -w /app 设置工作目录 ``` --- ### 八、进阶:Docker 网络模式 Docker 提供四种网络模式: | 模式 | 特点 | 适用场景 | |------|------|----------| | `bridge`(默认) | 容器有独立 IP | 大多数场景 | | `host` | 共享宿主机网络,性能最好 | 高性能需求 | | `none` | 无网络(完全隔离) | 安全隔离 | | `container` | 共享另一个容器的网络命名空间 | 特殊协作 | ```bash # bridge(默认) docker run -d --network bridge nginx # host docker run -d --network host nginx # none docker run -d --network none nginx # container(共享 web 容器的网络) docker run -d --network container:web nginx # 推荐:自定义 bridge 网络 docker network create my-net docker run -d --network my-net --name app nginx ``` --- ### 九、进阶:日志驱动 ```bash # 查看容器的日志配置 docker inspect web | grep LogConfig ``` | 驱动类型 | 说明 | |----------|------| | `json-file` | 默认,日志写入文件 | | `local` | 循环写入,控制大小 | | `syslog` | 发送到 syslog | | `journald` | 发送到 systemd journal | | `none` | 不记录日志 | ```yaml # docker-compose 中限制日志大小 services: api: logging: driver: json-file options: max-size: "10m" # 单个日志文件最大 10MB max-file: "3" # 最多保留 3 个文件 ``` --- ### 十、进阶:资源限制 > [!tip] 为什么需要限制资源? > 防止某个容器吃光 CPU/内存导致宿主机崩溃,这是多容器环境的必修课。 ```bash # 限制 CPU 和内存 docker run -d \ --cpus="1.5" \ --memory="512m" \ --memory-swap="1g" \ --pids-limit=100 \ nginx # --cpus 限制 1.5 个 CPU 核心 # --memory 限制 512MB 内存 # --memory-swap 允许使用的 swap 总量 # --pids-limit 最多 100 个进程(防 fork 炸弹) ``` --- ### 十一、进阶:Docker Swarm(简易集群) > [!info] Swarm vs Kubernetes > Swarm 适合单节点或小团队快速上手。大规模生产环境建议直接用 Kubernetes。 ```bash # 初始化集群(单节点) docker swarm init # 查看节点 docker node ls # 创建服务(Swarm 管理方式) docker service create --name web -p 80:80 --replicas 3 nginx # 扩容 docker service scale web=5 # 查看服务 docker service ls # 零停机滚动更新 docker service update --image nginx:1.25 web # 删除服务 docker service rm web # 退出集群 docker swarm leave # 多节点集群 docker swarm init --advertise-addr docker swarm join-token manager # 获取管理节点令牌 docker swarm join-token worker # 获取工作节点令牌 ``` --- ## 快速速查表 | 操作 | 命令 | |------|------| | 启动 Docker 服务 | `systemctl start docker` | | 查看版本 | `docker --version` | | 查看信息 | `docker info` | | 登录镜像仓库 | `docker login` | | 推送镜像 | `docker push my-app:v1.0` | | 导出镜像 | `docker save -o my-app.tar my-app:v1.0` | | 导入镜像 | `docker load -i my-app.tar` | | 查看容器日志 | `docker logs -f <容器名>` | | 进入容器 | `docker exec -it <容器名> bash` | | 停止所有容器 | `docker stop $(docker ps -q)` | | 删除所有容器 | `docker rm -f $(docker ps -aq)` | | 查看磁盘占用 | `docker system df` | | 全面清理 | `docker system prune -a` | --- ## 关联笔记 - [[Dockerfile编写指南]] — 编写高效的 Dockerfile - [[docker-compose]] — 用 Compose 编排多容器应用