场景
在实际业务场景中,需要制作多个不同版本进行镜像使用,如maven版本、JDK、openJDK不同使用等,所以需要做多个针对不同版本做不同的镜像。 这里记录一下之前devops用的openJDK版本、某些部门需要用orcle JDK、特此需要做不同的镜像,镜像内包含centos、maven、jdk。
镜像制作
基础镜像
基础镜像拉去,如centos、alpine等 docker pull centos:7
jdk、maven
拉取centos基础镜像,把jdk、maven镜像制作进基础镜像中,在使用centos:7作为基础镜像,配置jdk版本及maven版本,当拉取镜像时可以直接使用,在devops使用过程中,可以直接run进行启动使用。 dockerfile
FROM centos:7
MAINTAINER rundreams@yeah. netWORKDIR / usr/bin/jdk
WORKDIR / usr/bin/mvn
COPY apache-maven-3. 8. 6 / usr/bin/mvn
COPY jdk1. 8. 0_202 / usr/bin/jdkENV LANG=C. UTF-8
ENV JAVA_HOME=/ usr/bin/jdk
ENV CLASSPATH=. :$JAVA_HOME / lib/dt. jar:$JAVA_HOME / lib/tools. jar
ENV MAVEN_HOME=/ usr/bin/mvn
ENV PATH=$JAVA_HOME / bin:$MAVEN_HOME / bin:$PATH
然后下载maven、JDK版本在Dockerfile同级目录下,并配置Maven配置文件信息,如拉取仓库地址等 在同级目录存在文件夹 apache-maven-3.8.6、jdk1.8.0_202 基于进行可以根据要求选择,如果还有其他命令执行或者需要加入某些环境变量配置,可以参考后面的命令解析
构建镜像
docker build -f Dockerfile -t 镜像地址:版本 .
推送远程
docker push 镜像地址:版本
命令解析
官方参考 https://docs.docker.com/engine/reference/builder/
FROM
格式:FROM <image>FROM <image>:<tag>FROM <image>@<digest>
示例: FROM centos:7
注:tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
RUN
RUN用于在构建镜像时执行命令,其有以下两种命令执行方式:
shell执行
格式:RUN <command>
exec执行
格式:RUN [ "executable" , "param1" , "param2" ]
示例:RUN apk updateRUN [ "/etc/execfile" , "arg1" , "arg1" ]
注:RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,
可以在构建时指定-- no-cache参数,如:docker build -- no-cache
ADD
将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
格式:ADD <src>. . . <dest>ADD [ "<src>" , . . . "<dest>" ] 用于支持包含空格的路径
示例:ADD hom* / mydir/ ADD hom?. txt / mydir/ ADD test relativeDir/ ADD test / absoluteDir/
COPY
类似ADD,但是是不会自动解压文件,也不能访问网络资源
CMD
格式:CMD [ "executable" , "param1" , "param2" ] ( 执行可执行文件,优先) CMD [ "param1" , "param2" ] ( 设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数) CMD command param1 param2 ( 执行shell内部命令)
示例:CMD echo "This is a test." | wc - lCMD [ "/usr/bin/wc" , "--help" ] 注:CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
ENTRYPOINT
格式:ENTRYPOINT [ "executable" , "param1" , "param2" ] ( 可执行文件, 优先) ENTRYPOINT command param1 param2 ( shell内部命令)
示例:FROM centos:7ENTRYPOINT [ "ls" , "/usr/local" ] CMD [ "/usr/local/tomcat" ] 之后,docker run 传递的参数,都会先覆盖cmd, 然后由cmd 传递给entrypoint , 做到灵活应用注:ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给CMD。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。通常情况下, ENTRYPOINT 与CMD一起使用,ENTRYPOINT 写默认命令,当需要参数时候 使用CMD传参
LABEL
格式:LABEL <key>=<value> <key>=<value> <key>=<value> . . .
示例:LABEL version="1.0" description="ssd硬盘" by="rundreamsFly"
注:使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
ENV
格式:ENV <key> <value> ENV <key>=<value> . . . 如果<key>中包含空格,可以使用\来进行转义,也可以通过"" 来进行标示;另外,反斜线也可以用于续行
示例:ENV myName IversionENV myCat=demos
EXPOSE
格式:EXPOSE <port> [ <port>. . . ]
示例:EXPOSE 80 443EXPOSE 8080 EXPOSE 11211/tcp 11214/udp
注:
EXPOSE并不会让容器的端口访问到主机。要使其可访问,
需要在docker run运行容器时通过- p来发布这些端口,或通过- P参数来发布EXPOSE导出的所有端口如果没有暴露端口,后期也可以通过- p 8080:80方式映射端口,但是不能通过- P形式映射
VOLUME
格式:VOLUME [ "/path/to/to" ]
示例:VOLUME [ "/data" ] VOLUME [ "/var/www" , "/var/log/apache2" , "/etc/apache/user"
注:一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:卷可以容器间共享和重用容器并不一定要和其它容器共享卷修改卷后会立即生效对卷的修改不会对镜像产生影响卷会一直存在,直到没有任何容器在使用它
WORKDIR
格式:WORKDIR / path/to/workdir
示例:WORKDIR / a ( 这时工作目录为/ a) WORKDIR b ( 这时工作目录为/ a/b) WORKDIR c ( 这时工作目录为/ a/b/c)
注: 通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY 等命令都会在该目录下执行。在使用docker run运行容器时,可以通过- w参数覆盖构建时所设置的工作目录。
ARG
格式:ARG <name>[ =<default value>]
示例:ARG siteARG build_user=www
From centos:7
ARG parameter
VOLUME / usr/share/nginx
RUN yum - y install $parameter
EXPOSE 80 443
CMD nginx - g "daemon off;"
docker build -- build-arg=parameter=net-tools - t nginx:1. 14 .
一图汇总
其他信息
源码编译制作nginx镜像
FROM centos
MAINTAINER bertwu
ENV PATH / usr/local/nginx/sbin:$PATH
ADD nginx-1. 8. 0. tar. gz / usr/local/
ADD epel-release-latest-7. noarch. rpm / usr/local/
RUN rpm - ivh / usr/local/epel-release-latest-7. noarch. rpm
RUN yum install - y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd - s / sbin/nologin - M www
WORKDIR / usr/local/nginx-1. 8. 0 RUN . / configure -- prefix=/ usr/local/nginx -- user=www -- group =www -- with-http_ssl_module -- with-pcre && make && make installRUN echo "daemon off;" >> / etc/nginx. conf
EXPOSE 80
CMD [ "nginx" ]