dockerfile构建过程
- 编写一个dockerfile文件
- docker build 构建成为一个镜像
- docker run 运行镜像
- docker push 发布镜像(DockerHub,阿里云镜像仓库!)
基础知识
- 每个保留关键字(指令)都是大写字母
- 执行的指令都是从上到下顺序执行
- #表示注释
- 每一个指令都是
dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
docker镜像逐渐成为企业交付的标准,必须要掌握
步骤:开发,部署,上线运维
dockerfile:构建文件,定义了一切的步骤,源代码
dockerImages:通过dockerfile构建生成的镜像,最终发布和运行的产品。
docker容器:容器就是镜像运行起来提供服务
dockerfile 的指令
FROM #基础镜像
Maintainer #镜像的维护者,姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #步骤:tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR #镜像的工作目录
VOLUME #需要挂载的目录
EXPOSE #指定暴露端口
CMD #指定这个容器启动的时候需要运行的命令(多个CMD只有最后一个生效,可被替代)
ENTRYPOINT #指定这个容器启动的时候需要运行的命令(可以追加执行的命令)
ONBUILD #当构建一个被继承Dockerfile这个时候就会运行ONBUILD指令,触发指令
COPY #类似ADD,将文件拷贝到镜像中
ENV #构建的时候设置环境变量
简单的dockerfile实验
先写dockerfile文件
vim dockerfile
FROM centos:centos7.9.2009 #从centos:centos7.9.2009 这个镜像开始
MAINTAINER zhangyu<382108113@qq.com> #镜像维护者 zhangyu<382108113@qq.com>
ENV MYPATH=/usr/local #定义环境变量 MYPATH=/usr/local
WORKDIR $MYPATH #指定工作目录为 $MYPATH
RUN yum -y install vim net-tools #构建镜像时执行 yum -y install vim net-tools
EXPOSE 80 #暴露端口 80
CMD echo $MYPATH #启动容器时执行命令 echo $MYPATH
CMD echo "---end---" #启动容器时执行命令 echo "---end---"
CMD /bin/bash #启动容器时执行命令 /bin/bash
在通过docker build 构建镜像
docker build -f dockerfile -t zhangyu:1.0 . #docker build -f dockerfile文件 -t 指定镜像名称:tag 后面加上目录名称 "."
docker history
通过docker history可以回溯镜像的历史进程
docker history zhangyu:1.0
IMAGE CREATED CREATED BY SIZE COMMENT
8f8bc341af5a 23 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
f1a7a8bb5fca 23 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
02a932aaf6d3 23 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
bedc6a7febcd 23 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
fad4270f24e2 24 minutes ago /bin/sh -c yum -y install vim net-tools 222MB
4736a85480a5 25 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
7b18934ac163 25 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
13799dac25f0 25 minutes ago /bin/sh -c #(nop) MAINTAINER zhangyu<382108… 0B
eeb6ee3f44bd 7 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 7 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 7 months ago /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4… 204MB
CMD 和 ENTRYPOUNT的区别
CMD #指定这个容器启动的时候需要运行的命令(多个CMD只有最后一个生效,可被替代)
ENTRYPOINT #指定这个容器启动的时候需要运行的命令(可以追加执行的命令)
CMD ["ls","-a"] #构建的镜像后面添加任何参数都会把CMD参数完全覆盖,
ENTRYPOINT["ls","-a"] #构建的镜像后面添加任何参数都是追加在ls -a 这个命令后面.
CMD测试
ENTRYPOINT测试
通过结果可以判断,通过entrypoint可以追加命令或者参数,而CMD则是有新的参数会直接覆盖原有参数
举例:tomcat镜像
-
准备镜像文件 tomcat压缩包,jdk的压缩包
-
编写dockerfile文件
官方命名文件名为
Dockerfile
,目录下用此文件名可以不用加-f参数,直接可以指定调用[root@devops-1 tomcat_dockerfile]# cat Dockerfile FROM centos:centos7.9.2009 MAINTAINER zhangyu<382108113@qq.com> COPY README.TXT /usr/local/README.TXT ADD apache-tomcat-9.0.62.tar.gz /usr/local/ ADD jdk-8u321-linux-x64.tar.gz /usr/local/ RUN yum -y install vim net-tools ENV MYPATH=/usr/local/ WORKDIR $MYPATH ENV JAVA_HOME=/usr/local/jdk1.8.0_321 ENV CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME=/usr/local/apache-tomcat-9.0.62 ENV CATALINA_BATH=/usr/local/apache-tomcat-9.0.62 ENV PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 CMD /usr/local/apache-tomcat-9.0.62/bin/startup.sh && tail -f /var/log/lastlog
#docker build -t zhangyu . #通过docker build 命令构建镜像 [root@devops-1 tomcat_dockerfile]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE zhangyu latest a4cdfaf729a7 4 minutes ago 807MB centos centos7.9.2009 eeb6ee3f44bd 7 months ago 204MB #运行镜像 [root@devops-1 tomcat_dockerfile]# docker run -d -P zhangyu #查看镜像 [root@devops-1 tomcat_dockerfile]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3f01a38a3d3a zhangyu "/bin/sh -c '/usr/lo…" 3 minutes ago Up 3 minutes 0.0.0.0:49168->8080/tcp, :::49168->8080/tcp cranky_kilby
登录端口,服务正常启动