在本篇博客文章中,我们将探讨如何使用 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 数据管理的可能性吧!