【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的基础,也是构建更复杂应用的前提。

内容要点回顾

  • 容器的生命周期管理(创建、启动、运行、停止、删除)
  • 容器的交互方式(进入容器、查看日志、查看状态)
  • 数据持久化的两种方式(数据卷、绑定挂载)
相关推荐
好名字更能让你们记住我1 小时前
通过docker在本地部署博客系统服务
linux·运维·服务器·ubuntu·docker·容器
Plastic garden1 小时前
docker compose elfk
运维·docker·jenkins
Tim风声(网络工程师)1 小时前
双射频和三射频无线AP
运维·网络
梦梦代码精1 小时前
功能堆砌不如好扩展:4 款开源商城系统的选型思考
java·docker·uni-app·开源·php
志栋智能1 小时前
超自动化巡检:让运维工作可衡量、可优化
运维·数据库·自动化
遇见火星1 小时前
从0到1掌握Ansible:让自动化运维不再是梦想
运维·自动化·ansible
biter down1 小时前
7. Fixture :自动化前后置
运维·自动化
文青小兵1 小时前
Linux云计算——docker 告警(六)
linux·运维·docker·云计算·prometheus