方式二、Docker数据卷
- 什么是volume
想要了解Docker
Volume,首先我们需要知道Docker的文件系统是如何工作的。Docker镜像是由多个文件系统(只读层)叠加而成。当我们启动一个容器的时候,Docker会加载镜像层并在其上添加一个读写层。如果运行中的容器修改了现有的一个已存在的文件,那该文件将会从读写层下的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失。在Docker中,只读层以及在顶部的读写层的组合被称为Union
FIle System(联合文件系统)。为了能够保存(持久化)数据以及共享容器间的数据,Docker提出了Volume的概念。简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。
- 数据卷的特性
• 数据卷 可以在容器之间共享和重用
• 对数据卷的修改会立马生效
• 对数据卷的更新,不会影响镜像
• 数据卷 默认会一直存在,即使容器被删除
- 数据卷相关操作
docker volume
创建数据卷
docker volume create [OPTIONS] [VOLUME] (如果不指定,则创虚拟volume)
查看所有数据卷
docker volume ls
查看单一或多个数据卷详情
docker volume inspect [OPTIONS] VOLUME [VOLUME...]
删除单一数据卷
docker volume rm [OPTIONS] VOLUME [VOLUME...]
删除所有闲置数据卷
docker volume prune [OPTIONS]
可以看到创建的 Volume my-vol 保存在目录/var/lib/docker/volumes/下,以后所有针对该 Volume 的写数据都会保存中目录/var/lib/docker/volumes/my-vol/_data下。
文件挂载 先解释 -v /d/dev/test:/home/test
,表示将宿主机的D:/dev/test目录与容器内部的/home/test目录映射起来,在该目录下的操作的双向影响的在这里D:/dev/test要写成/d/dev/test的形式
4.1.1 根据 ## 数据卷名称 ## 进行挂载
docker run -itd -v VOLUME_NAME:CONTAINER-DIR IMAGE [COMMAND] [ARG…]
示例:
将宿主机数据卷 my_vol 挂载到容器的/data/docker/volume/my_vol 目录
docker run -itd --name=vol1_ubuntu -v my_vol:/data/docker/volume/my_vol ubuntu /bin/bash
注:如果数据卷my_vol 存在将直接进行挂载,如果不存在 docker 将先自动创建数据卷再进行挂载。
挂载成功后,容器从 /data/docker/volume/my_vol目录下读取或写入数据,实际上都是从宿主机的 my_vol 数据卷中读取或写入数据。因此 Volumes 或 Bind mounts 也可以看作是容器和宿主机共享文件的一种方式。
4.1.2 宿主机文件目录绝对路径进行挂载****
docker run -it -v ABSOLUTE-HOST-DIR:CONTAINER-DIR IMAGE [COMMAND] [ARG…]
示例:
将宿主机文件目录 /opt/common/docker/volumes/my_vol2 挂载到容器的/data/docker/volume/my_vol 目录
docker run -itd --name=vol2_ubuntu -v /opt/common/docker/volumes/my_vol2:/data/docker/volume/my_vol ubuntu /bin/bash
注:宿主机的文件目录必须为绝对路径。
4.1.3 根据宿主机文件绝对路径进行挂载
docker run -itd -v VOLUME_NAME:CONTAINER-DIR IMAGE [COMMAND] [ARG…]
示例:
将宿主机文件 ~/.bash_history 挂载到容器的/.bash_history
docker run -itd --name=vol3_ubuntu -v ~/.bash_history:/.bash_history ubuntu /bin/bash
4.1.4 挂载匿名卷
v 参数如果不加任何宿主机相关卷信息docker将创建一个匿名卷进行挂载
docker run -itd -v CONTAINER-DIR IMAGE [COMMAND] [ARG…] 示例:
挂载匿名卷到容器的/data/docker/volume/my_vol 目录
docker run -itd --name=vol4_ubuntu -v /data/docker/volume/my_vol ubuntu /bin/bash
## 本地文件上传至docker容器 文件上传到docker容器 本地与容器互传 服务器的文件复制到docker容器内
**注:此方式虽然也可以管理但是数据不交融,基本不会使用,仅做了解**
> 问题 在往docker容器中直接使用rz上传文件时,速度很慢,所以考虑使用从本地上传至容器
拿到容器ID
docker ps -a
将本地文件上传到容器的指定目录中 一定要写绝对路径而不是相对路径 容器名字使用容器id
docker cp 本地文件路径 ID全称(容器id):容器路径
容器到宿主机 一定要写绝对路径而不是相对路径 容器名字使用容器id
注:此方式虽然他也可以管理但是数据不交融,基本不会使用,仅做了解
docker宿主机与容器的交互 文件互传 数据交互 数据传输
docker映射外部文件夹