目录
1、数据卷
1.1 什么是容器数据卷
容器之间可以有一个数据共享的技术,Docker 容器中产生的数据,同步到本地。
这就是卷的技术,目录的挂载,将我们容器的内的目录,挂载到Linux上面。
总结:容器的持久化和同步操作,容器间也是可以容器共享的。
1.2. 使用数据卷
方式一:直接使用命令来挂载 -v
docker run -it -v 主机端口 : 容器端口
docker run -it -v 主机目录 : 容器目录
测试:docker run -it -v /home/ceshi:/home centos /bin/bash
启动后通过docker inspect 容器id 查看挂载信息
测试文件同步:
反向测试:
1.停止容器
2.宿主机上修改文件
3.启动容器
4 .容器内的数据
好处:只需要在本地修改即可,容器内会自动同步。
坏处:会占用两倍的存储!
1.3.实战测试:安装MySQL
思考:Mysql的数据持久化问题
#获取镜像
[root@liustudy home]# docker pull mysql:8.0.23
#运行容器,需要做数据挂载 安装启动MySQL,需要配置密码,这是注意点!
#官方测试:
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# 启动我们的数据库
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器起名
mysql:8.0.23 配置版本
[root@liustudy home]# 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 --name mysql01 mysql:8.0.23
#启动成功之后,在本地使用sqlyog连接测试一下:
这里可能会启动失败,如果阿里云安全组端口没开的话,就有可能报错,所以要先去把安全组打开,如果不是这个问题的话可以参考:
宿主机的SQLyog连接不上问题http://t.csdn.cn/aaulb
#首先SOLyog 连接到服务器的3310,然后3310和容器内的3306映射,这个时候就可以连接上了。
此处配置好版本后,就可以去本地的SQLyog上进行连接了。
#在本地测试创建一个数据库,查看一下我们映射的路径是否正确。
ps:这里成功是因为先挂载覆盖了,然后MYSQL程序启动才自动创建的数据。
假设将容器删除:
发现挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能。
2.具名和匿名挂载
匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /ect/nginx nginx(这里是大P,随机映射端口)
#查看所有卷的情况
[root@liustudy data]# docker volume ls
这种就是匿名挂载,我们在 -v 只写了容器内的路径,没有写容器外的路径。
具名挂载
[root@liustudy home]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
通过 -v 卷名:容器内的路径(前面加 / 就会被认为是映射的路径)
通过:docker volume inspect juming-nginx 查看卷的具体信息
所有的docker容器内的卷,没有指定目录的情况下都是在:/var/lib/docker/volume/xxx/_data
通过具名挂载可以方便的找到我们的一个卷,大多数情况使用具名挂载 !
如何确定是具名挂载还是匿名挂载,还是指定路径挂载?
-v 容器内路径 匿名挂载
-v 卷名*容器内路径 具名挂载
-v / 宿主机路径 :: 容器内路径 指定路径挂载
拓展:
通过 -v 容器内路径 : ro rw 改变读写权限
ro: readonly 只读 只能通过宿主机操作,容器内部无法操作!
rw: readwrite 可读可写
一旦设置了容器权限,容器对我们挂载出来的内容就有限定了!
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
3.初识DockerFile
3.1DockerFile构建镜像
DockerFile 就是用来构建docker 镜像的构建文件---命令脚本!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个命令,每个命令都是一层。
#创建一个dockerFile文件,名字随机,建议Dockerfile
docker build -f dockerfile1 -t liusir/centos .
#文件中的内容 指令(大写) 和 参数
FROM centos
VOLUME ["/volume01","/volume02"]
CMD echo "----end----"
CMD /bin/bash#这里的每个命令,就是镜像的一层。
启动自己写的容器
这个卷和外部一定有一个同步目录,匿名挂载的。
查看卷挂载的具体路径:docker inspect f49508f57f37
测试文件是否同步出去,这种方式使用的十分多,因为我们通常会构建自己的镜像。
假设构建镜像的时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内的路径!
3.2数据卷容器的联系
多个mysql同步数据
启动3个容器,通过
[root@liustudy _data]# docker run -it --name docker02 --volumes-from docker01 liusir/centos
将父容器docker01删除:
然后在其他容器下查看之前共享的文件是否还存在:
发现docker01容器创建的文件依旧存在!
重点:这里不是拷贝的概念,三个容器都是挂载到宿主机的同一个目录下,如果删掉宿主机下的这个目录文件,三个容器的数据都会消失。
多个mysql实现数据共享:
[root@liustudy]# docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:8.0.23
[root@liustudy]# docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-form mysql01 mysql:8.0.23
# 这个时候就可以实现两个容器数据同步!
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦持久化到了本地,这个时候,本地的数据是不会删除的。
4. DockerFile
4.1 Dockerfile 介绍
dockerfile 是用来构建docker镜像文件镜像的文件,命令参数脚本!
构建步骤:
1. 编写一个dockerfile文件
2. docker build 构建成为一个镜像
3. docker run 运行镜像、
4. docker push 发布镜像(DockerHub 、阿里云镜像仓库!)
查看官网的做法:
很多官方镜像都是基础包,很多功能都没有,我们会自己搭建自己的镜像。
官方既然可以制作镜像,我们也可以!
4.2 DockerFile构建过程
基础知识:
1.每个保留关键字(指令)必须都是大写字母
2. 执行从上到下顺序执行
3. #表示注释
4. 每一个指令都会创建提交一个新的镜像层,并提交!
dockerfile 是面向开发的,我们以后要布置项目,做镜像,就需要编写 dockerfile 文件,这个文件十分的简单。
Docker 镜像 逐渐成为企业交付的一个标准,必须要掌握!
DockerFile : 构建文件,定义了一切步骤,源代码
DockerImage : 通过DockerFile 构建生成的镜像,最终发布和运行的产品,原来是jar、war。
Docker容器:容器就是镜像运行起来提供服务
4.3 DockerFile的指令
FROM # 基础镜像
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤:Tomcat镜像,这个Tomcat压缩包,添加内容。
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOST # 保留端口配置
CMD # 指定这个容器启动时候要运行的命令,只有最后一个生效,可被替换
ENTRYPOINT # 指定这个容器启动时候要运行的命令,可追加命令
ONBUILD # 当构建一个被继承DockerFile 这个时候会运行ONBUILD的指令,触发指令。
COPY # 类似ADD,将我们的文件拷贝到镜像中
ENV # 构建的时候设置环境变量。