我们可以将容器的应用的数据与容器分离开来,可能的原因包含以下几条:
-
防止将实际的数据(比如数据库)嵌入应用
-
使用相同的容器镜像运行多个环境
-
减少读写开销,增加读写性能——volume 是直接写入文件系统的,而镜像本身使用 overlay 来管理内容,overlay 是有额外开销的
-
可以访问网络存储上的共享内容
需要注意的是,容器技术花费了大量的心思在隔离容器文件系统和宿主机文件系统上,但是 volume 允许容器访问宿主机文件系统,会有潜在的安全风险,需要小心对待。
podman 可以通过 --volume <宿主机目录>:<容器内目录> 参数将宿主机的文件系统中的内容挂载(准确说是 bind mount)至容器内。
|
Note
|
|
比如,对于我们于 76.02、Podman 命令行.adoc 中创建的 my_custom_nginx 镜像,若我们移除拷贝 index.html 的指令,我们就可以得到一个干净的、不含我们自定义数据的安装了 nginx 的 fedora 镜像。
FROM 'registry.fedoraproject.org/fedora:41'
RUN dnf -y update && dnf -y install nginx && dnf -y clean all
# 将 nginx 的日志输出到 stdout 和 stderr,以便 podman logs 收集
RUN sed -i -E 's|(error_log) +.* +(\w+;)|\1 /dev/stderr \2|' /etc/nginx/nginx.conf && \\
sed -i -E 's|(access_log) +.* +(\w+;)|\1 /dev/stdout \2|' /etc/nginx/nginx.conf
# 将容器的退出信号修改为 nginx 需要的 SIGQUIT
STOPSIGNAL SIGQUIT
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]在我们重新构建镜像之后,我们可以通过下面的命令,在创建容器的时候,将 index.html 挂载至其中:
podman run --rm --volume ./file:/usr/share/nginx/html:ro,z --publish 8080:80 localhost/my_custom_nginx--volume 的参数中,前一个分号分隔了宿主机路劲和容器内路径,后一个分号之后的 ro,z 是挂载选项:ro 表示只读(read-only);z 表示在即将 bind 时修改宿主机文件系统上的项目的 SELinux 标签,且小写的 z 表示设置的 SELinux 标签允许该文件在多个容器间共享,若设置为 Z 则为该容器独占的。
|
Note
|
|
除了将目录挂载至容器中,我们也可以创建名为“volume”的存储机制。它们可以通过 podman volume create 创建,比如,创建一个名为 webdata 的 volume:
podman volume create webdata之后,我们就可以将这个 volume 挂载到容器中,比如:
podman run --rm --volume webdata:/usr/share/nginx/html:ro,z --publish 8080:80 localhost/my_custom_nginx|
Note
|
|
当我们希望移除一个 podman 管理的 volume,我们需要确认所有挂载了该 volume 的容器均已经被移除。或者我们使用 --force 参数,则所有挂载了该 volume 的容器会被自动移除。
podman volume rm webdata