📚前言
👀回顾,系统学习docker系列已发布内容:
【docker基础】第三课:镜像管理与Dockerfile基础
🔗相关文档:
【docker基础】Ubuntu 安装 Docker 超详细小白教程
📒本文内容要点:
本文,是计划的第四周的内容,内容纲要如下:
- 容器操作 :
- 创建容器:
docker create - 启动容器:
docker start - 运行容器:
docker run - 停止容器:
docker stop - 删除容器:
docker rm
- 创建容器:
- 容器交互 :
- 进入容器:
docker exec - 查看容器日志:
docker logs - 查看容器状态:
docker ps
- 进入容器:
- 容器数据管理 :
- 数据卷:
docker volume - 绑定挂载:
-v参数
- 数据卷:
🌍Docker第四周学习教程:容器操作与数据管理
1. 容器操作
核心逻辑
- 镜像 = 模板(只读)
- 容器 = 镜像运行起来的实例(可读可写)
- 容器管理 = 控制它的:创建 → 启动 → 停止 → 重启 → 删除
容器一共就 5 种状态,所有管理命令都是围绕这些状态:
- 创建(Created)
- 运行中(Up)
- 暂停(Paused)
- 停止(Exited)
- 删除(Deleted)
1.1 docker create - 创建容器
功能:创建一个新的容器但不启动它
语法:
docker create [选项] 镜像名 [命令] [参数]
实例:
docker create --name mynginx nginx:latest
输出解释:
c7f8a9a0d48a2c1f1e5c3b9a8d7f6e5d4c3b2a1d
这是创建的容器ID,表示容器已成功创建。
作用:
- 把容器创建好
- 配置准备好
- 但不启动!
- 状态:Created
常见选项:
--name:指定容器名称-p:端口映射,如-p 8080:80-e:设置环境变量--network:指定网络
1.2 docker start - 启动容器
功能:启动已创建的容器
语法:
docker start 容器ID或容器名
实例:
docker start mynginx
输出解释:
mynginx
表示容器已成功启动。
1.3 docker run - 运行容器
功能:创建并启动容器(是 create + start 的组合)
语法:
docker run [选项] 镜像名 [命令] [参数]
实例:
docker run -d --name mynginx -p 8080:80 nginx:latest
输出解释:
b8c7a9d6f5e4c3b2a1d0e9f8g7h6i5j4k3l2m1n0
这是创建并启动的容器ID。
逻辑:
- 下载(或使用本地)nginx 镜像
- 创建一个容器
- 启动它
- 映射端口
- 后台运行
作用:
-
自动执行两步:
-
docker create(创建)
-
docker start(启动)
-
等效于下面命令
docker create --name mynginx -p 8080:80 nginx:latest docker start mynginx
-
-
状态:Up 运行中
常见选项:
-d:后台运行-it:交互式终端--rm:容器停止后自动删除
1.4 docker stop - 停止容器
功能:停止正在运行的容器,容器还在,只是不运行了
语法:
docker stop 容器ID或容器名
实例:
docker stop mynginx
输出解释:
mynginx
表示容器已成功停止。
1.5 docker rm - 删除容器
功能:删除已停止的容器(必须先停止)
逻辑:
- 容器彻底删除
- 里面产生的所有数据丢失
- 镜像不受影响
语法:
docker rm 容器ID或容器名
实例:
docker rm mynginx
输出解释:
mynginx
表示容器已成功删除。
-f:强制删除运行中的容器:
docker rm -f mynginx
1.6 docker restart - 重启容器
功能:重启正在运行的容器,或者启动已经停止的容器
docker restart 容器名/ID
1.7 docker logs - 查看容器日志
功能:查看容器的日志输出
语法:
docker logs [选项] 容器ID或容器名
实例:
docker logs mynginx
输出解释:
172.17.0.1 - - [07/Apr/2026:00:00:00 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0..."
显示容器的访问日志。
常见选项:
-f:实时跟踪日志--tail:显示最后N行
1.8 docker ps - 查看容器状态
功能:查看容器的运行状态
语法:
docker ps [选项]
实例:
docker ps
输出解释:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b8c7a9d6f5e4 nginx:latest "/docker-entrypoint...." 5 minutes ago Up 5 minutes 0.0.0.0:8080->80/tcp mynginx
CONTAINER ID:容器IDIMAGE:使用的镜像COMMAND:启动命令CREATED:创建时间STATUS:状态(Up表示运行中)PORTS:端口映射NAMES:容器名称
-a 查看所有容器(包括停止的):
docker ps -a
1.9 总结
- docker run = 创建 + 启动
- docker stop = 停止
- docker start = 启动
- docker restart = 重新启动
- docker rm = 删除
- docker ps = 看运行中的
- docker log = 看日志
2. 容器交互
容器是独立运行的环境,默认不和外界交互。你要 "进去"、"传文件"、"传命令"、"映射端口",都属于容器交互。
容器交互分 4 大类:
- 进入容器内部操作(exec /run -it)
- 端口交互(外界访问容器服务:-p)
- 文件交互(宿主机 ↔ 容器互传文件)
- 数据持久化交互(volume 挂载)
2.1 进入容器
容器是一个独立的 Linux 系统,你想进去敲命令、改文件,就要开启一个终端连接。
1)运行时直接进入
docker run -it --name mytest ubuntu
-i:保持标准输入打开(能打字)-t:分配一个伪终端(看起来像终端)
逻辑:创建容器 → 直接进入 → 你退出,容器就停
2)进入已经运行的容器(最常用)
docker exec -it 容器ID /bin/bash
逻辑:
- 在正在运行的容器里新开一个终端
- 你退出
exit,容器继续运行 - 这才是生产标准用法
语法:
docker exec [选项] 容器ID或容器名 命令 [参数]
-- docker exec 用于 在运行中的容器内执行命令 ,它允许你与正在运行的容器进行交互,执行各种操作如查看文件、运行脚本、调试等。
实例:
# 进入容器的 bash shell(如果容器有 bash)
docker exec -it mynginx bash
输出解释:
root@b8c7a9d6f5e4:/#
表示已成功进入容器的bash终端。
常见选项:
-
-i(interactive):保持 STDIN 打开,即使没有附加终端 -
-t(tty):分配一个伪终端,让你获得交互式 Shell 界面 -
-it组合:最常用的交互式操作方式
常用选项完整说明
| 选项 | 全称 | 作用 | 示例 |
|---|---|---|---|
-i |
--interactive |
保持标准输入打开 | docker exec -i |
-t |
--tty |
分配伪终端 | docker exec -t |
-d |
--detach |
后台运行命令 | docker exec -d mynginx touch /tmp/test |
-u |
--user |
以指定用户身份运行 | docker exec -u root |
-w |
--workdir |
设置工作目录 | docker exec -w /app |
-e |
--env |
设置环境变量 | docker exec -e "VAR=value" |
--privileged |
赋予扩展权限 | 执行需要特权的命令 |
3)进入的容器中退出
根据你进入容器的方式不同,退出方法也有所区别:
最常见的退出方式:输入 exit 命令,或快捷键退出:Ctrl + D
# 进入容器
docker exec -it mynginx /bin/bash
# 在容器内执行命令
root@abc123:/# ls
root@abc123:/# pwd
# 退出容器
root@abc123:/# exit
# 或按 Ctrl+D
⚠️ 警告:
- 如果你是用
docker run -it启动并进入 的容器:执行exit会直接停止容器, 用Ctrl+P+Q退出不会停止容器 - 如果你是用
docker exec -it进入 的容器:执行exit只会退出终端,容器不会停止(最常用的场景)
2. 2 网络交互:端口映射(-p)
逻辑:
容器有自己独立的网络,外面访问不到。
必须做 端口映射,把你电脑端口和容器端口绑定。
docker run -d -p 8080:80 nginx
- 左边
8080:你电脑(宿主机)端口 - 右边
80:容器内部端口
外界访问逻辑:
浏览器 → 你电脑 8080 → 转发 → 容器 80 → Nginx 服务
2.3. 文件交互:宿主机 ↔ 容器互传
逻辑:
容器和外部文件系统是隔离的,
需要手动拷贝。
从电脑 → 容器
docker cp 本地文件 容器ID:/路径
从容器 → 电脑
docker cp 容器ID:/路径 本地目录
特点:一次性拷贝,不是实时同步。
2.4. 数据持久化交互:Volume 挂载(下一章"卷管理"详解)
逻辑:
让容器内目录 和你电脑目录实时同步 。
容器删了,文件还在你电脑上。
docker run -v /本机目录:/容器目录 nginx
逻辑:双向实时同步
你改本地文件 = 容器里同步变
容器里写文件 = 你本地也有
2.5 总结:容器交互的核心原则(必须记住)
- 容器默认隔离,不主动和外界交互
- exec 是进入运行中容器,退出不影响服务
- run -it 是新建并进入,退出容器就停
- -p 端口映射才能访问服务
- cp 是单向拷贝
- -v 是双向实时同步
3. 卷管理
- 卷 = Docker 独立管理的"数据盘"
- 生命周期跟容器分离,容器删了,卷还在。
3.1 卷是什么?
- 由 Docker 自己创建、管理、存放的独立存储空间
- 不在容器里,也不归你随便放路径
- 默认存放在 Docker 内部目录:
/var/lib/docker/volumes/xxx/_data
作用:
让数据持久化,容器删数据不删,重建容器可重新挂载。
3.2 卷的核心逻辑(最重要)
-
卷的生命周期 ≠ 容器生命周期
- 容器创建 → 卷可以跟着创建
- 容器删除 → 卷默认不会被删
- 只有手动
docker volume rm才会删
-
一个卷可以挂给多个容器
实现容器之间共享数据。
-
卷不受容器文件系统限制
读写性能比容器内部存储好,也更稳定。
-
数据安全
即使容器被误删,数据依然在卷里。
3.3 卷的三种使用方式逻辑
1)自动创建卷(匿名卷)
在dockerfile中:
VOLUME /data
或运行时:
docker run -v /data nginx
逻辑:
- Docker 自动生成一串随机名字的卷
- 挂载到容器
/data - 缺点:名字乱,不好管理
2)命名卷(最推荐、最常用)
docker run -v myvol:/data nginx
逻辑:
- 名字叫
myvol - 不存在则自动创建
- 可重复挂给其他容器
- 管理方便
3)先创建卷,再使用
docker volume create myvol2
docker run -v myvol2:/data nginx
逻辑:
- 手动创建 → 更可控
- 可设置驱动、标签等
3.4 卷管理命令逻辑
查看所有卷
docker volume ls
查看卷详情(存哪里、权限等)
docker inspect myvol
删除不用的卷
docker volume rm myvol
清理所有未被使用的卷
docker volume prune
逻辑:
- 只删没有容器挂载的卷
- 安全,不会误删正在用的数据
3.5 最经典场景:MySQL 持久化
docker run -d \
-v mysql_data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql
逻辑:
- 数据库文件存在
mysql_data卷 - 容器删了,卷还在
- 下次启动挂同一个卷,数据完整恢复
3.6 总结
- 卷是 Docker 托管的数据盘
- 容器删,卷不删
- 可创建、查看、删除、共享、挂载
- 生产环境持久化优先用卷
- 卷独立存在,不属于任何单个容器
4. 容器数据管理
容器一删,容器中的数据全丢,容器数据管理的目标
- 数据不丢
- 数据可共享
- 数据可迁移备份
Docker 提供 3 种数据管理方式。
4.1. 数据卷(Volume)------官方推荐
由 Docker 自己管理、创建、维护的目录
- 存放在 Docker 专属目录(Linux:
/var/lib/docker/volumes/) - 不依赖宿主机目录结构
- 可共享、可迁移、可备份
逻辑:
容器目录 ←→ Docker 托管卷
# 创建并使用卷
docker run -v 卷名:/容器内目录 镜像
4.2. 绑定挂载(Bind Mount)------开发常用
直接把宿主机的真实目录/文件映射进容器
- 宿主机改 → 容器立刻看见
- 容器改 → 宿主机立刻看见
- 路径完全由你指定
逻辑:
宿主机目录 ←→ 容器目录
docker run -v /宿主机路径:/容器内路径 镜像
卷 VS 绑定挂载(宿主机目录)
| 方式 | 谁管理 | 路径 | 推荐场景 |
|---|---|---|---|
| 卷 Volume | Docker | Docker 内部 | 数据库、持久存储 |
| 绑定挂载 | 你自己 | 任意系统路径 | 开发调试、代码同步 |
4.3. tmpfs 挂载(临时文件系统)
数据只存在内存中
-
关机/重启/删容器就消失
-
适合敏感临时数据(密码、缓存)
docker run --tmpfs <容器内路径>[:<选项>] 镜像名
1) 基本用法
docker run --tmpfs /tmp myimage
解释:
- 在容器的 /tmp 目录挂载一个 tmpfs
- /tmp 目录的所有数据都存储在内存中
2) 指定 tmpfs 大小限制
docker run --tmpfs /tmp:size=100m myimage
解释:
- size=100m 限制 tmpfs 最大使用 100MB 内存
- 如果不指定大小,默认无限制(受主机内存限制)
3) 多个 tmpfs 挂载
docker run --tmpfs /tmp --tmpfs /var/run myimage
解释:
- 同时在容器内挂载多个 tmpfs
4) 结合其他选项使用
docker run -d --name myapp --tmpfs /tmp:size=50m -p 8080:80
nginx
解释:
- 运行 Nginx 容器,在 /tmp 挂载 50MB 的 tmpfs
4.4. 三者对比(极简版)
| 方式 | 位置 | 生命周期 | 适用场景 |
|---|---|---|---|
| Volume | Docker 管理 | 独立于容器 | 数据库、持久数据 |
| Bind Mount | 宿主机任意目录 | 宿主机控制 | 开发调试、配置文件 |
| tmpfs | 内存 | 容器运行期间 | 临时敏感数据 |
4.5. 数据管理最重要的 3 条逻辑
- 数据不要存在容器内部
容器删 → 数据没 - 数据要存在卷或挂载里
容器删 → 数据还在 - 多个容器可共用同一个卷
实现数据共享
4.6 容器不能 "热取消" 数据卷
不管是 Volume(数据卷)还是 Bind Mount(绑定挂载),只要容器已经存在,**Docker 都不支持正在运行的容器 "热取消" 卷!想取消卷,必须:停止 → 删除容器 → 重新创建不带卷的新容器。**因为:
- 卷挂载是容器创建时就固定的配置
docker create/docker run时就写死了**,运行期间不能增删挂载点,不能改端口、不能改名字,啥都不能改。**- 容器停止 = 卷不再被使用
- 但配置还在,启动后会继续挂载
就像:
你买车时装了个后备箱(卷)
车跑起来(容器运行)不能直接拆掉后备箱
必须停车 → 销毁旧车 → 造一辆不带后备箱的新车
4.7、最常用场景示例
1)MySQL 数据持久化(Volume)
docker run -d \
-v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql
- 容器删了,
mysql-data卷还在 - 重建容器挂同一个卷,数据恢复
2)前端开发热更新(Bind Mount)
docker run -v ./代码目录:/usr/share/nginx/html nginx
本地改代码,容器内实时生效。
5、实战练习
练习1:完整的容器生命周期管理
-
创建并运行容器:
docker run -d --name myapp -p 8000:80 nginx:latest -
查看容器状态:
docker ps -
进入容器:
docker exec -it myapp bash -
在容器中创建测试文件:
echo "Hello Docker" > /usr/share/nginx/html/test.html exit -
查看容器日志:
docker logs myapp -
停止容器:
docker stop myapp -
删除容器:
docker rm myapp
练习2:数据持久化
-
创建数据卷:
docker volume create web-data -
使用数据卷运行容器:
docker run -d --name myweb -v web-data:/usr/share/nginx/html -p 8080:80 nginx:latest -
在主机上查看数据卷位置:
docker volume inspect web-data -
修改数据并验证持久化:
- 在容器中修改文件
- 停止并删除容器
- 重新创建容器使用同一个数据卷
- 验证数据是否保留
6. 总结
通过本周的学习,你已经掌握了Docker容器的基本操作、交互方法和数据管理技巧。这些操作是使用Docker的基础,也是构建更复杂应用的前提。
内容要点回顾:
- 容器的生命周期管理(创建、启动、运行、停止、删除)
- 容器的交互方式(进入容器、查看日志、查看状态)
- 数据持久化的两种方式(数据卷、绑定挂载)