将应用和环境打包成一个镜像,如果数据都在容器,一旦容器删除了,数据就会丢失了。要解决这个问题,就必须要进行数据的持久化。
容器之间可以有一个数据共享的技术。Docker容器中产生的数据,同步到宿主机,这就是卷技术。目录的挂载,将我们容器内的目录,挂载到Linux上面!
所谓容器卷,就是容器的持久化和同步操作!容器间也是可以数据共享的!
直接使用命令来挂载 -v
docker run -it --privileged=true -v 宿主机绝对路目录:/容器内目录 镜像名
这里我们看到加了一个privileged=true的参数,这是为了解决Docker挂载主机目录如果出现cannot open directory.:Permission denied
如果是centos7安全模块会比之前系统版本加强,不安全的会禁止,所以目录挂载的情况被默认为不安全的行为。在SELinux里面挂载目录被禁止掉了,如果要开启,我们一般使用–privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。
这里所谓的继承,其实就是让一个容器使用另外一个容器的数据卷配置
docker run -it --privileged=true --volumes- from 父类容器 --name 新容器名称 镜像
这里所说的读写权限,指的是容器对数据卷的读写权限,千万别以为是宿主机!!!
默认可读可写rw
docker run -it --privileged=true -v 宿主机绝对路目录:/容器内目录:rw 镜像名
只读权限
docker run -it --privileged=true -v 宿主机绝对路目录:/容器内目录:ro 镜像名
docker run --name mycentos -it -v /data/test:/home centos /bin/bash
rm -rf b.go
docker inspect --format='{{.Mounts}}' mycentos
通过上面的小实验我们看到,使用容器数据卷,我们只需要在本地修改即可,容器内会自动同步。
vim my.cnf
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect=‘SET NAMES utf8mb4’
并把这个文件放到/data/mysql/conf下。
docker run -d -p 3306:3306 --privileged=true -v /data/mysql/log:/var/log/msql -v /data/mysql/data:/var/lib/mysql -v /data/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root --name mysql5.7 mysql:5.7.44
上面我创建了一个mmp的数据库,并且也创建了表sys_user
下面我重启这个容器,看容器会不会丢失。
docker restart mysql5.7
验证配置是否丢失
我们看到,这还是之前容器的配置,没有改变。
验证数据是否丢失
数据也没有丢失。
所以挂载容器数据卷后,容器重启后,数据不会丢失,配置也不会消失。
docker rm -f mysql5.7
docker run -d -p 3306:3306 --privileged=true -v /data/mysql/log:/var/log/msql -v /data/mysql/data:/var/lib/mysql -v /data/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root --name mysql5.7 mysql:5.7.44
验证配置是否丢失
我们看到,这还是之前容器的配置,没有改变。
验证数据是否丢失
数据也没有丢失。
所以挂载容器数据卷后,容器重启后,数据不会丢失,配置也不会消失。
注意,这里运行的MySQL容器仅供自己学习使用,不能用于生产,因为配置太简单,并且也没有做基本的主从复制。