一、Docker容器数据卷
1.为什么会出现容器数据卷?
数据存储在容器中,如果容器删除,那么数据就会丢失;为了实现数据可以持久化,那就需要docker容器中产生的数据可以同步到本地,即容器之间可以数据共享;所以产生了容器数据卷技术:目录的挂载,即将容器内的目录,挂载到Linux上面!
2.使用数据卷
① 方式一:直接使用命令的方式来挂载
# 通过docker run 的 -v 命令(-it:交互模式 -d:后台模式)
docker run -it -v 宿主机目录:容器内目录
# 测试
docker run -it -v /home/ceshi:/home/software centos /bin/bash
# 容器启动之后,可查看是否挂载成功,若成功,则会出现下图提示
docker inspect 容器id
在使用docker的-v 命令来挂载宿主机的目录时,发现在容器里操作挂载目录报:Permission denied
出现这个问题的原因是:CentOS7中的安全模块selinux把权限禁掉了,解决方法如下:
# 方法一:在运行容器的时候,给容器加特权,也就是加上 --privileged=true 参数:
docker run -it -v /home/ceshi:/home/software --privileged=true centos /bin/bash
# 方法二:关闭selinux:
- 临时关闭:setenforce 0
- 永久关闭:修改/etc/sysconfig/selinux文件,将SELINUX的值设置为disabled
# 方法三:添加selinux规则,改变要挂载的目录的安全性文本
chcon [-R] [-t type] [-u user] [-r role] 文件或者目录
选项参数:
-R :连同该目录下癿次目录也同时修改;
-t :后面接安全性本文的类型字段!例如 httpd_sys_content_t ;
-u :后面接身份识别,例如 system_u;
-r :后面街觇色,例如 system_r
举例:mysql的数据卷挂载
# 1.mysql的镜像下载
docker pull mysql:5.7
# 2.启动运行mysql的容器,需要配置密码
docker run -d -p 3355:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name=mysql mysql:5.7
选项参数:
-d :后台运行;
-p :端口映射;
-v :配置数据卷挂载;
-e :环境配置,配置数据库的密码;
--name :容器名字
# 3.测试是否可以连接上mysql(使用数据库连接工具sqlyog):如下图所示
通过本地数据库连接工具sqlyog创建的test数据库,在挂载目录里面也是存在的
匿名挂载和具名挂载:
# 1.匿名挂载: -v 容器内路径(只写容器内部的路径,没有写外部的路径(即宿主机的路径))
docker run -d -P --name=nginx01 -v /etc/nginx nginx
# 2.查看所有的卷的情况
docker volume ls
# 3.匿名挂载类似这样:
local 1f1e0f743fda523e8adf6f462aabfb18bdcd5b6296873d6d34417826865e7362
# 1.具名挂载: -v 卷名:容器内路径(卷名前面不能加/,不然就不是具名挂载,而是直接匹配宿主机路径)
docker run -d -P --name=nginx02 -v juming:/etc/nginx nginx
# 2.具名挂载类似这样:
local juming
# 查看卷名所在的容器内路径
docker volume inspect 卷名
# 例如:查看juming卷的容器内路径
docker volume inspect juming
# 注意:docker容器内所有的卷,没有指定目录的情况下,都保存在/var/lib/docker/volumes/xxxx/_data下面,xxxx表示卷名
docker volume使用方法:
docker volume COMMAND
Commands:
create 创建一个卷
inspect 显示一个或多个卷的详细信息
ls 列出卷
prune 删除所有未使用的卷
rm 删除一个或多个卷
如何区分匿名挂载和具名挂载:
-v 容器内路径 匿名挂载
-v 卷名:容器内路径 具名挂载
-v /宿主机路径:容器内路径 指定路径挂载
扩展:
# 通过-v 容器内路径:ro/rw可更改读写权限
ro:readonly,只读;说明这个路径只能通过宿主机来操作,容器内部是无法操作的
rw:readwrite,可读可写
# 一旦容器设置了权限,那么容器对我们挂载出来的内容就有限定了
docker run -d -P --name=nginx02 -v juming:/etc/nginx:ro nginx
docker run -d -P --name=nginx02 -v juming:/etc/nginx:rw nginx
② 方式二:通过DockerFile创建数据卷
二、DockerFile
DockerFile就是用来构建docker镜像的文件,实际上就是命令参数脚本文件,通过脚本命令生成镜像
# 举例:创建一个dockerfile文件(文件名:testDokcerFile),文件里面的内容如下:(指令都是大写)
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "------end------"
CMD /bin/bash
# 通过docker build命令(后面的“.”不能丢)
docker build -f dockerfile文件路径 -t 容器 .
docker build [OPTIONS] PATH | URL | -
Options:
-c, CPU份额(相对权重)
-f, Dockerfile的名称(默认为“PATH/Dockerfile”)
-m, 内存限制
-q, 成功时取消生成输出并打印图像ID