




























2026-04-16 11:31 xiashengwang 阅读(14) 评论() 收藏 举报
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 lsdocker volume inspect <卷名>docker volume rm <卷名>docker volume prune2.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 容器,使用命名卷存储数据库文件,验证删除容器后数据不丢失。
创建数据卷:
docker volume create mysql-data

运行 MySQL 容器(设置 root 密码,挂载卷):
docker run -d --name mysql-demo -e MYSQL_ROOT_PASSWORD=123456 -v mysql-data:/var/lib/mysql mysql:8.0
进入容器,创建测试数据库:
输入密码 123456,在 MySQL 命令行中执行:
CREATE DATABASE testdb;
SHOW DATABASES;
EXIT;
docker stop mysql-demo
docker rm mysql-demo

docker run -d --name mysql-demo2 -e MYSQL_ROOT_PASSWORD=123456 -v mysql-data:/var/lib/mysql mysql:8.0
docker exec -it mysql-demo2 mysql -p
输入密码,执行 SHOW DATABASES;,应该能看到 testdb。

docker stop mysql-demo2
docker rm mysql-demo2
docker volume rm mysql-data
任务 2:绑定挂载实现代码热加载
目标: 在本地修改代码,容器内自动同步,适合开发环境。
<h1>this is form bind Mount</h1>
docker run -d --name my-nginx2 -p 8082:80 -v D:\test\docker-demo\bind-volume:/usr/share/nginx/html nginx:1.28
访问 http://localhost:8082 ,看到刚才的页面。

修改本地的 index.html,例如改为 <h1>Updated content</h1>,保存文件。
刷新浏览器,内容立即改变(无需重启容器)。

清理:
docker stop my-nginx2
docker rm my-nginx2
任务 3:自定义网络与容器通信
目标:创建两个容器(一个 Web 应用,一个数据库),通过容器名通信。
docker network create app-network
docker run -d --name redis-server --network app-network redis:alpine
docker run -it --network app-network --rm redis:alpine redis-cli -h redis-server ping
预期输出 PONG,说明通过容器名 redis-server 成功连接。

# 假设你的 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 ,计数器应该能正常工作。
docker network inspect app-network
可以看到两个容器的 IP 和名称映射。

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

访问 http://localhost:8000 完成 WordPress 安装。安装过程中需要数据库信息,已经通过环境变量预设。
docker-compose down(不会删除卷)。再次 docker-compose up -d,刷新页面,之前的数据应该还在。

此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。