1、容器数据卷
什么是容器数据卷?
就是当容器内存在了mysql,在里面书写了数据,如果容器删除了,那么数据也就没有了,通过容器数据卷的技术,可以让容器内的数据持久化到Linux服务器上
操作
#docker run -it -v 主机内地址:容器内地址 容器id#举例
#挂载
[root@iZf8zhsqf64x47n1tpdy6oZ ~]# docker run -it -v /home/test:/home centos /bin/bash
[root@cc94b6584256 /]# docker inspect cc94b6584256#查看容器元数据
[root@iZf8zhsqf64x47n1tpdy6oZ ~]# docker inspect cc94b6584256"Mounts": [{"Type": "bind","Source": "/home/test","Destination": "/home","Mode": "","RW": true,"Propagation": "rprivate"}],
#以上便是绑定成功,即当操作/home里的文件时,/home/test也会发生变化,两者是双向绑定的,即使容器关闭了,也是绑定的,只要一方操作,另一方也会变#在容器内操作
[root@cc94b6584256 /]# cd /home
[root@cc94b6584256 home]# ls
[root@cc94b6584256 home]# touch test.java
[root@cc94b6584256 home]# ls
test.java #主机内,能看到新创建的文件
[root@iZf8zhsqf64x47n1tpdy6oZ ~]# cd /home
[root@iZf8zhsqf64x47n1tpdy6oZ home]# ls
test
[root@iZf8zhsqf64x47n1tpdy6oZ home]# cd test
[root@iZf8zhsqf64x47n1tpdy6oZ test]# ls
test.java
实战Mysql同步数据
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0
2、匿名挂载和具名挂载
docker run -d -v 容器内地址 容器名 匿名挂载
docker run -d -v 挂载名(一般不以/开头):容器内地址 容器名 具名挂载
docker run -d -v 主机地址(一般以/开头):容器内地址 容器名 正常挂载#匿名挂载
[root@iZf8zhsqf64x47n1tpdy6oZ data]# docker run -d -v /etc/nginx nginx
d7a0eaa6d6b8ee7cd209e8e0a47aa70a6e81e72bcea3bb3ef0cce625ee71606c
#剧名挂载
[root@iZf8zhsqf64x47n1tpdy6oZ data]# docker run -d -v packet:/etc/nginx nginx
3c66cf3adfb285362b605868e9eca5501f3bc36480ba8332f37eb5380d28df2c
#正常挂载
[root@iZf8zhsqf64x47n1tpdy6oZ data]# docker run -d -v /home/nginx:/etc/nginx nginx
24821ad29fd67e5f10abe754517960710d303a586131f6113ae062f1f5a9136c
查询数据卷
docker volume
[root@iZf8zhsqf64x47n1tpdy6oZ data]# docker volume --help
Commands:create Create a volumeinspect Display detailed information on one or more volumesls List volumesprune Remove all unused volumesrm Remove one or more volumes#查询全部挂载的内容,这个就是我刚刚挂载的内容
[root@iZf8zhsqf64x47n1tpdy6oZ data]# docker volume ls
DRIVER VOLUME NAME
local 9c0b26cd142c9d0f1ee318e783fad711c1b03b6b7d73c86e07cc4a0601cf7c20
local packet
local portainer_data#查询出详细的信息
[root@iZf8zhsqf64x47n1tpdy6oZ data]# docker volume inspect packet
[{"Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/packet/_data", "Name": "packet","Options": {},"Scope": "local"}
]
**"Mountpoint": "/var/lib/docker/volumes/packet/_data",** 要是没有指定地址,那么就挂载这个地址
拓展—ro rw 的添加
# docker run -d -v /home/nginx:/etc/nginx:ro nginx 只读
# docker run -d -v /home/nginx:/etc/nginx:rw nginx 可读写只读只能通过主机操作,容器内部无法操作
3、初始Dockerfile
#创建一个Dockerfile文件,文件名就为Dockerfile,然后编辑成已下内容#在home目录下创建一个目录(dockerfile-test)
[root@iZf8zhsqf64x47n1tpdy6oZ home]# cd dockerfile-test/
[root@iZf8zhsqf64x47n1tpdy6oZ dockerfile-test]# ls#在该目录下创建Dockerfile文件,没有后缀
[root@iZf8zhsqf64x47n1tpdy6oZ dockerfile-test]# vim Dockerfile
#编辑文件的内容
[root@iZf8zhsqf64x47n1tpdy6oZ dockerfile-test]# cat Dockerfile
FROM centos
VOLUME["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
4、数据卷容器
实现三个数据库数据共享
#查看正在运行的docker 容器
[root@iZf8zhsqf64x47n1tpdy6oZ dockerfile-test]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f56f4cd48f94 mysql:5.7 "docker-entrypoint..." 44 hours ago Up 44 hours 33060/tcp, 0.0.0.0:3310->3306/tcp thirsty_joliot#查看镜像
[root@iZf8zhsqf64x47n1tpdy6oZ dockerfile-test]# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat01 1.0 0c109a855b95 2 days ago 684 MB
docker.io/portainer/portainer latest 5f11582196a4 15 months ago 287 MB
docker.io/nginx latest 605c77e624dd 2 years ago 141 MB
docker.io/tomcat 9.0 b8e65a4d736d 2 years ago 680 MB
docker.io/tomcat latest fb5657adc892 2 years ago 680 MB
docker.io/mysql 5.7 c20987f18b13 2 years ago 448 MB
docker.io/centos latest 5d0da3dc9764 2 years ago 231 MB
docker.io/elasticsearch 7.6.2 f29a1ee41030 3 years ago 791 MB#启动新的容器,挂载之前的mysql
[root@iZf8zhsqf64x47n1tpdy6oZ dockerfile-test]# docker run -d --name mysql02 --volumes-from f56f4cd48f94 c20987f18b13-d 后台运行
--name 取个名字
--volumes-form 容器名|容器id 镜像名|镜像id 与他进行挂载
**问题:**想要实现多个数据库之间的挂载,但是却出现了一点问题,数据库启动一个,还是可以的,但是启动多了后就会自动停止
总结:挂载后的文件,在父容器删除后,挂载前更改的信息是依然存在的,是一个复制的方式