默认情况下,在运行中的容器里创建的文件,被保存在一个可写的容器层:
-
如果容器被删除了,则数据也没有了
-
这个可写的容器层是和特定的容器绑定的,也就是这些数据无法方便的和其它容器共享
Docker主要提供了两种方式做数据的持久化
-
Data Volume, 由Docker管理,(/var/lib/docker/volumes/ Linux), 持久化数据的最好方式
-
Bind Mount,由用户指定存储的数据具体mount在系统什么位置
1.Data Volume
以下的示例程序每隔一分钟将时间打印到txt文件中
//Dockerfile
FROM alpine:latest
RUN apk update
RUN apk --no-cache add curl
ENV SUPERCRONIC_URL=https://github.com/aptible/supercronic/releases/download/v0.1.12/supercronic-linux-amd64 \
SUPERCRONIC=supercronic-linux-amd64 \
SUPERCRONIC_SHA1SUM=048b95b48b708983effb2e5c935a1ef8483d9e3e
RUN curl -fsSLO "$SUPERCRONIC_URL" \
&& echo "${SUPERCRONIC_SHA1SUM} ${SUPERCRONIC}" | sha1sum -c - \
&& chmod +x "$SUPERCRONIC" \
&& mv "$SUPERCRONIC" "/usr/local/bin/${SUPERCRONIC}" \
&& ln -s "/usr/local/bin/${SUPERCRONIC}" /usr/local/bin/supercronic
COPY my-cron /app/my-cron
WORKDIR /app
VOLUME ["/app"] //持久化
# RUN cron job
CMD ["/usr/local/bin/supercronic", "/app/my-cron"]
//my-cron
*/1 * * * * date >> /app/test.txt
通过以下方式创建镜像以及验证是否持久化成功。
★使用-v参数时,dockerfile不写入volume也可实现数据持久化
docker image build -f dockerfile-volume -t my-cron-volume . //创建镜像
docker container run -d my-cron-volume // 后台运行容器
docker container run -d -v cron-data:/app my-cron-volume // 指定volume存储地址,可以重复使用
docker container exec -it ID sh //进入交互式模式
docker container rm -f ID //删除容器后测试本地是否存储文件
docker volume ls // 显示目前的volume
DRIVER VOLUME NAME
local 1e8dc1e5821317f7
docker volume inspect 1e8dc1e5821317f7 //将刚显示的volume name替换显示详细信息
[
{
"CreatedAt": "2022-09-27T22:36:00+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/1e8dc1e5821317f7/_data",
"Name": "1e8dc1e5821317f7",
"Options": null,
"Scope": "local"
}
]
ls /var/lib/docker/volumes/1e8dc1e5821317f7/_data //输入详细信息中的地址即可看到持久化的文件
my-cron test.txt
MySQL练习
需指定登录数据库的密码,并设定持久化位置
docker container run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d -v mysql-data:/var/lib/mysql mysql:5.7
2.Bind Mount
直接将当前目录挂载到docker中,不使用docker内部路径不生成volume。
docker container run -d -v $(pwd):/app my-cron-volume //windows使用${pwd}
使用场景
当本地没有某种编译环境,可以直接使用docker镜像编译再将编译好的可执行文件持久化到本地