Fix and update

This commit is contained in:
baohua
2026-02-09 11:34:35 -08:00
parent e669ee0fe8
commit 63377d0431
136 changed files with 2146 additions and 262 deletions

View File

@@ -1,5 +1,7 @@
## 启动容器
本节将详细介绍 Docker 容器的启动方式包括新建启动和重新启动已停止的容器
### 启动方式概述
启动容器有两种方式
@@ -12,6 +14,8 @@
#### 基本语法
运行以下命令
```bash
docker run [选项] 镜像 [命令] [参数...]
```
@@ -97,47 +101,65 @@ root@af8bae53bdd3:/# exit # 退出容器
#### 端口映射
运行以下命令
```bash
## 将容器的 80 端口映射到宿主机的 8080 端口
$ docker run -d -p 8080:80 nginx
## 随机映射端口
$ docker run -d -P nginx
## 只绑定到 localhost
$ docker run -d -p 127.0.0.1:8080:80 nginx
```
#### 数据卷挂载
运行以下命令
```bash
## 挂载命名卷
$ docker run -v mydata:/data nginx
## 挂载宿主机目录
$ docker run -v /host/path:/container/path nginx
## 只读挂载
$ docker run -v /host/path:/container/path:ro nginx
```
#### 环境变量
运行以下命令
```bash
## 设置单个环境变量
$ docker run -e MYSQL_ROOT_PASSWORD=secret mysql
## 从文件加载环境变量
$ docker run --env-file .env myapp
```
#### 资源限制
运行以下命令
```bash
## 限制内存
$ docker run -m 512m nginx
## 限制 CPU
$ docker run --cpus=1.5 nginx
```
@@ -147,14 +169,17 @@ $ docker run --cpus=1.5 nginx
```bash
## 查看所有容器(包括已停止的)
$ docker ps -a
CONTAINER ID IMAGE STATUS NAMES
af8bae53bdd3 ubuntu Exited (0) 2 minutes ago myubuntu
## 重新启动
$ docker start myubuntu
## 启动并附加终端
$ docker start -ai myubuntu
```
@@ -181,9 +206,11 @@ root@ba267838cc1b:/# ps
```bash
## 这个容器会立即退出echo 执行完就结束了)
$ docker run ubuntu echo "hello"
## 解决:使用能持续运行的命令
$ docker run -d nginx # nginx 是持续运行的服务
```
@@ -195,9 +222,11 @@ $ docker run -d nginx # nginx 是持续运行的服务
```bash
## 错误:没有 -p 参数,外部无法访问
$ docker run -d nginx
## 正确:映射端口
$ docker run -d -p 80:80 nginx
```
@@ -207,6 +236,7 @@ $ docker run -d -p 80:80 nginx
```bash
## 使用数据卷持久化
$ docker run -v mydata:/app/data myapp
```

View File

@@ -15,6 +15,8 @@ Docker 容器默认是**前台运行**的。使用 `-d`detach参数可以
#### 前台运行默认
运行以下命令
```bash
$ docker run ubuntu:24.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
hello world
@@ -30,6 +32,8 @@ hello world
#### 后台运行使用 -d 参数
运行以下命令
```bash
$ docker run -d ubuntu:24.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a
@@ -55,6 +59,8 @@ $ docker run -d ubuntu:24.04
#### 核心原理容器的生命周期与主进程绑定
具体内容如下
```
┌─────────────────────────────────────────────────────────────────────┐
│ Docker 容器的生命周期 = 容器内 PID 1 进程的生命周期 │
@@ -87,6 +93,8 @@ $ docker run -d ubuntu:24.04
#### 查看运行中的容器
运行以下命令
```bash
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
@@ -95,6 +103,8 @@ CONTAINER ID IMAGE COMMAND CREATED STATUS PO
#### 查看容器输出日志
运行以下命令
```bash
$ docker container logs 77b2dc01fe0f
hello world
@@ -111,6 +121,8 @@ $ docker container logs -f 77b2dc01fe0f
#### 查看已停止的容器
运行以下命令
```bash
$ docker container ls -a
```
@@ -121,14 +133,19 @@ $ docker container ls -a
#### 1. 长期运行的服务使用 -d
运行以下命令
```bash
## Web 服务器
$ docker run -d -p 80:80 nginx
## 数据库
$ docker run -d -p 3306:3306 mysql:8
## 缓存服务
$ docker run -d -p 6379:6379 redis
```
@@ -138,6 +155,7 @@ $ docker run -d -p 6379:6379 redis
```bash
## 有问题的容器,先前台运行看看发生了什么
$ docker run myimage:latest
```
@@ -149,21 +167,30 @@ $ docker run myimage:latest
$ docker run --rm ubuntu:24.04 echo "Hello, World!"
Hello, World!
## 容器执行完后自动删除
具体内容如下:
```
#### 4. 配合日志查看
运行以下命令
```bash
## 后台启动
$ docker run -d --name myapp myimage:latest
## 查看最近 100 行日志
$ docker logs --tail 100 myapp
## 实时跟踪日志
$ docker logs -f myapp
## 查看带时间戳的日志
$ docker logs -t myapp
```

View File

@@ -1,5 +1,7 @@
## 终止容器
本节将介绍如何终止一个运行中的容器以及几种不同的终止方式及其区别
### 终止方式概述
终止容器有三种方式
@@ -16,12 +18,16 @@
#### 基本用法
运行以下命令
```bash
$ docker stop 容器名或ID
```
#### 工作原理
具体内容如下
```
docker stop mycontainer
@@ -37,21 +43,29 @@ docker stop mycontainer
#### 自定义超时时间
运行以下命令
```bash
## 等待 30 秒后强制终止
$ docker stop -t 30 mycontainer
## 立即发送 SIGKILL相当于 docker kill
$ docker stop -t 0 mycontainer
```
#### 停止多个容器
运行以下命令
```bash
## 停止多个指定容器
$ docker stop container1 container2 container3
## 停止所有运行中的容器
$ docker stop $(docker ps -q)
```
@@ -61,6 +75,8 @@ $ docker stop $(docker ps -q)
#### 基本用法
运行以下命令
```bash
$ docker kill 容器名或ID
```
@@ -74,11 +90,15 @@ $ docker kill 容器名或ID
#### 发送自定义信号
运行以下命令
```bash
## 发送 SIGHUP让进程重新加载配置
$ docker kill -s HUP mycontainer
## 发送 SIGTERM
$ docker kill -s TERM mycontainer
```
@@ -90,10 +110,12 @@ $ docker kill -s TERM mycontainer
```bash
## 主进程是交互式 bash
$ docker run -it ubuntu bash
root@abc123:/# exit # 退出 bash → 容器停止
## 主进程执行完毕
$ docker run ubuntu echo "Hello" # echo 执行完 → 容器停止
```
@@ -101,6 +123,8 @@ $ docker run ubuntu echo "Hello" # echo 执行完 → 容器停止
### 查看已停止的容器
运行以下命令
```bash
$ docker ps -a
CONTAINER ID IMAGE COMMAND STATUS NAMES
@@ -124,20 +148,27 @@ c5d3a5e8f7b2 nginx "nginx" Up 5 minutes mynginx
#### 启动已停止的容器
运行以下命令
```bash
$ docker start 容器名或ID
## 启动并附加终端
$ docker start -ai 容器名
```
#### 重启运行中的容器
运行以下命令
```bash
## 先停止再启动
$ docker restart 容器名
## 自定义停止超时
$ docker restart -t 30 容器名
```
@@ -145,6 +176,8 @@ $ docker restart -t 30 容器名
### 生命周期状态图
具体内容如下
```
docker create
@@ -186,18 +219,24 @@ $ docker restart -t 30 容器名
#### 停止所有容器
运行以下命令
```bash
$ docker stop $(docker ps -q)
```
#### 删除所有已停止的容器
运行以下命令
```bash
$ docker container prune
```
#### 停止并删除所有容器
运行以下命令
```bash
$ docker stop $(docker ps -q) && docker container prune -f
```
@@ -221,19 +260,25 @@ $ docker stop $(docker ps -q) && docker container prune -f
```dockerfile
## Dockerfile 示例
FROM node:22
...
## 使用 exec 形式确保信号能传递给 node 进程
CMD ["node", "server.js"]
```
#### Q: 容器无法停止
运行以下命令
```bash
## 强制终止
$ docker kill 容器名
## 如果仍无法停止,检查系统资源
$ docker inspect 容器名
```

View File

@@ -26,11 +26,15 @@ Docker 提供两种进入容器的命令:
#### 基本用法
运行以下命令
```bash
## 进入容器并启动交互式 shell
$ docker exec -it 容器名 /bin/bash
## 或使用 sh适用于 Alpine 等精简镜像)
$ docker exec -it 容器名 /bin/sh
```
@@ -47,18 +51,23 @@ $ docker exec -it 容器名 /bin/sh
#### 示例
运行以下命令
```bash
## 启动一个后台容器
$ docker run -dit --name myubuntu ubuntu
69d137adef7a...
## 进入容器(交互式 shell
$ docker exec -it myubuntu bash
root@69d137adef7a:/# ls
bin boot dev etc home lib ...
root@69d137adef7a:/# exit
## 容器仍在运行!
$ docker ps
CONTAINER ID IMAGE STATUS NAMES
69d137adef7a ubuntu Up 2 minutes myubuntu
@@ -70,19 +79,25 @@ CONTAINER ID IMAGE STATUS NAMES
```bash
## 查看容器内进程
$ docker exec myubuntu ps aux
## 查看配置文件
$ docker exec myubuntu cat /etc/nginx/nginx.conf
## 以 root 用户执行
$ docker exec -u root myubuntu apt update
```
#### 只用 -i 不用 -t 的区别
运行以下命令
```bash
## 只用 -i可以执行命令但没有提示符
$ docker exec -i myubuntu bash
ls # 输入命令
bin # 输出结果
@@ -91,6 +106,7 @@ dev
...
## 用 -it有完整的终端体验
$ docker exec -it myubuntu bash
root@69d137adef7a:/# # 有提示符
```
@@ -103,6 +119,8 @@ root@69d137adef7a:/# # 有提示符
#### 基本用法
运行以下命令
```bash
$ docker attach 容器名
```
@@ -123,12 +141,16 @@ $ docker attach 容器名
#### 示例
运行以下命令
```bash
## 启动容器
$ docker run -dit --name myubuntu ubuntu
243c32535da7...
## 附加到容器
$ docker attach myubuntu
root@243c32535da7:/#
```
@@ -156,6 +178,7 @@ CONTAINER ID IMAGE STATUS NAMES
$ docker attach myubuntu
root@243c32535da7:/#
## 按 Ctrl+P 然后 Ctrl+Q
read escape sequence
$ docker ps # 容器仍在运行
@@ -194,14 +217,19 @@ docker exec docker attach
#### 1. 首选 docker exec
运行以下命令
```bash
## 进入容器调试
$ docker exec -it myapp bash
## 查看日志
$ docker exec myapp tail -f /var/log/app.log
## 执行数据库迁移
$ docker exec myapp python manage.py migrate
```
@@ -218,10 +246,12 @@ $ docker exec myapp python manage.py migrate
```bash
## 这会失败
$ docker exec -it myapp bash
OCI runtime exec failed: exec failed: unable to start container process: exec: "bash": executable file not found
## 解决方案使用调试容器Docker Desktop 或 Kubernetes debug
$ docker debug myapp
```
@@ -243,6 +273,8 @@ $ docker exec -it myapp /bin/sh
#### Q: 需要 root 权限
运行以下命令
```bash
$ docker exec -u root -it myapp bash
```

View File

@@ -1,5 +1,7 @@
## 导出和导入容器
当我们需要迁移容器或者备份容器时可以使用 Docker 的导入和导出功能本节将介绍这两个命令的使用方法
### 导出容器
如果要导出本地某个容器可以使用 `docker export` 命令

View File

@@ -1,5 +1,7 @@
## 删除容器
随着容器的创建和停止系统中会积累大量的容器本节将介绍如何删除不再需要的容器以及如何清理所有停止的容器
### 基本用法
使用 `docker rm` 删除已停止的容器
@@ -22,6 +24,8 @@ $ docker rm 容器名或ID
#### 删除已停止的容器
运行以下命令
```bash
$ docker rm mycontainer
mycontainer
@@ -29,12 +33,16 @@ mycontainer
#### 强制删除运行中的容器
运行以下命令
```bash
## 不加 -f 会报错
$ docker rm running_container
Error: cannot remove running container
## 加 -f 强制删除
$ docker rm -f running_container
running_container
```
@@ -43,8 +51,11 @@ running_container
#### 删除容器及其数据卷
运行以下命令
```bash
## 删除容器时同时删除其匿名卷
$ docker rm -v mycontainer
```
@@ -56,8 +67,11 @@ $ docker rm -v mycontainer
#### 删除所有已停止的容器
运行以下命令
```bash
## 方式一:使用 prune 命令(推荐)
$ docker container prune
WARNING! This will remove all stopped containers.
@@ -68,30 +82,40 @@ def456...
Total reclaimed space: 150MB
## 方式二:不提示确认
$ docker container prune -f
```
#### 删除所有容器包括运行中的
运行以下命令
```bash
## 先停止所有容器,再删除
$ docker stop $(docker ps -q)
$ docker rm $(docker ps -aq)
## 或者直接强制删除
$ docker rm -f $(docker ps -aq)
```
#### 按条件删除
运行以下命令
```bash
## 删除所有已退出的容器
$ docker rm $(docker ps -aq -f status=exited)
## 删除名称包含 "test" 的容器
$ docker rm $(docker ps -aq -f name=test)
## 删除 24 小时前创建的容器
$ docker container prune --filter "until=24h"
```
@@ -112,11 +136,15 @@ $ docker container prune --filter "until=24h"
#### 示例
运行以下命令
```bash
## 删除所有基于 nginx 镜像的容器
$ docker rm $(docker ps -aq -f ancestor=nginx)
## 删除所有创建后未启动的容器
$ docker rm $(docker ps -aq -f status=created)
```
@@ -128,10 +156,12 @@ $ docker rm $(docker ps -aq -f status=created)
```bash
## 尝试删除有容器依赖的镜像
$ docker image rm nginx
Error: image is being used by stopped container abc123
## 需要先删除依赖该镜像的容器
$ docker rm abc123
$ docker image rm nginx
```
@@ -142,27 +172,37 @@ $ docker image rm nginx
#### 开发环境
运行以下命令
```bash
## 定期清理已停止的容器
$ docker container prune -f
## 一键清理所有未使用资源
$ docker system prune -f
```
#### 生产环境
运行以下命令
```bash
## 使用 --rm 参数运行临时容器
$ docker run --rm ubuntu echo "Hello"
## 容器退出后自动删除
## 定期清理(设置保留时间)
$ docker container prune --filter "until=168h" # 保留 7 天内的
```
#### 完整清理脚本
运行以下命令
```bash
#!/bin/bash
## cleanup.sh - Docker 资源清理脚本
@@ -189,6 +229,8 @@ docker system df
#### Q: 容器无法删除
运行以下命令
```bash
Error: container is running
```
@@ -199,6 +241,7 @@ Error: container is running
$ docker stop mycontainer
$ docker rm mycontainer
## 或
$ docker rm -f mycontainer
```
@@ -213,9 +256,11 @@ $ docker rm -f mycontainer
```bash
## 查看空间占用
$ docker system df
## 完整清理
$ docker system prune -a --volumes
```