Docker文件数据卷实战:挂载与优化

在本篇博客文章中,我们将探讨如何使用 Docker 的文件数据卷来实现数据持久化。通过数据卷,我们可以在容器重启或删除后仍然保留重要数据,这对于数据库、日志文件等需要长期保存的数据尤为重要。

什么是 Docker 数据卷?

Docker 数据卷是一种特殊的目录,它可以绕过联合文件系统(Union File System),直接存在于宿主机的文件系统上。数据卷提供了几种重要的特性:

  • 数据持久性:即使创建它的容器已经停止或被删除,数据卷中的数据依然存在。
  • 共享和重用:多个容器可以同时挂载同一个数据卷,从而实现数据共享。
  • 独立于更新:更改数据卷不会影响镜像的更新和维护过程。

实战案例:文件数据卷

文件挂载用于很少更改文件内容的场景,比如:nginx 的配置文件、tomcat的配置文件等。
准备相关文件

bash 复制代码
[root@ubuntu2404 ~]#mkdir /data/{bin,testapp,logs} -p
[root@ubuntu2404 ~]#echo testapp v1 > /data/testapp/index.html
[root@ubuntu2404 ~]#cat /data/testapp/index.html 
testapp v1
[root@ubuntu2404 ~]#docker pull tomcat:jre21
[root@ubuntu2404 ~]#docker run -it -d tomcat:jre21 
[root@ubuntu2404 ~]#docker cp vigorous_shirley:/usr/local/tomcat/bin/catalina.sh /data/bin/
Successfully copied 23kB to /data/bin/
[root@ubuntu2404 ~]#vim /data/bin/catalina.sh
#加下面tomcat的优化参数行
JAVA_OPTS="-server \
        -Xms4g -Xmx4g \
        -Xss512k \
        -XX:MaxTenuringThreshold=10 \
        -XX:+UseG1GC \
        -XX:MaxGCPauseMillis=200 \
        -XX:G1HeapRegionSize=16m \
        -XX:InitiatingHeapOccupancyPercent=65 \
        -XX:+ExplicitGCInvokesConcurrent \
        -XX:+HeapDumpOnOutOfMemoryError \
        -XX:HeapDumpPath=/usr/local/tomcat/logs/heapdump.hprof \
        -Djava.awt.headless=true"

# OS specific support.  $var _must_ be set to either true or false.
[root@ubuntu2404 ~]#chown 2019:2019 /data/bin/catalina.sh 
[root@ubuntu2404 ~]#ll /data/bin/catalina.sh 
-rwxr-xr-x 1 2019 2019 21723 Aug  8 22:19 /data/bin/catalina.sh*
[root@ubuntu2404 ~]#chown 2019:2019 /data/logs/

引用文件数据卷启动容器

同时挂载可读可写方式的目录数据卷和只读方式的文件数据卷,实现三个数据卷的挂载,数据,日志和启动脚本。

bash 复制代码
[root@ubuntu2404 ~]#docker run -d -it --name tomcat -v /data/bin/catalina.sh:/usr/local/tomcat/bin/catalina.sh:ro -v /data/testapp:/usr/local/tomcat/webapps/testapp -v /data/logs:/usr/local/tomcat/logs -p 8080:8080 tomcat:jre21

验证容器可以访问

bash 复制代码
[root@ubuntu2404 ~]#curl 127.0.0.1:8080/testapp/
testapp v1
[root@ubuntu2404 ~]#ls -l /data/logs/
total 20
-rw-r----- 1 root root 13201 Aug  8 23:02 catalina.2025-08-08.log
-rw-r----- 1 root root  1870 Aug  8 23:03 localhost_access_log.2025-08-08.txt

直接修改宿主机的数据

bash 复制代码
#宿主机修改目录数据卷
[root@ubuntu2404 ~]#echo testapp v2 > /data/testapp/index.html
[root@ubuntu2404 ~]#curl 127.0.0.1:8080/testapp/
testapp v2
[root@ubuntu2404 ~]#ll /data/bin/catalina.sh 
-rwxr-xr-x 1 2019 2019 21528 Aug  8 22:55 /data/bin/catalina.sh*
[root@ubuntu2404 ~]#echo >> /data/bin/catalina.sh
[root@ubuntu2404 ~]#ll /data/bin/catalina.sh 
-rwxr-xr-x 1 2019 2019 21529 Aug  8 23:05 /data/bin/catalina.sh*

进入容器修改数据

bash 复制代码
#文件数据卷上的文件为只读
[root@ubuntu2404 ~]#docker exec -it tomcat bash
root@48db3430335c:/usr/local/tomcat# echo >> bin/catalina.sh 
bash: bin/catalina.sh: Read-only file system
root@48db3430335c:/usr/local/tomcat# cat webapps/testapp/index.html 
testapp v2
root@48db3430335c:/usr/local/tomcat# echo testapp v3 >webapps/testapp/index.html 
root@48db3430335c:/usr/local/tomcat# cat webapps/testapp/index.html 
testapp v3

[root@ubuntu2404 ~]#curl 127.0.0.1:8080/testapp/
testapp v3

查看容器中挂载和进程信息

bash 复制代码
root@48db3430335c:/# mount
......
/dev/mapper/ubuntu--vg-ubuntu--lv on /usr/local/tomcat/bin/catalina.sh type ext4 (ro,relatime)
/dev/mapper/ubuntu--vg-ubuntu--lv on /usr/local/tomcat/webapps/testapp type ext4 (rw,relatime)
......
root@48db3430335c:/# df
Filesystem                        1K-blocks    Used Available Use% Mounted on
overlay                           101590008 8197604  88185776   9% /
tmpfs                                 65536       0     65536   0% /dev
shm                                   65536       0     65536   0% /dev/shm
/dev/mapper/ubuntu--vg-ubuntu--lv 101590008 8197604  88185776   9% /etc/hosts
tmpfs                                983036       0    983036   0% /proc/asound
tmpfs                                983036       0    983036   0% /proc/acpi
tmpfs                                983036       0    983036   0% /proc/scsi
tmpfs                                983036       0    983036   0% /sys/firmware
root@48db3430335c:/# ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.5  6.9 6832420 137524 pts/0  Ssl+ 15:02   0:03 /opt/java/openjdk/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/c
root          73  0.0  0.2   7604  4224 pts/1    Ss   15:11   0:00 bash
root          85  0.0  0.2  10880  4480 pts/1    R+   15:13   0:00 ps aux
root@48db3430335c:/# ps aux|grep java
root           1  0.5  6.9 6832420 137524 pts/0  Ssl+ 15:02   0:03 /opt/java/openjdk/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xms4g -Xmx4g -Xss512k -XX:MaxTenuringThreshold=10 -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1HeapRegionSize=16m -XX:InitiatingHeapOccupancyPercent=65 -XX:+ExplicitGCInvokesConcurrent -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/tomcat/logs/heapdump.hprof -Djava.awt.headless=true -Djdk.tls.ephemeralDHKeySize=2048 -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED --enable-native-access=ALL-UNNAMED -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
root          87  0.0  0.1   6544  2304 pts/1    S+   15:13   0:00 grep --color=auto java
root@48db3430335c:/# 

结论

通过使用 Docker 数据卷,我们可以轻松地实现数据的持久化和共享,这对于我们管理应用数据至关重要。无论你是运行数据库服务还是存储应用程序的日志文件,数据卷都提供了一种简单而有效的方法来确保数据安全性和可访问性。希望这篇实战指南能帮助你在项目中更好地利用 Docker 数据卷。尝试一下,并探索更多关于 Docker 数据管理的可能性吧!

相关推荐
愈努力俞幸运2 小时前
f12网络教程 客户端 服务端 服务器前端 后端
运维·服务器
未定义.2212 小时前
第3篇:UI自动化核心操作:输入、点击、弹窗、下拉框全场景实战
运维·python·ui·自动化·jenkins·集成测试·pytest
释怀不想释怀2 小时前
Zabbix(安装模式)
运维·云原生·zabbix
linweidong2 小时前
AUTOSAR如何自动化生成BSW、RTE、AP模块并进行一致性校验?
运维·实时互动·自动化
大佐不会说日语~2 小时前
Docker部署旧版本系统MySQL5.7+乱码问题解决方案
运维·docker·容器
YongCheng_Liang2 小时前
数据库核心概念深度解析:从基础原理到 SQL 分类
运维·数据库·sql
宇钶宇夕2 小时前
CoDeSys入门实战一起学习(六):CoDeSys软件模型核心架构——从分层结构到核心元素
运维·自动化
Web极客码2 小时前
如何在 WordPress 中设置会员内容:简单两步实现注册用户专属访问
运维·wordpress·网站管理·网站维护
林鸿风采2 小时前
Alpine Linux 安装指南:轻量、安全、高效的系统部署实践
linux·运维·安全·alpine