mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-11 04:14:38 +00:00
style: apply global formatting fixes (struct, spacing, zhlint)
This commit is contained in:
@@ -12,6 +12,8 @@
|
||||
|
||||
### 新建并启动
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 基本语法
|
||||
|
||||
运行以下命令:
|
||||
@@ -22,7 +24,7 @@ docker run [选项] 镜像 [命令] [参数...]
|
||||
|
||||
#### 最简单的例子
|
||||
|
||||
输出 "Hello World" 后容器自动终止:
|
||||
输出 “Hello World” 后容器自动终止:
|
||||
|
||||
```bash
|
||||
$ docker run ubuntu:24.04 /bin/echo 'Hello world'
|
||||
@@ -81,6 +83,8 @@ flowchart TD
|
||||
|
||||
### 常用启动选项
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 基础选项
|
||||
|
||||
| 选项 | 说明 | 示例 |
|
||||
@@ -191,7 +195,9 @@ root@ba267838cc1b:/# ps
|
||||
|
||||
### 常见问题
|
||||
|
||||
#### Q: 容器启动后立即退出
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q:容器启动后立即退出
|
||||
|
||||
**原因**:主进程执行完毕或无法保持运行
|
||||
|
||||
@@ -207,7 +213,7 @@ $ docker run -d nginx # nginx 是持续运行的服务
|
||||
|
||||
详细解释见[后台运行](5.2_daemon.md)。
|
||||
|
||||
#### Q: 无法连接容器内的服务
|
||||
#### Q:无法连接容器内的服务
|
||||
|
||||
**原因**:未正确映射端口
|
||||
|
||||
@@ -221,7 +227,7 @@ $ docker run -d nginx
|
||||
$ docker run -d -p 80:80 nginx
|
||||
```
|
||||
|
||||
#### Q: 容器内修改的文件丢失
|
||||
#### Q:容器内修改的文件丢失
|
||||
|
||||
**原因**:未使用数据卷,数据保存在容器存储层
|
||||
|
||||
|
||||
@@ -9,11 +9,13 @@
|
||||
- **前台运行**:程序占用当前终端,输出直接显示,关闭终端程序就停止
|
||||
- **后台运行**:程序在后台执行,不占用终端,终端关闭也不影响程序
|
||||
|
||||
Docker 容器默认是**前台运行**的。使用 `-d`(detach)参数可以让容器在后台运行。
|
||||
Docker 容器默认是**前台运行**的。使用 `-d` (detach) 参数可以让容器在后台运行。
|
||||
|
||||
### 基本使用
|
||||
|
||||
#### 前台运行(默认)
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 前台运行 (默认)
|
||||
|
||||
运行以下命令:
|
||||
|
||||
@@ -25,12 +27,12 @@ hello world
|
||||
hello world
|
||||
```
|
||||
|
||||
容器会把输出的结果(STDOUT)打印到宿主机上面。此时:
|
||||
容器会把输出的结果 (STDOUT) 打印到宿主机上面。此时:
|
||||
- 终端被占用,无法执行其他命令
|
||||
- 按 `Ctrl+C` 会终止容器
|
||||
- 关闭终端窗口,容器也会停止
|
||||
|
||||
#### 后台运行(使用 -d 参数)
|
||||
#### 后台运行 (使用 -d 参数)
|
||||
|
||||
运行以下命令:
|
||||
|
||||
@@ -43,11 +45,11 @@ $ docker run -d ubuntu:24.04 /bin/sh -c "while true; do echo hello world; sleep
|
||||
- 容器在后台运行
|
||||
- 返回容器的完整 ID
|
||||
- 终端立即释放,可以继续执行其他命令
|
||||
- 输出不会直接显示(需要用 `docker logs` 查看)
|
||||
- 输出不会直接显示 (需要用 `docker logs` 查看)
|
||||
|
||||
### 深入理解:容器为什么会"立即退出"?
|
||||
### 深入理解:容器为什么会 “立即退出”?
|
||||
|
||||
> **这是初学者最常遇到的困惑。** 理解这个问题,你就理解了 Docker 的核心设计理念。
|
||||
> **这是初学者最常遇到的困惑。**理解这个问题,你就理解了 Docker 的核心设计理念。
|
||||
|
||||
很多人尝试这样启动容器:
|
||||
|
||||
@@ -59,6 +61,8 @@ $ docker run -d ubuntu:24.04
|
||||
|
||||
#### 核心原理:容器的生命周期与主进程绑定
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
subgraph Lifecycle ["Docker 容器的生命周期 = 容器内 PID 1 进程的生命周期"]
|
||||
@@ -71,15 +75,15 @@ flowchart TD
|
||||
当你运行 `docker run -d ubuntu:24.04` 时:
|
||||
1. 容器启动
|
||||
2. 没有指定命令,默认执行 `/bin/bash`
|
||||
3. 但没有交互式终端(没有 `-it` 参数),bash 发现没有输入源
|
||||
3. 但没有交互式终端 (没有 `-it` 参数),bash 发现没有输入源
|
||||
4. bash 立即退出
|
||||
5. 主进程退出,容器停止
|
||||
|
||||
**关键理解**:
|
||||
- ❌ `-d` 参数**不是**让容器"一直运行"
|
||||
- ✅ `-d` 参数是让容器"在后台运行",能运行多久取决于主进程
|
||||
- ❌ `-d` 参数**不是**让容器 “一直运行”
|
||||
- ✅ `-d` 参数是让容器 “在后台运行”,能运行多久取决于主进程
|
||||
|
||||
#### 常见的"立即退出"场景
|
||||
#### 常见的 “立即退出” 场景
|
||||
|
||||
| 场景 | 原因 | 解决方案 |
|
||||
|------|------|---------|
|
||||
@@ -89,6 +93,8 @@ flowchart TD
|
||||
|
||||
### 查看后台容器
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 查看运行中的容器
|
||||
|
||||
运行以下命令:
|
||||
@@ -111,7 +117,7 @@ hello world
|
||||
...
|
||||
```
|
||||
|
||||
**实时查看日志**(类似 `tail -f`):
|
||||
**实时查看日志** (类似 `tail -f`):
|
||||
|
||||
```bash
|
||||
$ docker container logs -f 77b2dc01fe0f
|
||||
@@ -125,11 +131,13 @@ $ docker container logs -f 77b2dc01fe0f
|
||||
$ docker container ls -a
|
||||
```
|
||||
|
||||
加上 `-a` 参数可以看到所有容器,包括已停止的。这对于调试"容器启动即退出"的问题非常有用。
|
||||
加上 `-a` 参数可以看到所有容器,包括已停止的。这对于调试 “容器启动即退出” 的问题非常有用。
|
||||
|
||||
### 最佳实践
|
||||
|
||||
#### 1. 长期运行的服务使用 -d
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1。长期运行的服务使用 -d
|
||||
|
||||
运行以下命令:
|
||||
|
||||
@@ -147,7 +155,7 @@ $ docker run -d -p 3306:3306 mysql:8
|
||||
$ docker run -d -p 6379:6379 redis
|
||||
```
|
||||
|
||||
#### 2. 调试时先用前台模式
|
||||
#### 2。调试时先用前台模式
|
||||
|
||||
当容器启动有问题时,**去掉 `-d` 参数**可以直接看到输出和错误:
|
||||
|
||||
@@ -157,7 +165,7 @@ $ docker run -d -p 6379:6379 redis
|
||||
$ docker run myimage:latest
|
||||
```
|
||||
|
||||
#### 3. 使用 --rm 自动清理
|
||||
#### 3。使用 --rm 自动清理
|
||||
|
||||
对于一次性任务,使用 `--rm` 参数让容器退出后自动删除:
|
||||
|
||||
@@ -169,7 +177,7 @@ Hello, World!
|
||||
...
|
||||
```
|
||||
|
||||
#### 4. 配合日志查看
|
||||
#### 4。配合日志查看
|
||||
|
||||
运行以下命令:
|
||||
|
||||
@@ -193,7 +201,9 @@ $ docker logs -t myapp
|
||||
|
||||
### 常见问题排查
|
||||
|
||||
#### Q: 容器启动后立即退出
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q:容器启动后立即退出
|
||||
|
||||
1. **查看退出状态码**:
|
||||
```bash
|
||||
@@ -214,7 +224,7 @@ $ docker logs -t myapp
|
||||
|
||||
```
|
||||
|
||||
#### Q: 容器在后台运行但无法访问服务
|
||||
#### Q:容器在后台运行但无法访问服务
|
||||
|
||||
1. **检查端口映射**:
|
||||
```bash
|
||||
@@ -226,7 +236,7 @@ $ docker logs -t myapp
|
||||
$ docker exec mycontainer ps aux
|
||||
```
|
||||
|
||||
#### Q: 如何让已经在后台运行的容器回到前台?
|
||||
#### Q:如何让已经在后台运行的容器回到前台?
|
||||
|
||||
使用 `docker attach`:
|
||||
|
||||
|
||||
@@ -14,7 +14,9 @@
|
||||
|
||||
---
|
||||
|
||||
### docker stop(推荐)
|
||||
### docker stop (推荐)
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### docker stop 基本用法
|
||||
|
||||
@@ -67,6 +69,8 @@ $ docker stop $(docker ps -q)
|
||||
|
||||
### docker kill
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 基本用法
|
||||
|
||||
运行以下命令:
|
||||
@@ -140,6 +144,8 @@ c5d3a5e8f7b2 nginx "nginx" Up 5 minutes mynginx
|
||||
|
||||
### 重新启动容器
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 启动已停止的容器
|
||||
|
||||
运行以下命令:
|
||||
@@ -192,6 +198,8 @@ stateDiagram-v2
|
||||
|
||||
### 批量操作
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 停止所有容器
|
||||
|
||||
运行以下命令:
|
||||
@@ -220,7 +228,9 @@ $ docker stop $(docker ps -q) && docker container prune -f
|
||||
|
||||
### 常见问题
|
||||
|
||||
#### Q: 容器停止很慢
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q:容器停止很慢
|
||||
|
||||
原因:应用没有正确处理 SIGTERM 信号,需要等待超时后强制终止。
|
||||
|
||||
@@ -229,7 +239,7 @@ $ docker stop $(docker ps -q) && docker container prune -f
|
||||
2. 使用 `docker stop -t 0` 立即终止
|
||||
3. 检查 Dockerfile 中的 `STOPSIGNAL` 配置
|
||||
|
||||
#### Q: 如何让容器优雅退出
|
||||
#### Q:如何让容器优雅退出
|
||||
|
||||
确保容器主进程正确处理信号:
|
||||
|
||||
@@ -243,7 +253,7 @@ FROM node:22
|
||||
CMD ["node", "server.js"]
|
||||
```
|
||||
|
||||
#### Q: 容器无法停止
|
||||
#### Q:容器无法停止
|
||||
|
||||
运行以下命令:
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
## 5.4 进入容器
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 为什么需要进入容器
|
||||
|
||||
使用 `-d` 参数启动容器后,容器在后台运行。以下场景需要进入容器内部操作:
|
||||
@@ -22,7 +24,9 @@ Docker 提供两种进入容器的命令:
|
||||
|
||||
---
|
||||
|
||||
### docker exec(推荐)
|
||||
### docker exec (推荐)
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### docker exec 基本用法
|
||||
|
||||
@@ -115,7 +119,9 @@ root@69d137adef7a:/# # 有提示符
|
||||
|
||||
---
|
||||
|
||||
### docker attach(谨慎使用)
|
||||
### docker attach (谨慎使用)
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### docker attach 基本用法
|
||||
|
||||
@@ -127,7 +133,7 @@ $ docker attach 容器名
|
||||
|
||||
#### 工作原理
|
||||
|
||||
`attach` 会附加到容器的**主进程**(PID 1)的标准输入输出:
|
||||
`attach` 会附加到容器的**主进程** (PID 1) 的标准输入输出:
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
@@ -228,7 +234,9 @@ flowchart LR
|
||||
|
||||
### 最佳实践
|
||||
|
||||
#### 1. 首选 docker exec
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1。首选 docker exec
|
||||
|
||||
运行以下命令:
|
||||
|
||||
@@ -246,16 +254,16 @@ $ docker exec myapp tail -f /var/log/app.log
|
||||
$ docker exec myapp python manage.py migrate
|
||||
```
|
||||
|
||||
#### 2. 生产环境避免进入容器
|
||||
#### 2。生产环境避免进入容器
|
||||
|
||||
笔者建议:生产环境应尽量避免进入容器直接操作,而是通过:
|
||||
- 日志系统查看日志(如 `docker logs` 或集中式日志)
|
||||
- 日志系统查看日志 (如 `docker logs` 或集中式日志)
|
||||
- 监控系统查看状态
|
||||
- 重新部署而非手动修改
|
||||
|
||||
#### 3. 无 shell 镜像的处理
|
||||
#### 3。无 shell 镜像的处理
|
||||
|
||||
某些精简镜像(如基于 `scratch` 或 `distroless`)没有 shell:
|
||||
某些精简镜像 (如基于 `scratch` 或 `distroless`) 没有 shell:
|
||||
|
||||
```bash
|
||||
## 这会失败
|
||||
@@ -272,11 +280,13 @@ $ docker debug myapp
|
||||
|
||||
### 常见问题
|
||||
|
||||
#### Q: exec 进入后看不到其他终端的操作
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q:exec 进入后看不到其他终端的操作
|
||||
|
||||
这是正常的。exec 启动的是独立进程,多个 exec 会话互不影响。
|
||||
|
||||
#### Q: 容器没有 bash
|
||||
#### Q:容器没有 bash
|
||||
|
||||
尝试使用 sh:
|
||||
|
||||
@@ -284,7 +294,7 @@ $ docker debug myapp
|
||||
$ docker exec -it myapp /bin/sh
|
||||
```
|
||||
|
||||
#### Q: 需要 root 权限
|
||||
#### Q:需要 root 权限
|
||||
|
||||
运行以下命令:
|
||||
|
||||
|
||||
@@ -31,4 +31,4 @@ test/ubuntu v1.0 9d37a6082e97 About a minute ago
|
||||
$ docker import http://example.com/exampleimage.tgz example/imagerepo
|
||||
```
|
||||
|
||||
*注:用户既可以使用 `docker load` 来导入镜像存储文件到本地镜像库,也可以使用 `docker import` 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。*
|
||||
*注:用户既可以使用 `docker load` 来导入镜像存储文件到本地镜像库,也可以使用 `docker import` 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息 (即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。*
|
||||
|
||||
@@ -65,6 +65,8 @@ $ docker rm -v mycontainer
|
||||
|
||||
### 批量删除
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 删除所有已停止的容器
|
||||
|
||||
运行以下命令:
|
||||
@@ -86,7 +88,7 @@ Total reclaimed space: 150MB
|
||||
$ docker container prune -f
|
||||
```
|
||||
|
||||
#### 删除所有容器(包括运行中的)
|
||||
#### 删除所有容器 (包括运行中的)
|
||||
|
||||
运行以下命令:
|
||||
|
||||
@@ -134,6 +136,10 @@ $ docker container prune --filter "until=24h"
|
||||
| `before=xxx` | 在某容器之前创建 | `-f before=mycontainer` |
|
||||
| `since=xxx` | 在某容器之后创建 | `-f since=mycontainer` |
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 示例
|
||||
|
||||
运行以下命令:
|
||||
@@ -170,6 +176,8 @@ $ docker image rm nginx
|
||||
|
||||
### 清理策略建议
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 开发环境
|
||||
|
||||
运行以下命令:
|
||||
@@ -227,7 +235,9 @@ docker system df
|
||||
|
||||
### 常见问题
|
||||
|
||||
#### Q: 容器无法删除
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q:容器无法删除
|
||||
|
||||
运行以下命令:
|
||||
|
||||
@@ -245,10 +255,10 @@ $ docker rm mycontainer
|
||||
$ docker rm -f mycontainer
|
||||
```
|
||||
|
||||
#### Q: 删除后磁盘空间没释放
|
||||
#### Q:删除后磁盘空间没释放
|
||||
|
||||
可能原因:
|
||||
1. 容器的数据卷未删除(使用 `-v` 参数)
|
||||
1. 容器的数据卷未删除 (使用 `-v` 参数)
|
||||
2. 镜像未删除
|
||||
3. 构建缓存未清理
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# 第五章 操作容器
|
||||
# 第五章操作容器
|
||||
|
||||
容器是 Docker 又一核心概念。
|
||||
|
||||
简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。
|
||||
简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统 (提供了运行态环境和其他系统环境) 和跑在上面的应用。
|
||||
|
||||
本章将具体介绍如何来管理一个容器,包括创建、启动和停止等。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user