【docker基础】第四课:容器操作与数据管理
前言回顾系统学习docker系列已发布内容【docker基础】0、系统学习docker之总计划【docker基础】第一课、从零开始理解容器技术【docker基础】第二课安装、配置与基础命令【docker基础】第三课镜像管理与Dockerfile基础相关文档windows下安装docker【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删除Deleted1.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 mynginx1.6 docker restart - 重启容器功能重启正在运行的容器或者启动已经停止的容器docker restart 容器名/ID1.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 mynginxCONTAINER ID容器IDIMAGE使用的镜像COMMAND启动命令CREATED创建时间STATUS状态Up表示运行中PORTS端口映射NAMES容器名称-a 查看所有容器包括停止的docker ps -a1.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输出解释rootb8c7a9d6f5e4:/#表示已成功进入容器的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 VARvalue--privileged赋予扩展权限执行需要特权的命令3进入的容器中退出根据你进入容器的方式不同退出方法也有所区别最常见的退出方式输入exit命令或快捷键退出Ctrl D# 进入容器 docker exec -it mynginx /bin/bash # 在容器内执行命令 rootabc123:/# ls rootabc123:/# pwd # 退出容器 rootabc123:/# exit # 或按 CtrlD⚠️ 警告如果你是用docker run -it启动并进入的容器执行exit会直接停止容器用CtrlPQ退出不会停止容器如果你是用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_PASSWORD123456 \ 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 绑定挂载宿主机目录方式谁管理路径推荐场景卷 VolumeDockerDocker 内部数据库、持久存储绑定挂载你自己任意系统路径开发调试、代码同步4.3. tmpfs 挂载临时文件系统数据只存在内存中关机/重启/删容器就消失适合敏感临时数据密码、缓存docker run --tmpfs 容器内路径[:选项] 镜像名1 基本用法docker run --tmpfs /tmp myimage解释在容器的 /tmp 目录挂载一个 tmpfs/tmp 目录的所有数据都存储在内存中2 指定 tmpfs 大小限制docker run --tmpfs /tmp:size100m myimage解释size100m 限制 tmpfs 最大使用 100MB 内存如果不指定大小默认无限制受主机内存限制3 多个 tmpfs 挂载docker run --tmpfs /tmp --tmpfs /var/run myimage解释同时在容器内挂载多个 tmpfs4 结合其他选项使用docker run -d --name myapp --tmpfs /tmp:size50m -p 8080:80 nginx解释运行 Nginx 容器在 /tmp 挂载 50MB 的 tmpfs4.4. 三者对比极简版方式位置生命周期适用场景VolumeDocker 管理独立于容器数据库、持久数据Bind Mount宿主机任意目录宿主机控制开发调试、配置文件tmpfs内存容器运行期间临时敏感数据4.5. 数据管理最重要的 3 条逻辑数据不要存在容器内部容器删 → 数据没数据要存在卷或挂载里容器删 → 数据还在多个容器可共用同一个卷实现数据共享4.6 容器不能 “热取消” 数据卷不管是 Volume数据卷还是 Bind Mount绑定挂载只要容器已经存在Docker 都不支持正在运行的容器 “热取消” 卷想取消卷必须停止 → 删除容器 → 重新创建不带卷的新容器。因为卷挂载是容器创建时就固定的配置docker create/docker run时就写死了运行期间不能增删挂载点不能改端口、不能改名字啥都不能改。容器停止 卷不再被使用但配置还在启动后会继续挂载就像你买车时装了个后备箱卷车跑起来容器运行不能直接拆掉后备箱必须停车 → 销毁旧车 → 造一辆不带后备箱的新车4.7、最常用场景示例1MySQL 数据持久化Volumedocker run -d \ -v mysql-data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD123456 \ mysql容器删了mysql-data卷还在重建容器挂同一个卷数据恢复2前端开发热更新Bind Mountdocker 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的基础也是构建更复杂应用的前提。内容要点回顾容器的生命周期管理创建、启动、运行、停止、删除容器的交互方式进入容器、查看日志、查看状态数据持久化的两种方式数据卷、绑定挂载