搜索结果

×

搜索结果将在这里显示。

🚗 03-Docker数据持久化及网络模式介绍

一、Docker 容器数据管理(数据卷 Volume)

1. 什么是数据卷

数据卷是宿主机上特殊目录,绕过镜像联合文件系统(UFS),用于容器永久持久化存储

  • 生命周期独立于容器:删除容器不会自动删除数据卷

  • 支持多个容器同时挂载、共享同一份数据

2. 数据卷五大核心特点

  1. 容器初始化挂载时,镜像挂载点原有数据会自动复制到数据卷

  2. 多容器可共享、复用同一个数据卷

  3. 宿主机 / 容器内可直接修改卷内文件

  4. 数据卷修改不会更新镜像本身

  5. 容器删除,数据卷依然保留,不会丢失数据

3. 数据卷基础使用方式

方式 1:run 命令直接挂载宿主机目录(-v)

语法:docker run -v 宿主机目录:容器内目录 镜像名

# 后台启动容器,挂载宿主机 ~/datavolume 到容器 /data
docker run --name volume -v ~/datavolume:/data -itd centos /bin/bash

效果:宿主机目录与容器目录文件双向实时同步。

只读挂载(:ro)

容器内仅可读,仅宿主机可修改文件

docker run --name volume1 -v ~/datavolume1:/data:ro -itd centos /bin/bash

方式 2:Dockerfile 声明匿名数据卷 VOLUME

Dockerfile 指令 VOLUME ["目录1","目录2"],构建镜像时定义挂载点,启动容器自动生成匿名卷。

  1. 编写 Dockerfile
FROM centos
# 声明两个数据卷目录
VOLUME ["/datavolume3","/datavolume6"]
CMD /bin/bash
  1. 构建镜像
docker build -t="volume" .
  1. 启动容器
docker run --name volume-dubble -it volume

容器内自动生成 /datavolume3/datavolume6 两个持久化目录。

二、数据卷容器(多容器共享数据)

1. 概念

专门挂载数据卷的容器称为数据卷容器,其他容器通过 --volumes-from 挂载该容器,实现多容器数据共享。

2. 实操示例

  1. 启动数据卷容器(基于上面带 VOLUME 的 volume 镜像)
docker run --name data-volume -itd volume
# 进入容器创建测试文件
docker exec -it data-volume /bin/bash
touch /datavolume6/lucky.txt
exit
  1. 新容器挂载数据卷容器,共享数据
# --volumes-from 指定要共享的容器名称
docker run --name data-volume2 --volumes-from data-volume -itd centos /bin/bash
  1. 验证共享
docker exec -it data-volume2 /bin/bash
cd /datavolume6
# 可查看到上一个容器创建的 lucky.txt
ls

三、数据卷备份与还原

1. 数据卷备份

原理:临时容器同时挂载数据卷容器 + 宿主机备份目录,使用 tar 打包卷内文件到宿主机。
语法:

docker run --volumes-from 数据卷容器名 -v 宿主机备份目录:/backup 镜像 tar czvf /backup/压缩包名 容器卷目录

示例:

docker run --volumes-from data-volume2 -v /root/backup:/backup --name datavolume-copy centos tar zcvf /backup/data-volume2.tar.gz /datavolume6

执行后宿主机 /root/backup 生成备份压缩包。

2. 数据卷还原

  1. 先删除容器内测试文件模拟数据丢失
docker exec -it data-volume2 /bin/bash
rm -rf /datavolume6/lucky.txt
exit
  1. 解压备份文件还原数据
docker run --volumes-from data-volume2 -v /root/backup/:/backup centos tar zxvf /backup/data-volume2.tar.gz -C /datavolume6
  1. 重新进入容器查看,文件恢复
docker exec -it data-volume2 /bin/bash
cd /datavolume6
ls

四、Docker 容器网络基础与互联

1. Docker 四大网络模式

使用 --net 参数指定,四种模式:

  1. bridge:网桥模式,默认网络

  2. host:宿主机网络模式,共享宿主机网卡

  3. none:无网络,仅本地回环 lo

  4. container:共享其他容器网络命名空间

2. Docker 网络底层基础

  1. docker0 虚拟网桥
    Docker 安装后自动创建,IP 默认 172.17.0.1/16,所有 bridge 模式容器默认接入该网桥。

  2. veth 设备对
    每启动一个容器生成一对虚拟网卡:一端在容器内 eth0,一端挂载到宿主机 docker0 网桥,实现容器与宿主机互通。

  3. 网桥管理工具

# 安装网桥工具
yum install bridge-utils -y
# 查看网桥及挂载容器
brctl show

3. 容器直接互通(通过 IP 访问)

前置:构建测试镜像

cd dockerfile/inter-image
vim dockerfile
FROM centos
RUN rm -rf /etc/yum.repos.d/*
COPY Centos-vault-8.5.2111.repo /etc/yum.repos.d/
RUN yum install wget -y
RUN yum install nginx -y
# RUN sed -i "7s/^/#/g" /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD /bin/bash

构建镜像:

docker build -t="inter-image" .

实操:IP 互通

# 启动容器test1
docker run --name test1 -itd inter-image
# 进入容器启动nginx
docker exec -it test1 /bin/bash
/usr/sbin/nginx
exit

# 启动容器test2
docker run --name test2 -itd inter-image

# 进入test2 ping test1容器IP
docker exec -it test2 /bin/bash
ping 172.17.0.20
curl http://172.17.0.20

缺点:容器重启 IP 会变化,无法固定访问地址。

4. --link 容器别名访问(解决 IP 变动问题)

语法:--link=容器名:自定义别名

# 1. 启动基础容器test3
docker run --name test3 -itd inter-image /bin/bash

# 2. 创建test5,关联test3并设置别名webtest
docker run --name test5 -itd --link=test3:webtest inter-image /bin/bash

# 3. 重启test3,IP会变更
docker restart test3

# 4. 在test5内通过别名访问,不受IP变化影响
docker exec -it test5 /bin/bash
ping webtest

五、四大网络模式详细讲解

1. none 无网络模式

容器仅拥有本地回环网卡 lo,无外网、无容器互通能力,适合完全隔离场景。

# 创建none模式容器
docker run -itd --name none --net=none --privileged=true centos
# 查看网卡,只有lo
docker exec -it none /bin/bash
ip addr

2. container 共享容器网络模式

新容器复用已有容器的 Network Namespace,共用 IP、端口,无独立网卡。

# 新容器共享上面none容器的网络
docker run --name container2 --net=container:none -it --privileged=true centos
# 查看网卡,和none容器完全一致,仅lo网卡
docker exec -it container2 /bin/bash
ip addr

3. bridge 网桥模式(默认)

Docker 默认网络,容器独立 IP,接入 docker0 网桥,容器间、容器与宿主机可互通,端口映射依赖该模式。

# 默认bridge模式,无需指定--net
docker run --name bridge -it --privileged=true centos bash
# 查看网卡,拥有独立eth0,172.17.x.x网段
ip addr

4. host 宿主机网络模式

容器不创建独立虚拟网卡,直接使用宿主机物理网卡、IP、端口,性能最高,端口不能重复占用。

# 指定host网络
docker run --name host -it --net=host --privileged=true centos bash
# ip addr查看,网卡和宿主机完全一致
ip addr