Data Volume

Note

本节部分操作需要Linux系统的环境,但是大部分都可以在Windows环境下的Docker进行操作,只有一个操作不行。

如何进行数据的持久化。

环境准备

准备一个Dockerfile 和一个 my-cron的文件

  1. $ ls
  2. Dockerfile my-cron
  3. $ more Dockerfile
  4. FROM alpine:latest
  5. RUN apk update
  6. RUN apk --no-cache add curl
  7. ENV SUPERCRONIC_URL=https://github.com/aptible/supercronic/releases/download/v0.1.12/supercronic-linux-amd64 \
  8. SUPERCRONIC=supercronic-linux-amd64 \
  9. SUPERCRONIC_SHA1SUM=048b95b48b708983effb2e5c935a1ef8483d9e3e
  10. RUN curl -fsSLO "$SUPERCRONIC_URL" \
  11. && echo "${SUPERCRONIC_SHA1SUM} ${SUPERCRONIC}" | sha1sum -c - \
  12. && chmod +x "$SUPERCRONIC" \
  13. && mv "$SUPERCRONIC" "/usr/local/bin/${SUPERCRONIC}" \
  14. && ln -s "/usr/local/bin/${SUPERCRONIC}" /usr/local/bin/supercronic
  15. COPY my-cron /app/my-cron
  16. WORKDIR /app
  17. VOLUME ["/app"]
  18. # RUN cron job
  19. CMD ["/usr/local/bin/supercronic", "/app/my-cron"]
  20. $
  21. $ more my-cron
  22. */1 * * * * date >> /app/test.txt

构建镜像

  1. $ docker image build -t my-cron .
  2. $ docker image ls
  3. REPOSITORY TAG IMAGE ID CREATED SIZE
  4. my-cron latest e9fbd9a562c9 4 seconds ago 24.7MB

创建容器(不指定-v参数)

此时Docker会自动创建一个随机名字的volume,去存储我们在Dockerfile定义的volume VOLUME ["/app"]

  1. $ docker run -d my-cron
  2. 9a8fa93f03c42427a498b21ac520660752122e20bcdbf939661646f71d277f8f
  3. $ docker volume ls
  4. DRIVER VOLUME NAME
  5. local 043a196c21202c484c69f2098b6b9ec22b9a9e4e4bb8d4f55a4c3dce13c15264
  6. $ docker volume inspect 043a196c21202c484c69f2098b6b9ec22b9a9e4e4bb8d4f55a4c3dce13c15264
  7. [
  8. {
  9. "CreatedAt": "2021-06-22T23:06:13+02:00",
  10. "Driver": "local",
  11. "Labels": null,
  12. "Mountpoint": "/var/lib/docker/volumes/043a196c21202c484c69f2098b6b9ec22b9a9e4e4bb8d4f55a4c3dce13c15264/_data",
  13. "Name": "043a196c21202c484c69f2098b6b9ec22b9a9e4e4bb8d4f55a4c3dce13c15264",
  14. "Options": null,
  15. "Scope": "local"
  16. }
  17. ]

在这个Volume的mountpoint可以发现容器创建的文件

创建容器(指定-v参数)

在创建容器的时候通过 -v 参数我们可以手动的指定需要创建Volume的名字,以及对应于容器内的路径,这个路径是可以任意的,不必需要在Dockerfile里通过VOLUME定义

比如我们把上面的Dockerfile里的VOLUME删除

  1. FROM alpine:latest
  2. RUN apk update
  3. RUN apk --no-cache add curl
  4. ENV SUPERCRONIC_URL=https://github.com/aptible/supercronic/releases/download/v0.1.12/supercronic-linux-amd64 \
  5. SUPERCRONIC=supercronic-linux-amd64 \
  6. SUPERCRONIC_SHA1SUM=048b95b48b708983effb2e5c935a1ef8483d9e3e
  7. RUN curl -fsSLO "$SUPERCRONIC_URL" \
  8. && echo "${SUPERCRONIC_SHA1SUM} ${SUPERCRONIC}" | sha1sum -c - \
  9. && chmod +x "$SUPERCRONIC" \
  10. && mv "$SUPERCRONIC" "/usr/local/bin/${SUPERCRONIC}" \
  11. && ln -s "/usr/local/bin/${SUPERCRONIC}" /usr/local/bin/supercronic
  12. COPY my-cron /app/my-cron
  13. WORKDIR /app
  14. # RUN cron job
  15. CMD ["/usr/local/bin/supercronic", "/app/my-cron"]

重新build镜像,然后创建容器,加-v参数

  1. $ docker image build -t my-cron .
  2. $ docker container run -d -v cron-data:/app my-cron
  3. 43c6d0357b0893861092a752c61ab01bdfa62ea766d01d2fcb8b3ecb6c88b3de
  4. $ docker volume ls
  5. DRIVER VOLUME NAME
  6. local cron-data
  7. $ docker volume inspect cron-data
  8. [
  9. {
  10. "CreatedAt": "2021-06-22T23:25:02+02:00",
  11. "Driver": "local",
  12. "Labels": null,
  13. "Mountpoint": "/var/lib/docker/volumes/cron-data/_data",
  14. "Name": "cron-data",
  15. "Options": null,
  16. "Scope": "local"
  17. }
  18. ]
  19. $ ls /var/lib/docker/volumes/cron-data/_data
  20. my-cron
  21. $ ls /var/lib/docker/volumes/cron-data/_data
  22. my-cron test.txt

Volume也创建了。

环境清理

强制删除所有容器,系统清理和volume清理

  1. $ docker rm -f $(docker container ps -aq)
  2. $ docker system prune -f
  3. $ docker volume prune -f