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:
@@ -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`:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user