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 Normal View History

2026-04-28 20:31:20 +08:00
# 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` |