# 数据卷

基于分层机制,在容器中操作的文件都是在最顶层进行,这也导致容器的销毁会导致数据丢失。通过数据卷可以实现数据共享和持久化。

# 文件挂载

Linux 根目录以外的文件想要被访问,就需要将其关联到根目录下的某个目录实现,这种关联就叫挂载,目录就是挂载点,解除关联就是卸载。

最直接的就是读取 U 盘的文件,如果没有挂载操作,就只能在图形化界面使用 U 盘,在命令行找不到的。

进行挂载时建议重新创建一个文件夹,如果使用了系统文件夹(etc 之类的),挂载操作会使得原有目录中文件被隐藏,可能会导致系统崩溃。

mount 设备号 挂载点目录
umount 挂载点目录

# 容器持久化

我们可以让容器将文件保存到宿主主机上,这样就算容器销毁,文件也会在宿主主机上保留,下次创建容器时,依然可以从宿主主机上读取到对应的文件。

在宿主机创建需要挂载到容器的目录:

mkdir test
# 随便创建点文件表示有内容
vim test/hello.txt

将 test 目录挂载到容器的某个目录上

docker run -it -v ~test:/root/test ubuntu

此时在容器中就可以访问宿主主机的文件,对挂载目录的文件进行编辑,就相当于编辑宿主主机的数据。在容器中创建文件,宿主主机也会创建相应文件。

在容器中删除文件,不会影响主机的文件。

可以部署 Nginx,在宿主主机上保存前端页面,然后将这个前端页面目录挂载到 Nignx 容器上,这样 Nginx 镜像有升级,容器需要删除重新创建也不会影响前端页面。

我们这里使用的前端模板是 Arsha(如何将文件传到 linux 上待会讲)。

docker run -it -v /win_data/Arsha:/usr/share/nginx/html/ -p 80:80 -d nginx

将解压出来的目录挂载到 Nginx 的默认站点目录 /usr/share/nginx/html/ ,因为挂在后位于顶层,会替代镜像原有的文件。

进入容器将 Nginx 服务启动:

systemctl start nginx

在 windos 浏览器中输入 IP:80 ,即可访问 nginx 服务,如果访问超时,可能是 linux80 端口被其他进程占用,最简单的就是重启一下 linux,再启动 nginx。

如果在挂载时没有指定宿主主机的目录,Docker 就会自动创建一个新的文件夹,并且会将容器中对应路径下的内容拷贝到这个自动创建的目录中,最后挂在到容器中,这种就是由 Docker 管理的数据卷了。

docker run -it -v /root/abc ubuntu

要查看 Docker 将文件放在了宿主机哪个位置

docker inspect 容器名字/ID

主要是看 Mount 这个部分

Docker 支持从宿主主机复制文件到容器中(或者容器复制文件到宿主主机)

docker cp 主机文件 容器名/ID:文件夹路径

# win 文件传输到 Linux

如果 linux 装在虚拟机上,虚拟机安装了 VMwareTools 后,一般可以实现文件直接从 win 拖动到虚拟机系统里面,但是有时候抽风又不能拖动。也可以将文件放到 U 盘里面,然后 U 盘挂载到 Linux 上,再将文件移动到 Linux 其他文件夹里面使用。(无语的是我这 U 盘挂载也出了问题)

这里讲通过 pscp,命令行传输文件。

  • 在 Linux 中设置好 root 的密码: sudo passwd 。在根目录下创建 win_data 文件夹(名字其实随便)
  • 修改 sshd_config 文件,参考这篇文章:https://www.cnblogs.com/xuliangxing/p/7428737.html
  • 在 windos 下载好需要的文件

  • 下载 pscp:https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
  • pscp.exe 放在 C:\Windows\System32 文件夹下

  • 在 C:Windows\System32 下打开命令行,输入:
scp 下载文件路径 root@IP:/win_data

输入密码后就可以传输了,这里必须要使用 root,使用一般用户的话,权限不够会拒绝访问。

  • 最后在 /win_data 目录里解压压缩包就可以使将其挂载到 nginx 上了
sudo unzip Arsha.zip

# 容器数据共享

容器与容器之间的数据共享

一般思路是在宿主主机上创建公告目录,让需要共享的容器挂载到这个公共目录。也可以创建一个容器专门用于存放数据,即数据卷容器。

docker run -it -v ~/test:/root/test --name=data_test ubuntu
docker run -it --volumes-from data_test ubuntu

使用 --volumes-from 指定另一个容器,数据卷容器挂载的内容,在当前容器也存在,就算数据卷容器被删除,也不会影响这边,本质上还是让两个容器挂载了同样的目录实现数据共享。

还可以将数据完全放到容器中,通过构建一个容器将打包好的数据分享给其他容器

FROM ubuntu
ADD data.tar.gz /usr/share/nginx/html
VOLUME /usr/share/nginx/html

指令 ADD,它跟 COPY 命令类似,也可以复制文件到容器中,但是它可以自动对压缩文件进行解压,这里只需要将压缩好的文件填入即可,后面的 VOLUME 指令就像我们使用 -v 参数一样,会创建一个挂载点在容器中

然后构建

docker build -t 镜像名 .

通过这个镜像创建按出来的容器,我们就可以使用了(假设容器名是 ubuntu_test)

docker run -p 80:80 --volumes-from=ubuntu_test -d nginx

# 参考

Linux 文件挂载:https://haicoder.net/linux/linux-file-mount.html

https://www.bbsmax.com/A/gVdnOKP8zW/

修改 sshd_config 文件:https://www.cnblogs.com/xuliangxing/p/7428737.html

前端模板:https://bootstrapmade.com/