一、初识DockerFile
DockerFile就是原来构建docker镜像的构建文件!命令脚本!
1、创建镜像构建命令
(1)/home目录下新建目录docker_test_volume
通过脚本生成镜像,镜像是一层一层的,脚本是一个一个的命令,每个命令都是一层
(2)编辑构建命令脚本
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "......end......"
CMD /bin/bash
这里的每个命令就是镜像的一层
(3)执行构建脚本
docker build -f /home/docker_test_volumn/dockerfile1 -t andy/centos:1.0 .
(4)查看镜像是否构建完成
(5)启动自己构建的镜像
构建时的创建挂载目录用的是匿名挂载,查看是否挂载成功
查看卷挂载的路径
(6)测试一下刚才的文件是否同步出去了
cd /var/lib/docker/volumes/b48b9904540b12a8b61ae996aff78dcb34376061b09ccab24c99ce5828311639/_data
这种方式我们未来使用的十分多,因为我们通常会构建自己的镜像!
假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径
二、数据卷容器
1、多个mysql数据同步
(1)先启动docker01
docker run -it --name docker01 andy/centos:1.0
(2)启动docker02引用docker01的卷
docker run -it --name docker02 --volumes-from docker01 andy/centos:1.0
(3)再进入docker01容器内在卷下创建文件abc.txt
(4)进入docker02查看在docker01中创建的卷是否会同步到docker02中
可以看出,在docker01容器中volume01目录下添加的abc.txt在docker02中volume01目录下已经同步成功
注:
a 通过--volumes-from来实现容器间的挂载就类似于JAVA中的子类继承父类的概念
b 只要通过--volumes-from就能实现容器间的数据共享
(5)启动docker03引用docker01的卷
docker run -it --name docker03 --volumes-from docker01 andy/centos:1.0
(6) 在docker03容器中的/volume01目录下创建efg.txt文件,再进入docker01发现文件已经同步创建
(7) 删除docker01,查看docker02和docker03是否还可以访问挂载文件
依旧可以访问,说明删除初始化的父容器,通过--volume-from的子容器中的文件不受影响
拓展:
多个mysql实现数据共享
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
结论:
(1)容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止
(2)但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的
三、DockerFile构建过程
dockerfile是用来构建镜像的文件
1、dockerfile的构建步骤
(1) 编写一个docfile文件
(2) docker build 构建成为一个镜像
(3) docker run 运行镜像
(4) docker push 发布镜像(Docker Hub、阿里云镜像仓库)
官方的做法:
很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像
基础知识:
(1) 每个保留关键字都是必须大写字母
(2) 执行从上到下顺序执行
(3) #表示注释
(4) 每一个指令都会提交一个新的镜像层,并提交!
构建过程:
#创建一个DocFile文件,名字可以随机,建议DocFile
#文件中的内容 指令(大写) 和 参数
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "......end......"
CMD /bin/bash
dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
Docker镜像逐渐成为了企业交付的标准,必须要掌握!
步骤:开发,部署,运维
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过dockerFile构建生成的镜像,最终发布和运行的产品,原来是jar,war
Docker容器:容器就是镜像运行起来提供服务器
四、DockerFile指令
1 命令解释
FROM #基础镜像,一切从这里开始构建
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #步骤,tomcat镜像,这个tomcat压缩包!就是添加内容
WORKDIR #镜像的工作目录
VOLUME #挂载的目录
EXPOSE #暴露端口
CMD #指定容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承Dockerfile这个时候就会运行onbuild的指令,触发指令
COPY #类似ADD命令,将我们的文件拷贝到镜像中
ENV #构建的时候设置环境变量
2 图示
五、实战测试
Docker hub中99%的镜像都是从基础镜像过来的FROM scratch,然后配置需要的软件和配置来进行的
官网DockerFile的构建过程:
创建一个自己的centos:
1 编写DOCKERFILE的文件
FROM centos
MAINTAINER andy<1196653502@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "........end........"
CMD /bin/bash
2 通过文件构建自己的镜像
dockerfile目录下新建mydockerfile2-centos
docker build -f mydockerfile-centos -t mycentos:0.2 .
3 测试运行
对比之前原生的centos
进入我们自己构建的docker镜像mycentos:0.2,工作目录是我们之前配置的路径
我们可以列出本地镜像的变更历史
查看mysql镜像的生成过程
查看nginx的构建过程
从上述过程可以清除的看到镜像暴露端口,生成目录,设置环境变量的具体过程
六、CMD和ENTRYPOINT区别
CMD #指定容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
1 测试CMD
(1) 编写dockerFile文件
(2) 构建镜像
(3)run运行
发现我们的ls -a 生效了
(4)想追加一个命令 -l ls -al
结果报错
(5)报错原因
CMD的清理下,替换了["ls","-a"]命令,而-l不是命令,所以报错!
2 测试ENTRYPOINT
(1) 编写dockerFile文件
(2) 构建镜像
(3) 运行镜像
这里和CMD生成的镜像看不出任何的区别
(4) 追加命令-l再次运行镜像
但是,这里添加的-l不会像之前CMD那样报错,说明这是在原来的基础上追加命令,而不是替换命令,我们的追加命令是直接拼接在我们的ENTRYPOINT后面的