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

推荐订阅源

人人都是产品经理
人人都是产品经理
Microsoft Azure Blog
Microsoft Azure Blog
V
V2EX
阮一峰的网络日志
阮一峰的网络日志
宝玉的分享
宝玉的分享
Hugging Face - Blog
Hugging Face - Blog
Y
Y Combinator Blog
Recorded Future
Recorded Future
博客园 - Franky
F
Fortinet All Blogs
The Register - Security
The Register - Security
雷峰网
雷峰网
博客园 - 【当耐特】
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
WordPress大学
WordPress大学
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Recent Announcements
Recent Announcements
S
Schneier on Security
Latest news
Latest news
S
Securelist
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Blog — PlanetScale
Blog — PlanetScale
L
Lohrmann on Cybersecurity
V
Visual Studio Blog
NISL@THU
NISL@THU
Cyberwarzone
Cyberwarzone
H
Hackread – Cybersecurity News, Data Breaches, AI and More
腾讯CDC
Spread Privacy
Spread Privacy
酷 壳 – CoolShell
酷 壳 – CoolShell
Security Latest
Security Latest
A
About on SuperTechFans
大猫的无限游戏
大猫的无限游戏
SecWiki News
SecWiki News
N
News and Events Feed by Topic
T
Threatpost
The GitHub Blog
The GitHub Blog
博客园_首页
F
Full Disclosure
爱范儿
爱范儿
The Hacker News
The Hacker News
T
The Blog of Author Tim Ferriss
Stack Overflow Blog
Stack Overflow Blog
Last Week in AI
Last Week in AI
月光博客
月光博客
C
Check Point Blog
G
Google Developers Blog
M
MIT News - Artificial intelligence
博客园 - 司徒正美

博客园 - 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