当前位置:首页 > 技术 > 正文内容

容器数据卷管理与自定义镜像发布实践

访客 技术 2026年6月8日 1

容器数据持久化与共享机制

Docker 的核心理念是将应用及其运行环境打包为镜像,但容器内部的数据在容器销毁后会丢失。为实现数据持久化,需将数据存储于容器外部的宿主机文件系统中。通过数据卷(Volume)技术,可实现容器间的数据共享与同步。

数据卷本质上是一种目录挂载机制,将容器内的指定路径映射到宿主机的物理路径上,从而保证即使容器被删除或重启,数据依然保留。

挂载方式一:命令行直接挂载

使用 -v 参数进行挂载,语法如下:

docker run -it -v <宿主机路径>:<容器内路径> <镜像名>

示例:将本地 /home/ceshi 挂载至容器内的 /home 目录:

docker run -it --name centos01 -v /home/ceshi:/home centos:7 /bin/bash

在此容器中任意增删文件,宿主机目录会实时同步。容器停止后,宿主机上的数据修改仍可在容器重启时生效,支持双向同步。

挂载类型包括:

  • 匿名挂载:`-v /container/path` —— 宿主机路径由 Docker 自动分配
  • 具名挂载:`-v volume_name:/container/path` —— 为卷命名便于管理
  • 权限控制:可在路径后添加 :ro(只读)或 :rw(读写)限制访问权限
  • 指定路径挂载:`-v /host/path:/container/path` —— 显式绑定路径

实战:MySQL 数据持久化部署

配置 MySQL 容器并挂载数据目录和配置文件:

docker run -d \
  -v /home/mysql/conf:/etc/mysql/conf.d \
  -v /home/mysql/data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=root \
  --name mysql03 \
  mysql:5.7

可通过 Navicat 等工具连接 localhost:3306 验证数据库是否正常创建,并确认数据已持久化至宿主机。

具名与匿名卷管理

匿名卷生成的名称为随机字符串,不利于后期维护。建议使用具名挂载:

docker run -d --name tomcat02 -v my_volume:/etc/nginx nginx

查看卷的具体路径:

docker volume inspect my_volume

输出将显示该卷在宿主机中的实际位置。

方式二:通过 Dockerfile 实现挂载

在构建镜像时定义数据卷,使用 VOLUME 指令:

FROM mysql
VOLUME ["/volume01", "/volume02"]
CMD echo "---end---"
CMD /bin/bash

构建镜像:

docker build -f /home/myvolume/dockerfile1 -t sxf/mysql:1.0 .

启动容器后进入,使用 ls -l 可见两个挂载点。在这些目录中创建文件,再通过 docker inspect <container_id> 查看其对应宿主机路径,验证数据同步。

容器间数据共享:基于 Volume-From

通过 --volumes-from 实现容器之间的数据继承:

docker run --name parent_container -v /data:/shared_data centos:7
docker run -it --name child_container --volumes-from parent_container centos:7

子容器会继承父容器的所有数据卷。只要任一容器仍在使用数据,即使其他容器被删除,数据依然有效。

多实例共享场景示例:

docker run --name mysql01 -e MYSQL_ROOT_PASSWORD=root -d -p 8080:3306 -v /data/mysql:/var/lib/mysql mysql:5.7
docker run --name mysql02 -e MYSQL_ROOT_PASSWORD=root -d -p 8081:3306 --volumes-from mysql01 mysql:5.7

两个 MySQL 实例共享同一数据卷,实现数据一致性。

Dockerfile 构建自定义镜像

Dockerfile 是用于自动化构建镜像的脚本文件,遵循以下流程:

  1. 编写 Dockerfile
  2. 使用 docker build 构建镜像
  3. 使用 docker run 启动容器
  4. 使用 docker push 发布镜像

Dockerfile 常用指令说明

指令功能备注
FROM指定基础镜像必须第一行
MAINTAINER作者信息已弃用,推荐使用 LABEL
RUN构建时执行命令支持 shell 形式或 JSON 数组形式
COPY复制文件到镜像类似 docker cp
ADD复制文件并自动解压或处理 URL优于 COPY,但安全性略低
WORKDIR设置工作目录可多次使用,相对路径基于前一个
VOLUME声明数据卷构建时定义,运行时通过 -v 映射
EXPOSE暴露端口仅文档作用,不实际开放
CMD容器启动默认命令可被 docker run 覆盖
ENTRYPOINT容器启动执行的主命令配合 CMD 可传参
ONBUILD被继承时触发的命令用于构建链
USER指定运行用户避免以 root 运行
ENV设置环境变量ENV MYPATH /home/app

CMD 与 ENTRYPOINT 协同使用

当两者同时存在时:

  • ENTRYPOINT 为非 JSON 格式,则 CMD 无效,仅使用 ENTRYPOINT 命令
  • ENTRYPOINT 为 JSON 数组格式,CMD 将作为参数拼接:
ENTRYPOINT ["nginx", "-c"]
CMD ["/etc/nginx/nginx.conf"]

最终等价于:nginx -c /etc/nginx/nginx.conf

自定义镜像实践

案例1:定制 CentOS 镜像

FROM centos
MAINTAINER YOUNG111@COM
ENV MYPATH /home/local
WORKDIR $MYPATH
RUN yum -y install vim net-tools
EXPOSE 8080
CMD echo $MYPATH
CMD echo "end-----"
CMD /bin/bash

构建命令:

docker build -f /home/dockerfile -t mycentos:1.0 .

案例2:自动创建测试文件

FROM centos
MAINTAINER sxf
ENV MYPTH /home/test
RUN mkdir $MYPTH
RUN touch $MYPTH/test.txt
RUN yum -y install vim net-tools

案例3:构建 Tomcat 镜像(含 JDK)

FROM centos
MAINTAINER sxf
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u11-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.22.tar.gz /usr/local/
RUN yum -y install vim net-tools
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/logs/catalina.out

运行容器:

docker run -d -p 9090:8080 --name sxf \
  -v /home/sxf/build/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test \
  -v /home/sxf/build/tomcat/tomcatlogs:/usr/local/apache-tomcat-9.0.22/logs \
  <image_id>

在宿主机的 test 目录中添加 JSP 和 XML 文件,即可通过浏览器访问 http://localhost:9090/test 测试服务。

镜像发布策略

发布至 Docker Hub

  1. 注册 Docker Hub 账号
  2. 登录本地 Docker 客户端:
  3. docker login -u <username>
  4. 打标签并推送:
  5. docker tag <image_id> <username>/<repo_name>:<tag>
    docker push <username>/<repo_name>:<tag>

发布至阿里云容器镜像仓库

  1. 在阿里云创建镜像仓库与命名空间
  2. 按指引操作:
  3. docker tag <image_id> registry.cn-hangzhou.aliyuncs.com/<your_namespace>/<repo_name>:<version>
    docker login --username=your_account registry.cn-hangzhou.aliyuncs.com
    docker push registry.cn-hangzhou.aliyuncs.com/<your_namespace>/<repo_name>:<version>

私有镜像仓库搭建(Registry)

  1. 拉取 Registry 镜像:
  2. docker pull registry
  3. 运行私有仓库:
  4. docker run -d -p 5000:5000 \
      -v /opt/registry:/var/lib/registry \
      --privileged=true \
      registry
  5. 提交镜像至私仓:
  6. docker commit -m "Add web app" -a "admin" <container_id> myapp:v1.0
  7. 打标签并推送:
  8. docker tag myapp:v1.0 localhost:5000/myapp:v1.0
    docker push localhost:5000/myapp:v1.0
  9. 验证推送结果:
  10. curl -XGET http://localhost:5000/v2/_catalog

注意:Docker 默认禁止向非 HTTPS 仓库推送。需在 /etc/docker/daemon.json 中添加:

{
  "registry-mirrors": ["https://mirror.example.com"],
  "insecure-registries": ["localhost:5000"]
}

修改后重启 Docker 服务以生效。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。