场景

在实际业务场景中,需要制作多个不同版本进行镜像使用,如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

  FROM :

  FROM @

示例:  

FROM centos:7

注:

tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像

RUN

构建镜像时执行的命令

RUN用于在构建镜像时执行命令,其有以下两种命令执行方式:

shell执行

格式:

RUN

exec执行

格式:

RUN ["executable", "param1", "param2"]

示例:

RUN apk update

RUN ["/etc/execfile", "arg1", "arg1"]

注:RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,

可以在构建时指定--no-cache参数,如:docker build --no-cache

ADD

将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget

格式:

ADD ...

ADD ["",... ""] 用于支持包含空格的路径

示例:

ADD hom* /mydir/ # 添加所有以"hom"开头的文件

ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"

ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/

ADD test /absoluteDir/ # 添加 "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 = = = ...

示例:

  LABEL version="1.0" description="ssd硬盘" by="rundreamsFly"

注:

  使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据

  之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。

ENV

设置环境变量

格式:

ENV #之后的所有内容均会被视为其的组成部分,因此,一次只能设置一个变量

ENV = ... #可以设置多个变量,每个变量为一个"="的键值对,

如果中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行

示例:

ENV myName Iversion

ENV myCat=demos

EXPOSE

指定于外界交互的端口

格式:

EXPOSE [...]

示例:

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

工作目录,类似于cd命令

格式:

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 [=]

示例:

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镜像

# This my first nginx Dockerfile

# Version 1.0

# Base images 基础镜像

FROM centos

#MAINTAINER 维护者信息

MAINTAINER bertwu

#ENV 设置环境变量

ENV PATH /usr/local/nginx/sbin:$PATH

#ADD 文件放在当前目录下,拷过去会自动解压

ADD nginx-1.8.0.tar.gz /usr/local/

ADD epel-release-latest-7.noarch.rpm /usr/local/

#RUN 执行以下命令

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 相当于cd

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 映射端口

EXPOSE 80

#CMD 运行以下命令

CMD ["nginx"]

相关文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: