【docker基础】第四课:容器操作与数据管理

📚前言

👀回顾,系统学习docker系列已发布内容:

【docker基础】0、系统学习docker之总计划

【docker基础】第一课、从零开始理解容器技术

【docker基础】第二课:安装、配置与基础命令

【docker基础】第三课:镜像管理与Dockerfile基础

🔗相关文档:

windows下安装docker

【docker基础】Ubuntu 安装 Docker 超详细小白教程

📒本文内容要点:

本文,是计划的第四周的内容,内容纲要如下:

  1. 容器操作
    • 创建容器:docker create
    • 启动容器:docker start
    • 运行容器:docker run
    • 停止容器:docker stop
    • 删除容器:docker rm
  2. 容器交互
    • 进入容器:docker exec
    • 查看容器日志:docker logs
    • 查看容器状态:docker ps
  3. 容器数据管理
    • 数据卷:docker volume
    • 绑定挂载:-v 参数

🌍Docker第四周学习教程:容器操作与数据管理

1. 容器操作

核心逻辑

  • 镜像 = 模板(只读)
  • 容器 = 镜像运行起来的实例(可读可写)
  • 容器管理 = 控制它的:创建 → 启动 → 停止 → 重启 → 删除

容器一共就 5 种状态,所有管理命令都是围绕这些状态:

  1. 创建(Created)
  2. 运行中(Up)
  3. 暂停(Paused)
  4. 停止(Exited)
  5. 删除(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 镜像
  • 创建一个容器
  • 启动
  • 映射端口
  • 后台运行

作用:

  • 自动执行两步:

    1. docker create(创建)

    2. docker start(启动)

    3. 等效于下面命令

      复制代码
      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:容器ID
  • IMAGE:使用的镜像
  • 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 大类:

  1. 进入容器内部操作(exec /run -it)
  2. 端口交互(外界访问容器服务:-p)
  3. 文件交互(宿主机 ↔ 容器互传文件)
  4. 数据持久化交互(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 总结:容器交互的核心原则(必须记住)

  1. 容器默认隔离,不主动和外界交互
  2. exec 是进入运行中容器,退出不影响服务
  3. run -it 是新建并进入,退出容器就停
  4. -p 端口映射才能访问服务
  5. cp 是单向拷贝
  6. -v 是双向实时同步

3. 卷管理

  • 卷 = Docker 独立管理的"数据盘"
  • 生命周期跟容器分离,容器删了,卷还在。

3.1 卷是什么?

  • 由 Docker 自己创建、管理、存放的独立存储空间
  • 不在容器里,也不归你随便放路径
  • 默认存放在 Docker 内部目录:
    /var/lib/docker/volumes/xxx/_data

作用:

让数据持久化,容器删数据不删,重建容器可重新挂载。


3.2 卷的核心逻辑(最重要)

  1. 卷的生命周期 ≠ 容器生命周期

    • 容器创建 → 卷可以跟着创建
    • 容器删除 → 卷默认不会被删
    • 只有手动 docker volume rm 才会删
  2. 一个卷可以挂给多个容器

    实现容器之间共享数据。

  3. 卷不受容器文件系统限制

    读写性能比容器内部存储好,也更稳定。

  4. 数据安全

    即使容器被误删,数据依然在卷里。


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 总结

  1. 卷是 Docker 托管的数据盘
  2. 容器删,卷不删
  3. 可创建、查看、删除、共享、挂载
  4. 生产环境持久化优先用卷
  5. 卷独立存在,不属于任何单个容器

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 条逻辑

  1. 数据不要存在容器内部
    容器删 → 数据没
  2. 数据要存在卷或挂载里
    容器删 → 数据还在
  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:完整的容器生命周期管理

  1. 创建并运行容器

    复制代码
    docker run -d --name myapp -p 8000:80 nginx:latest
  2. 查看容器状态

    复制代码
    docker ps
  3. 进入容器

    复制代码
    docker exec -it myapp bash
  4. 在容器中创建测试文件

    复制代码
    echo "Hello Docker" > /usr/share/nginx/html/test.html
    exit
  5. 查看容器日志

    复制代码
    docker logs myapp
  6. 停止容器

    复制代码
    docker stop myapp
  7. 删除容器

    复制代码
    docker rm myapp

练习2:数据持久化

  1. 创建数据卷

    复制代码
    docker volume create web-data
  2. 使用数据卷运行容器

    复制代码
    docker run -d --name myweb -v web-data:/usr/share/nginx/html -p 8080:80 nginx:latest
  3. 在主机上查看数据卷位置

    复制代码
    docker volume inspect web-data
  4. 修改数据并验证持久化

    • 在容器中修改文件
    • 停止并删除容器
    • 重新创建容器使用同一个数据卷
    • 验证数据是否保留

6. 总结

通过本周的学习,你已经掌握了Docker容器的基本操作、交互方法和数据管理技巧。这些操作是使用Docker的基础,也是构建更复杂应用的前提。

内容要点回顾

  • 容器的生命周期管理(创建、启动、运行、停止、删除)
  • 容器的交互方式(进入容器、查看日志、查看状态)
  • 数据持久化的两种方式(数据卷、绑定挂载)
相关推荐
蓝胖的四次元口袋2 小时前
Docker Compose多容器编排与Nginx集群实战
运维·nginx·docker compose
懂软件的胡子个哥2 小时前
微信 API 消息回调怎么设计,才能避免丢消息和重复处理
运维·微信·架构·wechatapi·个人微信号二次开发
吉甫作诵2 小时前
Redis 常用命令大全:11 大类命令速查手册
运维·数据库·redis·缓存·nosql
Acrellea4 小时前
告别粗放式能耗管理!安科瑞EIOT平台助力产业园区智慧低碳运营
运维·安全·能源
Databuff4 小时前
五款主流 SSH 免费工具介绍
运维·ssh·运维开发
菜鸟学编程o4 小时前
Linux常见指令
linux·运维·服务器
pt10435 小时前
AIOps机器学习——当警报阈值被调高之后
运维·人工智能·自动化
迪康coolmu5 小时前
企业文件外发管控落地实践 —— 基于迪康端点安全一体化管理系统
运维·网络·经验分享·安全
见闻小天地6 小时前
四方电气DL300变频器面向雕铣机多工况的技术参数与适配验证
运维·人工智能·业界资讯
千舟软件7 小时前
【宿舍管理小程序】新生入住不靠纸质表
大数据·运维·服务器·科技·业界资讯