网站公告

本次更新:没啥更新的

“钱塘江上潮信起,今日方知我是我”

Skip to content

容器 ​

字数: 0 字 时长: 0 分钟

1. 容器概述 ​

Docker 容器生命周期与状态

Docker 容器(Container)是镜像运行后形成的实例。Docker 会对容器中的进程、文件系统、网络等资源进行隔离,使不同容器之间可以相对独立地运行。

简单来说:

镜像是模板,容器是运行起来的实例。

例如,使用同一个 nginx 镜像,可以创建多个相互独立的 Nginx 容器:

text
nginx 镜像
    │
    ├── nginx-01 容器
    ├── nginx-02 容器
    └── nginx-03 容器

每个容器都是一个独立的运行实例,可以拥有自己的进程、网络配置和运行状态。

容器运行后主要存在以下几种状态:

  • 运行(Running):容器中的进程正在正常运行
  • 暂停(Paused):容器中的进程被暂停,暂时不继续执行
  • 停止(Stopped):容器中的进程已经终止,但容器本身仍然存在

可以简单理解为:

text
创建并运行
    ↓
 Running
    │
    ├── pause ──→ Paused
    │               │
    │            unpause
    │               ↓
    │            Running
    │
    └── stop ───→ Stopped
                    │
                  start
                    ↓
                 Running

需要注意的是:

停止容器并不等于删除容器,删除容器也不等于删除镜像。

镜像仍然可以继续创建新的容器,而同一个镜像也可以同时运行多个容器实例。


2. 容器操作 ​

2.1 容器相关命令 ​

Docker 容器可以在创建、运行、暂停、停止和删除等状态之间进行转换。

Docker 容器相关命令

常用的容器操作命令如下:

命令作用人话理解示例
docker run创建并运行容器根据镜像启动一个新容器docker run nginx
docker ps查看正在运行的容器看当前哪些容器正在运行docker ps
docker ps -a查看所有容器包括已经停止的容器docker ps -a
docker pause暂停容器临时暂停容器中的进程docker pause nginx01
docker unpause恢复暂停的容器让暂停的容器继续运行docker unpause nginx01
docker stop停止容器停止容器中的主进程docker stop nginx01
docker start启动已停止的容器把停止的容器重新启动docker start nginx01
docker restart重启容器停止后重新启动容器docker restart nginx01
docker rm删除容器删除不再需要的容器docker rm nginx01

2.2 创建并运行容器 ​

下面以 Nginx 为例,创建并运行一个容器:

bash
docker run --name mn -p 80:80 -d nginx

参数说明:

参数作用人话理解示例
docker run创建并运行容器根据镜像启动一个新容器docker run nginx
--name指定容器名称给容器起一个方便操作的名字--name mn
-p设置端口映射将宿主机端口映射到容器端口-p 80:80
-d后台运行容器不占用当前终端-d
nginx指定镜像使用哪个镜像创建容器nginx

其中:

text
-p 80:80
   │  │
   │  └── 容器端口
   └───── 宿主机端口

也就是说:

访问宿主机的 80 端口,请求会被转发到 Nginx 容器的 80 端口。

执行命令:

创建 Nginx 容器

在服务器中启动容器:

启动 Nginx 容器

查看运行状态:

查看 Nginx 容器运行状态

可以看到 Nginx 容器已经正常运行。


2.3 查看容器状态和日志 ​

查看当前正在运行的容器:

bash
docker ps

查看所有容器,包括已经停止的容器:

bash
docker ps -a

查看指定容器的日志:

bash
docker logs mn

持续跟踪容器日志:

bash
docker logs -f mn

其中:

  • docker logs:查看容器日志
  • -f:持续跟踪日志输出,效果类似 Linux 中的 tail -f
  • mn:容器名称

持续查看 Nginx 容器日志

常见的状态和日志命令:

命令作用人话理解示例
docker ps查看运行中的容器看哪些容器正在运行docker ps
docker ps -a查看所有容器连停止的容器一起看docker ps -a
docker logs查看容器日志看容器运行时输出了什么docker logs mn
docker logs -f持续查看容器日志实时跟踪日志输出docker logs -f mn

2.4 进入容器 ​

通过 docker exec 可以在一个正在运行的容器中执行命令。

例如,进入刚刚创建的 Nginx 容器:

bash
docker exec -it mn bash

参数说明:

  • docker exec:在正在运行的容器中执行命令
  • -i:保持标准输入打开
  • -t:分配一个终端
  • mn:容器名称
  • bash:在容器中启动 Bash Shell

部分精简镜像中可能没有安装 Bash,此时可以尝试使用 /bin/sh:

bash
docker exec -it mn /bin/sh

进入容器后,可以看到容器拥有自己相对独立的文件系统视图,看起来类似一个独立的 Linux 运行环境。

进入 Nginx 容器

Nginx 的默认 HTML 文件目录为:

text
/usr/share/nginx/html

进入该目录:

bash
cd /usr/share/nginx/html

查看目录中的文件:

bash
ls

查看 Nginx HTML 目录


2.5 修改容器中的文件 ​

下面通过修改 Nginx 默认页面,观察容器内部文件的变化。

由于当前容器中没有 vi 等编辑器,可以使用 sed 命令直接修改 index.html:

bash
sed -i \
  -e 's#Welcome to nginx#哈哈哈哈哈哈哈哈#g' \
  -e 's#<head>#<head><meta charset="utf-8">#g' \
  index.html

执行结果:

修改 Nginx HTML 文件

修改之前:

Nginx 默认页面

修改之后:

修改后的 Nginx 页面

可以看到,页面中的:

text
Welcome to nginx

已经被修改。

这里直接修改容器文件只是为了理解容器文件系统。实际项目中的配置文件、数据和需要长期保存的内容,通常不会直接保存在容器内部,后续会在数据卷章节中单独说明。


2.6 退出容器 ​

在容器终端中执行:

bash
exit

即可退出当前容器:

退出 Nginx 容器

退出容器只会退出当前 Shell,并不会停止容器。

可以通过:

bash
docker ps

确认容器仍然处于运行状态。


2.7 停止和删除容器 ​

正常情况下,可以先停止容器:

bash
docker stop mn

然后删除容器:

bash
docker rm mn

如果需要直接强制删除一个正在运行的容器,可以使用:

bash
docker rm -f mn

其中:

  • docker stop:停止容器中的进程,但保留容器
  • docker rm:删除已经停止的容器
  • docker rm -f:强制删除正在运行的容器

执行结果:

删除 Nginx 容器

需要再次强调:

停止容器只是停止运行,容器仍然存在;执行 docker rm 后,容器才会被删除。


3. 小结 ​

Docker 容器是镜像运行后的实例,一个镜像可以创建多个相互独立的容器。

常用的容器操作主要包括:

text
docker run       创建并运行容器
docker ps        查看运行中的容器
docker ps -a     查看所有容器
docker start     启动容器
docker stop      停止容器
docker restart   重启容器
docker pause     暂停容器
docker unpause   恢复暂停的容器
docker logs      查看容器日志
docker exec      在容器中执行命令
docker rm        删除容器

docker run 常见参数:

text
--name    指定容器名称
-p        设置端口映射
-d        后台运行容器

可以简单记住容器的基本生命周期:

text
镜像
 ↓
docker run
 ↓
运行中的容器
 ├── pause     → 暂停
 ├── stop      → 停止
 ├── restart   → 重启
 ├── exec      → 进入 / 执行命令
 ├── logs      → 查看日志
 └── rm        → 删除

镜像负责“创建”,容器负责“运行”;停止容器不会删除容器,删除容器也不会删除镜像。

Noctiflorous Garden · MIT License