一、DockerFile详解
DockerFile是用来构建docker镜像的文件!命令参数脚本!
1:构建步骤
(1)编写一个dockerfile文件
(2)docker build构建成为一个镜像
(3)docker run运行镜像
(4)docker push 发布镜像(DockerHub、阿里云镜像仓库等等)
很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!官方既然可以制作镜像,那我们也可以!
2:DockerFile构建过程
★基础知识
(1)每个保留关键字(指令)都必须是大写字母
(2)执行从上到下顺序执行
(3)#表示注释
(4)每一个指令都会创建提交一个新的镜像层,并提交!
★DockerFile是面向开发的,我们以后要发布项目,做镜像,就需要编写DockerFile文件,这个文件十分简单!Docker镜像逐渐成为企业交付的标准,必须要掌握!
(1)DockerFile:构建文件,定义了一切的步骤,源代码
(2)DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品,原来是jar包、war包
(3)Docker容器:容器就是镜像运行起来提供服务器
3:DockerFile的指令
// 解释
(1)FROM(基础镜像,一切从这里开始构建,centos)
(2)MAINTAINER(镜像是谁写的,姓名+邮箱)
(3)RUN(镜像构建的时候需要运行的命令)
(4)ADD(步骤:tomcat镜像,这个tomcat压缩包,添加内容,会自动解压)
(5)WORKDIR(镜像的工作目录)
(6)VOLUME(挂载卷目录)
(7)EXPOSE(暴露端口配置)
(8)CMD(指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被代替)
(9)ENTRYPOINT(指定这个容器启动的时候需要运行的命令,可以追加命令)
(10)ONBUILD(当构建一个被继承DockerFile这个时候就会运行ONBUILD的指令。触发指令)
(11)COPY(类似ADD,将我们文件拷贝到镜像中)
(12)ENV(构建的时候设置环境变量)
4:实战测试
DockerHub中99%镜像都是从这个基础镜像过来的FROM scratch,然后配置需要的软件和配置来进行构建的。
// 官方的centos镜像很多命令是没有的(例如,vim、ifconfig)
// 创建一个自己的centos
★创建新文件(mydockerfile-centos),开始写命令
FROM centos
MAINTAINER xcgg<xcgg0821@126.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
★docker bulid -f mydockerfile-centos -t mycentos:0.1 .(通过这个文件构建镜像,不要忘记后面的“.”)
// 防止踩坑
原因:centos版本的问题,本次问题报错没有AppStream,而这个AppStream是版本8的centos才有的,是版本8的新增内容,在版本7是没有它的,官网没有提供!
解决:修改FROM centos:7
★docker运行镜像,测试vim与ifconfig命令是否存在
对比之前:工作目录为根目录,命令不全(vim、ifconfig等等)
★docker history 镜像ID(我们可以列出镜像进行的变更历史)
我们平时拿到一个镜像,可以研究一下它是怎么做的!
5:CMD与ENTRYPOINT的区别
(1)CMD(指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被代替)
(2)ENTRYPOINT(指定这个容器启动的时候需要运行的命令,可以追加命令)
★创建新文件(dockerfile-cmd-test),开始写命令
FROM centos:7
CMD [“ls”,”-a”]
★docker build -f dockerfile-cmd-test -t cmdtest .(构建镜像,不要忘记后面的”.”)
★docker run 容器ID(运行镜像)
// 注意:想追加命令”-l”,即”ls -al”,会报错
原因:因为在CMD的情况下,”-l”替换了CMD[“ls”,”-a”]命令,”-l”并不是命令,所以报错
★创建新文件(dockerfile-entrypoint -test),开始写命令
FROM centos:7
ENTRYPOINT [“ls”,”-a”]
★docker build -f dockerfile-entrypoint -test -t entrypointtest .(构建镜像,不要忘记后面的”.”)
★docker run 容器ID(运行镜像)
// 开始追加”-l”命令,发现不会报错,是直接拼接到ENTRYPOINT命令后面的
DockerFile中很多命令都十分的相似,我们需要了解他们的区别。
二、DockerFile制作Tomcat镜像
1:准备镜像文件
(1)tomcat压缩包(apache-tomcat-8.5.35.tar.gz)
(2)jdk压缩包(jdk-8u161-linux-x64.tar.gz)
(3)readme.txt文件
2:编写DockerFile文件,制作并启动镜像
★创建新文件(Dockerfile,官方命名,build会自动寻找这个文件,就不用-f指定了),开始写命令
FROM centos:7
MAINTAINER xcgg<xcgg0821@126.com>
COPY readme.txt /home/zhouziyu/dockerTomcat/readme.txt
ADD jdk-8u161-linux-x64.tar.gz /home/zhouziyu/dockerTomcat
ADD apache-tomcat-8.5.35.tar.gz /home/zhouziyu/dockerTomcat
RUN yum -y install vim
RUN yum -y install net-tools
RUN yum -y install initscripts
RUN yum -y install iputils
ENV MYPATH /home/zhouziyu/dockerTomcat
WORKDIR $MYPATH
ENV JAVA_HOME /home/zhouziyu/dockerTomcat/jdk1.8.0_161
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /home/zhouziyu/dockerTomcat/apache-tomcat-8.5.35
ENV CATALINA_BASH /home/zhouziyu/dockerTomcat/apache-tomcat-8.5.35
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /home/zhouziyu/dockerTomcat/apache-tomcat-8.5.35/bin/startup.sh && tail -F /home/zhouziyu/dockerTomcat/apache-tomcat-8.5.35/logs/catalina.out
★docker build -t diytomcat .(构建镜像,不要忘记后面的”.”,镜像文件所在的目录执行)
docker run -d -p 8080:8080 --name xcggtomcat -v /home/zhouziyu/dockerTomcat/webapps:/home/zhouziyu/dockerTomcat/apache-tomcat-8.5.35/webapps/test -v /home/zhouziyu/dockerTomcat/logs: /home/zhouziyu/dockerTomcat/apache-tomcat-8.5.35/logs 容器ID
// 查看容器内部资源
// 日志文件
// 本地webapps添加文件,就会在容器中/webapps/test文件夹中显示出来
三、发布自己的镜像
1:发布镜像到DockerHub
(1)先注册账号,确定这个账号可以登录
(2)在我们的服务器上提交自己的镜像(记得先登录)
(3)登录完毕就可以提交镜像了,docker push
★docker login -u xcgg0821
★docker push 作者名称/镜像名:版本号(提交镜像,保证连接外网)
// 防止踩坑
原因:缺少tag标签,需要增加tag标签
★docker tag 容器ID 作者名称/镜像名:版本号
// 防止踩坑
原因是push的时候需要带上自己Docker Hub的用户名,用户名/镜像名:版本号这样的形式,可以为这个镜像增加一个TAG。
// 重新发布
// 退出
2:发布镜像到阿里云容器服务
(1)登录阿里云
(2)在找到容器镜像服务
(3)创建命名空间(xcgg)
(4)创建容器镜像(station,私有的,本地仓库)
(5)浏览页面信息
3:补充
★docker save -o 目标文件 容器ID(镜像压缩成包)
★docker load -i 文件名.tar(镜像解压)
// 小结