场景
在实际业务场景中,需要制作多个不同版本进行镜像使用,如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. net
WORKDIR / usr/bin/jdk
WORKDIR / usr/bin/mvn
COPY apache-maven-3. 8. 6 / usr/bin/mvn
COPY jdk1. 8. 0_202 / usr/bin/jdk
ENV 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 update
RUN [ "/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 - l
CMD [ "/usr/bin/wc" , "--help" ]
注:CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
ENTRYPOINT
格式:
ENTRYPOINT [ "executable" , "param1" , "param2" ] ( 可执行文件, 优先)
ENTRYPOINT command param1 param2 ( shell内部命令)
示例:
FROM centos:7
ENTRYPOINT [ "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 Iversion
ENV myCat=demos
EXPOSE
格式:
EXPOSE <port> [ <port>. . . ]
示例:
EXPOSE 80 443
EXPOSE 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 site
ARG 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 install
RUN echo "daemon off;" >> / etc/nginx. conf
EXPOSE 80
CMD [ "nginx" ]