1、先回顾一下什么是镜像:是应用和应用所需要环境的一个包
2、数据:如果数据放在容器中,只要容器删除,那数据也就完蛋了,比如说费劲巴拉整了10000条测试用例放到容器里,结果别人手一抖,删除了,我估计你掐死对方的心都有
因此我们需要产生一个数据共享技术,即Docker容器中产生的数据,同步到本地,相当于做一个备份。
比如说,我在docker服务器中创建了三个容器,其中一个是mysql,我把我的数据写在了容器中的“opt/mysql”下,那我在我的本机的linux中也创建 一个/home/mysql,然后利用上面说的容器数据卷,将“opt/mysql”的数据内容,同步到/home/mysql中
卷技术,就是一种目录挂载,将我们容器内的目录,挂载到本地(突然想到网红词儿内卷是不是就这意思,镜像文件夹里有啥,你本地也得同步出个啥)
1、为了容器的同步操作
2、如果多个容器都挂载到本机的同一个目录,就可以实现数据共享
3、重点的是容器卷是双向的,容器的修改的内容可以同步到本机,本机修改的内容也可以同步到容器
这样其实就解决了一个问题
比如说我们在写python代码,我每次还要进容器,再去操作,有了这层双向同步,我就可以直接在我本机的linux文件里改,改完了以后,就会自动同步到容器里
docker run it -v 主机目录:容器内目录 (是不是很像上个文章的-p 端口映射)
实践 一下
1、 我们来运行一个centos的镜像,生成一个容器,然后在容器中的/home映射到本机的/opt/monkey
[root@localhost opt]# docker run -it -v /opt/monkey:/home centos /bin/bash
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest2、我们退出容器,查看centos的容器信息
[root@3fdde6e6ae2c home]# exit
exit
[root@localhost opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3fdde6e6ae2c centos "/bin/bash" About a minute ago Exited (127) 13 seconds ago kind_tharp
[root@localhost opt]# docker inspect 3fdd3、现在我们进入容器,在home文件夹中创建一个文件abc.txt
[root@localhost opt]# docker start 3fdd
3fdd
[root@localhost opt]# docker exec -it 3fdd /bin/bash
[root@3fdde6e6ae2c /]# cd /home/
[root@3fdde6e6ae2c home]# ls
[root@3fdde6e6ae2c home]# touch abc.txt4、现在我们看一下本地linux /opt/monkey里也会有一个
5、那我在本地里创建一个文件,同样也会同步到容器中
1、下载mysql,并同时创建容器,运行容器
docker run -d -p 8888:3306 -v /opt/mysql02/conf:/etc/mysql/conf.d -v /home/mysql02/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=114207 --name mysql02 mysql:5.7.37
-d:后台启动运行mysql容器
-p 8888:3306 :指定容器和外网的ip映射
-v /opt/mysql02/conf:/etc/mysql/conf.d :将mysql容器中的/etc/mysql/conf.d,映射到本地linux的/opt/mysql02/conf
-v /home/mysql02/data:/var/lib/mysql: 将mysql容器中的数据库,映射到本地
-e MYSQL_ROOT_PASSWORD=114207 :设置mysql初始密码是114207
--name mysql02:容器启名叫mysql02
mysql:5.7.37:我要的版本是mysql :5.7.37版本(ps试了最新版,连接navicat总报错,试了5.7版,docker一启动mysql就闪退,就5.7.37版本没毛病)
2、测试一下
我用navicat远程连接一下mysql并创建一个数据库demo
linux本机的data路径也同步出现了数据库demo
挂载的几种方式
1、 -v 容器内路径 匿名挂载
2、-v 卷名:容器内路径 具名挂载 (常用)
3、-v 容器外路径: 容器内路径 路径挂载(常用)
1、先运行一个centos容器
这个地方我只指定了一个内部容器地址,没指定外部,也没指定挂截名子,这时候docker就会给你生成一个随机的名子,为卷名
2、我们现在查一下卷的信息,发现不知道哪个,卷名是随机生成的一个字符串
这个地方我启动时,指定了一个卷名(我没有加 “/" 证明他是一个名子,不是路径)
现在我们查看一下挂载信息
那他被挂载到了什么地方呢
现在我们来测试一下
进到容器内,在opt下新建一个demo.txt我们进到他挂载的目录/var/lib/docker/volumes/centos_demo/_data
docker run -P -v centos_demo:/opt/:ro -it --name centos03 centos /bin/bash
docker run -P -v centos_demo:/opt/:rw -it --name centos03 centos /bin/bash
ro:只读:这个是对容器的权限的制定,一旦设定了只读,那这个内部的容器只能通过外部映射的容器来操作,在本容器内部是无法操作的
rw:读写:容器的默认权限,就是这个容器可以读和写