什么是数据卷?
简单来说,数据卷就像是容器的一个外部挂载的U盘 或共享文件夹,容器可以往里面读写数据,这个U盘不随容器的删除而消失
数据卷本质上就是宿主机上的一个目录或者文件,目录与宿主机里的容器挂载后变成数据卷

为什么需要数据卷?
-
容器中的数据是临时的;比如说我们创建了一个MySQL容器,这个容器一旦被删除,里面存储的数据表也会被删除
-
容器之间数据不共享;每个容器有自己的独立文件系统,一个容器里写入的文件,另一个容器看不到
-
容器与宿主机隔离;容器内部的文件系统是独立的,宿主机无法方便地访问容器内产生的文件(比如日志、配置文件)
数据卷目录和容器目录绑定过后,双方的修改可以立马同步:
-
**持久化:**数据卷独立于容器生命周期,删除容器后数据卷中仍然保留数据
-
共享:多个容器可以挂载同一个数据卷(同样,一个容器可以挂载多个数据卷)
-
可访问:宿主机可以直接访问数据卷的内容
数据卷配置
创建数据卷并挂载
docker run -v 宿主机目录:容器内目录 ...
这里的宿主机目录就是数据卷
-
目录必须是绝对路径
-
如果目录不存在,则会自动创建
-
可以挂载多个数据卷
具名数据卷
这种方式你不需要关心数据存在 Windows 硬盘的哪个精确的犄角旮旯,你只需要给这个数据卷起一个好记的名字,Docker 官方会把它集中存放在 WSL2 内部
docker run -v 数据卷名:容器内目录 ...
一个容器挂载多个数据卷
docker run -it --name=c2 \
-v ~/data2:/root/data2 \
-v ~/data3:/root/data3 \
centos:7
反斜杠"\"是Linux的续行符号,表示这个语句还没有结束。
查看本地所有的数据卷名字:
docker volumn ls
两个(或多个)容器同时挂载同一个数据卷,实现数据共享
#创建两个容器并共享数据卷
docker run -d --name=c1 -v common_share:/usr/share/nginx/html nginx
docker run -it --name=c2 -v common_share:/root/shared_data centos:7
#往c2里面塞一个文件
echo "Hello from c2" > /root/shared_data/index.html
exit
#在c1中查看文件
docker exec c1
容器c1和c2通过数据卷 实现了数据传输和共享,只需要保证数据卷目录(挂载路径)相同就行了。
数据卷容器
要实现多容器之间的数据传输,除了多个容器共同挂载到同一个数据卷,还可以通过数据卷容器实现
数据卷容器是什么?
数据卷容器是一个专门为了"提供一个或多个数据卷"而运行的容器,它本身不运行任何服务,只是作为一个其他容器挂载和共享数据的"中央存储点"

-
其他容器与数据卷容器挂载后相当于与数据卷进行挂载
-
即使数据卷容器出问题了,依然不影响其他容器的使用
-
数据卷容器仅仅用来声明它挂载了哪些数据卷
配置数据卷容器
创建启动数据卷容器
docker run -it --name=c3 -v /volume centos:7 /bin/bash
这里没有写本地路径 与**:** ,这种叫做匿名数据卷。
Docker会在容器内部的根目录下建立一个叫 /volume 的文件夹,同时Docker 会在你的宿主机上生成一个随机名字的文件夹绑定数据卷。
docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run -it --name=c2 --volumes-from c3 centos:7 /bin/bash
启动c1和c2,它们看到-from c3就会去找c3容器,c3容器挂载了一个/volumn文件,c1和c2也会在内部产生一模一样的/volumn文件
docker应用部署
应用部署步骤:
-
搜索镜像
-
拉取镜像
-
创建容器
-
进入容器并操作容器
部署redis
-
搜索镜像
docker search redis
-
拉取镜像
docker pull redis:5.0
-
创建容器设置端口映射
这里解释一下,外部机器是无法与宿主机里的容器进行交互的,也就是说容器暴露的端口外部无法访问,这个时候我们可以让外部与宿主机的某个端口建立连接,然后该主机端口与容器端口再建立连接形成端口映射。
docker run -id --name=c_redis -p 6739:6739 redis 5.0
-
使用外部机器连接redis
redis-cli.exe -h 192.168.149.135 -p 6379