Docker 进阶:数据持久化与容器网络互联(数据卷、挂载目录、端口映射、自定义网络)

前言

前面我们学习了 Docker 三大核心组件与基础操作命令,本文重点讲解 Docker 两大核心进阶知识点数据持久化方案容器网络互联。解决容器删除数据丢失、外部访问容器、多容器通信等实际生产问题,包含数据卷、宿主机目录挂载、端口映射、自定义网络完整实操,可直接落地使用。

一、Docker 数据持久化

1.1 为什么需要数据持久化

默认情况下,容器的数据全部保存在可读写容器层容器删除 → 容器层销毁 → 数据直接丢失。为了实现数据永久保存,Docker 提供两种主流持久化方案:

  1. 数据卷(Volumes):Docker 官方推荐,由 Docker 统一管理
  2. 挂载宿主机目录(Bind mounts):直接映射宿主机目录 / 文件

1.2 两种持久化方案对比

方式 存储位置 管理权限 安全性 适用场景
数据卷 Volumes 宿主机固定目录/var/lib/docker/volumes/ 仅 Docker 进程管理 高,隔离系统文件 容器数据持久化、生产环境首选
挂载目录 Bind mounts 宿主机任意目录 / 文件 宿主机进程可修改 低,可篡改系统文件 配置文件共享、代码热更新

2、数据卷(Volumes)实操

2.1 数据卷核心特性

  • 数据修改实时生效
  • 数据更新不影响镜像
  • 生命周期独立于容器,容器删除数据卷默认保留

2.2 数据卷基础命令

复制代码
# 1. 创建数据卷
docker volume create my-vol

# 2. 查看所有数据卷
docker volume ls

# 3. 查看数据卷详细信息(存储路径、挂载点)
docker volume inspect my-vol

# 4. 清理无主数据卷(无容器引用)
docker volume prune

2.3 挂载数据卷到容器(-v--mount

Docker 提供两种挂载参数,推荐使用--mount,语义清晰、易维护

两种参数区别
  1. -v / --volume :用:分隔,顺序固定,适用于简单场景
    • 格式:卷名:容器内路径:权限
  2. --mount :键值对格式,支持详细配置,Docker17.06 + 通用
    • 常用参数:type=volumesource=卷名target=容器路径readonly
实操示例
复制代码
# 方式1:--mount 挂载数据卷(推荐)
docker run -d -P \
    --name web \
    --mount source=my-vol,target=/opt/webapp \
    training/webapp python app.py

# 方式2:-v 挂载数据卷
docker run -d -P --name web -v my-vol:/opt/webapp training/webapp python app.py

# 查看容器挂载信息
docker inspect web

2.4 删除容器时同步删除数据卷

数据卷默认不会随容器删除,如需同步清理:

复制代码
docker rm -v 容器ID

3、挂载宿主机目录(Bind mounts)

3.1 核心特点

  • 直接将宿主机目录 / 文件映射到容器内
  • 宿主机进程可直接修改容器内数据,存在安全风险
  • 挂载规则:宿主机目录永远覆盖容器内目录

3.2 实操命令

复制代码
# --mount 挂载宿主机目录
docker run -d -P \
    --name web1 \
    --mount type=bind,source=/src/webapp1,target=/opt/webapp \
    training/webapp python app.py

# -v 简写方式
docker run -d -P --name web1 -v /src/webapp1:/opt/webapp training/webapp python app.py

3.3 只读挂载 + 挂载单个文件

1)只读挂载

容器内无法修改挂载目录数据,防止误操作:

复制代码
docker run -d -P \
--mount type=bind,source=/data/dockershell/pydata,target=/opt/webapp,readonly \
training/webapp python app.py
2)挂载单个文件

常用于同步配置文件、命令历史等:

复制代码
# 同步宿主机bash历史到容器
docker run --rm -it \
--mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history \
centos:7.9.2009 bash

3.4 数据覆盖规则(避坑重点)

  1. 数据卷
    • 空数据卷挂载到容器非空目录:容器内文件复制到数据卷
    • 非空数据卷挂载:数据卷内容覆盖容器内原有数据
  2. Bind 挂载
    • 宿主机目录永远直接覆盖容器内对应目录数据

3.5 生产案例:Prometheus 挂载

方案 1:挂载宿主机目录(配置文件持久化)
复制代码
docker run --name prometheus -d -p 9090:9090 \
-v /data/prometheus/conf/prometheus.yml:/etc/prometheus/prometheus.yml \
-v /data/prometheus/data:/prometheus \
prom/prometheus:v2.53.4
方案 2:使用数据卷(数据持久化)
复制代码
docker run --name prometheus -d -p 9090:9090 \
-v /data/prometheus/conf/prometheus.yml:/etc/prometheus/prometheus.yml \
-v prometheus1:/prometheus \
prom/prometheus:v2.53.4

二、Docker 容器网络与互联

Docker 网络解决两个核心问题:外部访问容器容器之间互相通信

4.1 外部访问容器:端口映射

容器默认隔离网络,外部无法访问,通过-P/-p实现端口映射。

1)-P:随机端口映射

Docker 自动随机分配宿主机端口,映射容器开放端口:

复制代码
# 后台运行web容器,随机端口映射
docker run -d -P training/webapp python app.py

# 查看端口映射
docker ps -l
# 查看详细端口
docker port 容器ID
2)-p:指定端口映射(生产常用)

支持 4 种格式:

  • hostPort:containerPort:宿主机端口:容器端口

  • ip:hostPort:containerPort:指定 IP + 端口映射

  • ip::containerPort:指定 IP,随机宿主机端口

  • 支持 UDP 协议、多端口映射

    宿主机5000 → 容器5000

    docker run -d -p 5000:5000 training/webapp python app.py

    绑定指定IP

    docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py

    UDP端口映射

    docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

    多端口映射

    docker run -d -p 6000:5000 -p 3000:80 training/webapp python app.py


4.2 容器互联:自定义网桥网络(推荐)

废弃旧的--link参数,生产环境统一使用自定义 bridge 网络,实现 DNS 自动解析、容器名称互通。

创建自定义网桥

复制代码
# 创建桥接网络 mynet
docker network create -d bridge mynet

容器加入自定义网络

复制代码
# 终端1:运行busybox1,加入mynet网络
docker run -it --rm --name busybox1 --network mynet busybox sh

# 终端2:运行busybox2,加入mynet网络
docker run -it --rm --name busybox2 --network mynet busybox sh

容器互相通信busybox1内直接 ping 容器名busybox2,可直接连通,实现容器互联。

多容器复杂互联场景,推荐使用 Docker Compose 一键编排。


三、总结

  1. 数据持久化
    • 容器默认数据在可读写层,删除即丢失;
    • 生产首选数据卷 Volumes ,安全隔离;简单配置共享用Bind 挂载
    • 挂载核心坑:宿主机目录会覆盖容器内目录,注意文件丢失。
  2. 网络互联
    • 外部访问:-p指定端口映射,优先固定端口;
    • 容器互通:自定义 bridge 网络 ,替代--link,支持容器名 DNS 解析;
    • 多容器编排:使用 Docker Compose 统一管理。
相关推荐
qq_白羊座1 小时前
CI/CD 与 DevOps 二
运维·ci/cd·devops
IT策士1 小时前
Docker 从 0 到 1 再到 Kubernetes 实战:第6篇 容器生命周期管理
docker·容器·kubernetes
zhz52141 小时前
Docker 部署 MongoDB / MySQL / PostgreSQL 安全加固实录:TLS 双向认证、双因素鉴别与审计
mysql·mongodb·docker·postgresql·等保
Ms_lan1 小时前
同方工业携手桂花网:广州某养老院智慧健康监测实践案例
运维·服务器·网络
sailing-data1 小时前
【OS zephyr】make与cmake
linux·运维·服务器
❀搜不到1 小时前
ubuntu 更新cmake
linux·运维·ubuntu
Mr_pyx1 小时前
TypeScript 完全入门指南:从基础到项目配置
linux·运维·ubuntu
中议视控1 小时前
网络中控主机控制电脑开关机:开机可以利用网络唤醒和通电自启,Windows关机利用OY-PWCC关机软件,国产麒麟统信等操作系统利用OY-PCI开关机控制卡
网络·windows·电脑
志栋智能1 小时前
安全超自动化如何支持业务快速安全地创新?
运维·安全·自动化