惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tenable Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
V
Vulnerabilities – Threatpost
G
GRAHAM CLULEY
Simon Willison's Weblog
Simon Willison's Weblog
C
CXSECURITY Database RSS Feed - CXSecurity.com
P
Privacy International News Feed
H
Heimdal Security Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Secure Thoughts
MyScale Blog
MyScale Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
V
Visual Studio Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
L
LINUX DO - 最新话题
D
Darknet – Hacking Tools, Hacker News & Cyber Security
The Cloudflare Blog
美团技术团队
Recorded Future
Recorded Future
T
Tailwind CSS Blog
Latest news
Latest news
Security Archives - TechRepublic
Security Archives - TechRepublic
Security Latest
Security Latest
Know Your Adversary
Know Your Adversary
Cloudbric
Cloudbric
Schneier on Security
Schneier on Security
I
Intezer
L
LINUX DO - 热门话题
P
Palo Alto Networks Blog
云风的 BLOG
云风的 BLOG
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
Attack and Defense Labs
Attack and Defense Labs
人人都是产品经理
人人都是产品经理
L
LangChain Blog
爱范儿
爱范儿
博客园 - 三生石上(FineUI控件)
博客园 - 叶小钗
L
Lohrmann on Cybersecurity
S
SegmentFault 最新的问题
W
WeLiveSecurity
C
Cybersecurity and Infrastructure Security Agency CISA
S
Securelist
SecWiki News
SecWiki News
V2EX - 技术
V2EX - 技术
IT之家
IT之家
Cyberwarzone
Cyberwarzone
F
Full Disclosure
Spread Privacy
Spread Privacy
阮一峰的网络日志
阮一峰的网络日志

博客园 - xiashengwang

Rocky Linux 9 安装docker Rocky Linux 9 与Centos区别,以及软件安装dnf命令 《Linux 基础点滴》:(17)SSH 密钥生成与管理 – 免密登录的利器 Linux服务器安全登录:从入门到实践 putty 基础 《Linux 基础点滴》:(16)firewalld 防火墙管理命令 《Linux 基础点滴》:(15)用户管理 – 创建、删除、权限与 sudo 《Linux 基础点滴》:(14)定时任务 – 用 crontab 自动化 《Linux 基础点滴》:(13)文本编辑入门 – 使用 Vim 《Linux 基础点滴》:(12)tldr – 简化版命令手册 《Linux 基础点滴》:(11)系统信息与资源监控 – 掌握服务器状态 《Linux 基础点滴》:(10)压缩与打包 – tar 的艺术 《Linux 基础点滴》:(9)查找与过滤 – find, grep, 管道 《Linux 基础点滴》:(8)网络基础 – 查看 IP、连通性与端口 《Linux 基础点滴》:(7)进程管理 – 查看与控制运行中的程序 《Linux 基础点滴》:(6)文件权限与所有者 – 保护你的文件 《Linux 基础点滴》:(5)文件与目录操作 – 增删改查必会命令 《Linux 基础点滴》:(4)磁盘空间查看 – df 和 du 的妙用 《Linux 基础点滴》:(3)Linux 文件系统概览 – 一切皆文件 《Linux 基础点滴》:(2)SSH 连接与基础命令 – 从登录到第一次操作 《Linux 基础点滴》:(1)初识 Linux 大家族 – 发行版分类与选择 docker学习(7)-docker compose 文件 docker学习(11)- 容器的日志(log) docker学习(10)-利用Github Action 自动化部署 docker学习(9)-Docker Swarm + Nginx 跨机器负载均衡 docker学习(8)-从 Windows 开发到 Linux 部署 学会 Git Tag,让版本管理不再混乱 docker学习(5)-Dockerfile docker学习(4)-Docker常用命令 docker学习(3)-一个简单的例子 docker学习(2)-安装 docker学习(1)-基本概念 Github 使用 Self-hosted Runner 实现服务器自动化部署 github创建分支 + Pull Request 合并 Git Rebase vs Git Merge:深入理解与实战选择 Git 系统学习教程:从零到团队协作 AI学习笔记(2)-OpenClaw安装 windbg分析dmp文件 docker desktop 和 Vmware冲突的解决办法
docker学习(6)-数据持久化与网络通信
xiashengwang · 2026-04-16 · via 博客园 - xiashengwang

2026-04-16 11:31  xiashengwang  阅读(14)  评论()    收藏  举报

一、学习目标

  • 掌握 Docker 数据卷(Volume)和绑定挂载(Bind Mount)的使用场景与操作方法
  • 理解 Docker 的网络模型(bridge、host、none、自定义网络)
  • 能够创建自定义网络,让多个容器通过容器名互相通信
  • 实现数据库等有状态服务的数据持久

二、核心知识点

2.1 数据持久化
Docker 容器默认是“无状态”的,容器删除后内部数据会丢失。数据卷和绑定挂载可以解决数据持久化问题。

类型 特点 适用场景 命令示例
Volume(数据卷) Docker 管理,存放在 Docker 存储目录(如 /var/lib/docker/volumes/ 生产环境、数据库、需要备份的数据 docker volume create myvol<br>docker run -v myvol:/data ...
Bind Mount(绑定挂载) 将宿主机任意目录挂载到容器 开发环境热加载、配置文件注入 docker run -v /host/path:/container/path ...
tmpfs 存于内存,容器停止后数据消失 临时缓存、敏感信息(不落盘) docker run --tmpfs /tmp ...

关键命令:

  • 创建卷:docker volume create <卷名>
  • 列出卷:docker volume ls
  • 查看卷详情:docker volume inspect <卷名>
  • 删除卷:docker volume rm <卷名>
  • 删除未使用的卷:docker volume prune

2.2 网络通信
Docker 容器需要相互通信,或者与宿主机、外部网络通信。默认网络模型是 bridge(桥接)。

常用网络驱动:
bridge: 默认,单机容器间通过 IP 或 link 通信(不推荐 link,推荐自定义网络)
host: 容器直接使用宿主机网络栈,性能好但端口冲突
none: 无网络,适用于不需要网络的容器
overlay: 跨主机通信(用于 Swarm/K8s,本阶段暂不涉及)

自定义桥接网络:
创建: docker network create <网络名>
列出: docker network ls
查看: docker network inspect <网络名>
删除: docker network rm <网络名>
将容器连接到网络: docker network connect <网络名> <容器名>
断开: docker network disconnect <网络名> <容器名>
优势: 在同一个自定义网络中,容器可以直接通过容器名互相访问(内置 DNS 解析),无需 link 或指定 IP。

三、实践任务

任务 1:数据卷持久化 MySQL 数据
目标: 启动 MySQL 容器,使用命名卷存储数据库文件,验证删除容器后数据不丢失。

  1. 创建数据卷:
    docker volume create mysql-data
    image

  2. 运行 MySQL 容器(设置 root 密码,挂载卷):
    docker run -d --name mysql-demo -e MYSQL_ROOT_PASSWORD=123456 -v mysql-data:/var/lib/mysql mysql:8.0

  3. 进入容器,创建测试数据库:
    输入密码 123456,在 MySQL 命令行中执行:

CREATE DATABASE testdb;
SHOW DATABASES;
EXIT;
  1. 停止并删除 MySQL 容器:
docker stop mysql-demo
docker rm mysql-demo

image

  1. 启动一个新 MySQL 容器,使用同一个卷:
 docker run -d --name mysql-demo2 -e MYSQL_ROOT_PASSWORD=123456 -v mysql-data:/var/lib/mysql mysql:8.0
  1. 进入新容器,检查数据库是否存在:
docker exec -it mysql-demo2 mysql -p

输入密码,执行 SHOW DATABASES;,应该能看到 testdb
image

  1. 清理(可选)
docker stop mysql-demo2
docker rm mysql-demo2
docker volume rm mysql-data

任务 2:绑定挂载实现代码热加载
目标: 在本地修改代码,容器内自动同步,适合开发环境。

  1. 在本地创建一个目录,例如 D:\docker-bind\app,并在其中创建 index.html
<h1>this is form bind Mount</h1>
  1. 运行 Nginx 容器,将本地目录挂载到 /usr/share/nginx/html:
 docker run -d --name my-nginx2 -p 8082:80 -v D:\test\docker-demo\bind-volume:/usr/share/nginx/html nginx:1.28
  1. 访问 http://localhost:8082 ,看到刚才的页面。
    image

  2. 修改本地的 index.html,例如改为 <h1>Updated content</h1>,保存文件。

  3. 刷新浏览器,内容立即改变(无需重启容器)。
    image

  4. 清理:

docker stop my-nginx2
docker rm my-nginx2

任务 3:自定义网络与容器通信
目标:创建两个容器(一个 Web 应用,一个数据库),通过容器名通信。

  1. 创建自定义网络:
 docker network create app-network
  1. 运行 Redis 容器,连接到该网络,容器名为 redis-server:
 docker run -d --name redis-server --network app-network redis:alpine
  1. 运行一个简单的 Python 应用(使用 redis 镜像自带的 redis-cli 测试,或者用上一阶段你的 Flask 应用)。这里用 redis-cli 演示:
docker run -it --network app-network --rm redis:alpine redis-cli -h redis-server ping

预期输出 PONG,说明通过容器名 redis-server 成功连接。
image

  1. 可选)启动你的 Flask 应用(需要先构建镜像,然后指定网络和环境变量):
# 假设你的 Flask 镜像名为 my-flask-app
docker run -d --name web --network app-network -p 5000:5000 -e REDIS_HOST=redis-server my-flask-app

访问 http://localhost:5000 ,计数器应该能正常工作。

  1. 查看网络详情:
docker network inspect app-network

可以看到两个容器的 IP 和名称映射。
image

  1. 清理:
docker stop redis-server web
docker rm redis-server web
docker network rm app-network

任务 4:综合练习 - 使用 Docker Compose 实现数据卷 + 自定义网络
这个任务将你之前学过的 Compose 与数据持久化、网络结合起来。

创建一个 docker-compose.yml,定义两个服务:WordPress + MySQL,使用卷持久化数据,并通过 Compose 自动创建网络。

services:
  db:
    image: mysql:8.0
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    restart: always
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - "8000:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wordpress_data:/var/www/html
    restart: always

volumes:
  db_data:
  wordpress_data:

启动:

docker-compose up -d

image

访问 http://localhost:8000 完成 WordPress 安装。安装过程中需要数据库信息,已经通过环境变量预设。

  • 验证数据持久化:
  • 创建一个 WordPress 站点,发布一篇文章。
  • 执行 docker-compose down(不会删除卷)。

再次 docker-compose up -d,刷新页面,之前的数据应该还在。
image