This repository has been archived on 2026-05-24. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
all-in-kingsoft/gyh/docker/Docker常用命令.md
T

363 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Docker 常用命令
> 按「生命周期」组织,从拉取镜像到清理收尾,日常 90% 的操作都在以下命令中。
---
## 一、镜像管理(Image)
```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
```
**镜像分层缓存:** `docker build` 从上到下逐行执行,每一行都会生成一层缓存。把**不变的部分放前面**(安装依赖),**变化的部分放后面**(复制代码),充分利用缓存加速。
---
## 二、容器管理(Container)
```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)
```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
```
> **为什么需要自定义网络?** Docker 默认的 `bridge` 网络不支持容器名 DNS 解析。自定义网络(`docker network create`)可以让容器通过**名字**互相通信。
---
## 四、数据卷(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
```
> **数据持久化原则:** 容器是** ephemeral(易失的)**——删除容器,容器内的数据就没了。必须用 `-v` 把数据存到宿主机或 Docker Volume 中。
---
## 五、日志与调试
```bash
# 进入容器
docker exec -it <容器名> bash
# 查看容器资源占用
docker stats
# 查看容器详情
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 # 查看镜像构建历史
```
---
## 六、清理命令(重要!)
```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 \
redis:7-alpine redis-server --appendonly yes
--restart=always
```
### 7.4 运行 Node 开发环境
```bash
docker run -it \
-p 3000:3000 \
-v $(pwd):/app \
-w /app \
node:20 \
bash
# -v $(pwd):/app 挂载项目目录,修改代码实时生效
# -w /app 设置工作目录
```
---
## 七、进阶:Docker 网络模式
```bash
# Docker 提供四种网络模式
# 1. bridge(默认)— 桥接网络,容器有独立 IP
docker run -d --network bridge nginx
# 2. host — 共享宿主机网络,性能最好但端口会冲突
docker run -d --network host nginx
# 3. none — 无网络(隔离)
docker run -d --network none nginx
# 4. container — 共享另一个容器的网络命名空间
docker run -d --network container:web nginx
# 推荐使用自定义 bridge 网络(前面已讲过)
docker network create my-net
docker run -d --network my-net --name app nginx
```
## 八、进阶:Docker 日志驱动
```bash
# 查看容器的日志配置
docker inspect web | grep LogConfig
# 日志驱动类型
# json-file — 默认,日志写入文件
# local — 循环写入,控制大小
# syslog — 发送到 syslog
# journald — 发送到 systemd journal
# none — 不记录日志
# docker-compose 中限制日志大小
services:
api:
logging:
driver: json-file
options:
max-size: "10m" # 单个日志文件最大 10MB
max-file: "3" # 最多保留 3 个文件
```
## 九、进阶:Docker 资源限制
```bash
# 限制 CPU 和内存
docker run -d \
--cpus="1.5" \ # 限制 1.5 个 CPU 核心
--memory="512m" \ # 限制 512MB 内存
--memory-swap="1g" \ # 允许使用的 swap 总量
--pids-limit=100 \ # 最多 100 个进程(防 fork 炸弹)
nginx
# docker-compose 中配置
services:
api:
deploy:
resources:
limits:
cpus: '1.5'
memory: 512M
reservations:
cpus: '0.5'
memory: 128M
```
## 十、进阶:Docker Swarm(简易集群)
```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 <IP>
docker swarm join-token manager # 添加管理节点
docker swarm join-token worker # 添加工作节点
```
> Swarm 适合轻量级部署。大规模生产环境建议用 Kubernetes。
## 十一、快速速查表
| 操作 | 命令 |
|------|------|
| 启动 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` |