Volume
举例:
Dockerfile.my-cron
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 FROM alpine:latestRUN 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=048 b95b48b708983effb2e5c935a1ef8483d9e3e 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" ] CMD ["/usr/local/bin/supercronic" , "/app/my-cron" ]
Dockerfile \text {Dockerfile} Dockerfile 构建了一个包含定时任务的容器镜像。下载并安装 SuperCronic \text {SuperCronic} SuperCronic 工具,然后将定时任务文件复制到容器中,并在容器启动时使用 SuperCronic \text {SuperCronic} SuperCronic 运行该任务。同时,通过定义数据 volume \text {volume} volume ,容器内的数据也可以在主机上进行持久化。
FROM alpine:latest
:指定基础镜像为 Alpine Linux \text {Alpine Linux} Alpine Linux 最新版本。
RUN apk update
:更新 Alpine \text {Alpine} Alpine 的包管理器索引。
RUN apk --no-cache add curl
:安装 curl \text {curl } curl 工具用于下载文件。
ENV
:设置环境变量,用于后续的 SuperCronic \text {SuperCronic} SuperCronic 安装。
SUPERCRONIC_URL
SUPERCRONIC
SUPERCRONIC_SHA1SUM
使用 curl
下载 SuperCronic \text {SuperCronic} SuperCronic 可执行文件,并验证其完整性:
curl -fsSLO "$SUPERCRONIC_URL"
:下载 SuperCronic \text {SuperCronic} SuperCronic 文件。
echo "${SUPERCRONIC_SHA1SUM} ${SUPERCRONIC}" | sha1sum -c -
:校验和验证文件的完整性。
chmod +x "$SUPERCRONIC"
:为文件添加可执行权限。
mv "$SUPERCRONIC" "/usr/local/bin/${SUPERCRONIC}"
:将 SuperCronic \text {SuperCronic} SuperCronic 移动到 /usr/local/bin
目录下。
ln -s "/usr/local/bin/${SUPERCRONIC}" /usr/local/bin/supercronic
:创建到 SuperCronic \text {SuperCronic} SuperCronic 的软链接。
COPY my-cron /app/my-cron
:将名为 my-cron
的定时任务文件复制到容器内的 /app
目录。
WORKDIR /app
:设置工作目录为 /app
,即所有后续命令都在这个目录下执行。
VOLUME ["/app"]
:定义数据卷,将容器内的 /app
目录映射到主机,用于持久化容器内的数据。
CMD ["/usr/local/bin/supercronic", "/app/my-cron"]
:设置容器启动时默认运行的命令,即运行 SuperCronic \text {SuperCronic} SuperCronic 工具来执行定时任务。
my-cron
1 */1 * * * * date >> /app/test.txt
构建 my-cron \text {my-cron} my-cron 镜像:
1 docker buildx build -f Dockerfile.my-cron -t my-cron .
启动容器:
1 docker container run -d my-cron
进入容器,
1 docker container exec -it my-cron sh
间隔一定时间,可以观察到已经产生了测试文件输出:
退出并删除容器:
1 docker container rm -f my-cron
Usage \text {Usage} Usage :
Manage volumes \text {Manage volumes} Manage volumes
Commands
create
Create a volume \text {Create a volume} Create a volume
inspect
Display detailed information on one or more volumes \text {Display detailed information on one or more volumes} Display detailed information on one or more volumes
ls
List volumes \text {List volumes} List volumes
prune
Remove all unused local volumes \text {Remove all unused local volumes} Remove all unused local volumes
rm
Remove one or more volumes \text {Remove one or more volumes} Remove one or more volumes
创建容器(指定 -v 参数)
可以修改 Dockerfile.my-cron :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 FROM alpine:latestRUN 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=048 b95b48b708983effb2e5c935a1ef8483d9e3e 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 CMD ["/usr/local/bin/supercronic" , "/app/my-cron" ]
1 docker buildx build -f Dockerfile.my-cron -t my-cron .
并在容器运行指定 -v
参数
1 docker container run -d -v cron-data:/app my-cron
效果同上。
(删除之前的 volume \text{volume} volume )并实验:
现在重新创建新的容器,使用之前的 volume \text{volume} volume :
数据会被保留下来!
Demo:MySQL
拉取镜像
创建容器
1 docker container run --name some-mysql -e MYSQL_ROOT_PASSWORD=solisamicus -d -v mysql-data:/var/lib/mysql mysql:5.7
MySQL(root)数据库
写入数据
查看Volume
Bind Mount
Bind Mount \text {Bind Mount} Bind Mount 是 Docker \text {Docker} Docker 中用于将主机文件或目录挂载到容器中的一种方式。通过 Bind Mount \text {Bind Mount} Bind Mount ,可以在容器内部访问主机上的文件和目录,并且对这些文件的更改会反映在主机上,从而实现容器和主机之间的共享和数据持久化。Bind Mount \text {Bind Mount} Bind Mount 是一种在运行容器时创建的文件系统挂载。与 Volume \text {Volume} Volume 不同,Bind Mount \text {Bind Mount} Bind Mount 直接将主机上的文件或目录挂载到容器的指定路径上,而不是由 Docker \text {Docker} Docker 管理的数据存储。
将上面的命令修改为:
1 docker container run --name some-mysql -e MYSQL_ROOT_PASSWORD=solisamicus -d -v $(pwd):/var/lib/mysql mysql:5.7
即可。