Dockerfile镜像打包

一、什么是Dockerfile

1)Dockerfile一个用来构建镜像的文本文件,文本内容包含一条条构建镜像所需的指令和说明

2)Docker通过读取Dockerfile中的指令自动生成镜像。

3Docker里的镜像绝大部分都是在别的镜像的基础上去进行创建的,也就是使用镜像的分层结构。

4)Docker镜像由只读层组成,运行的容器会Docker的镜像上面多加一层可写容器。任何对文件的更改都只存在容器层。因此任何对容器的操作不会影响到镜像。

二、Dockerfile基本结构

Dockerfile 一般分为四部分

    1)基础镜像信息            (必须参数)

                在dockerfile种使用   #作为注释    第一行必须指定基础镜像

                例如:

                     FROM nginx

    2)维护者信息               (可选参数)

                例如:

                      MAINTAINET  xx@xx.com

    3)镜像操作指令           (重要参数)

                操作指令包含: 包括ADD、ENV、EXPOSE等

                例如:

                    RUN  apk  add  curl

    4)容器启动执行命令 (重要参数)

                 例如:CMD ["nginx", "-g", "daemon off;"]

如下示例

FROM docker.io/centos
LABEL "auth"=“xx" \
      "mail"=“xx@xx.com"
ENV TIME_ZOME Asia/Shanghai
RUN yum install -y gcc gcc-c++ make openssl-devel prce-devel
ADD nginx-1.14.2.tar.gz /opt/
RUN cd /opt/nginx-1.14.2 && \
    ./configure --prefix=/usr/local/nginx && \
    make -j 4 && \
    make install

RUN rm -rf /opt/nginx* && \
    yum clean all && \
    echo "${TIME_ZOME}" > /etc/timezone && \
    ln -sf /usr/share/zoneinfo/${TIME_ZOME} /etc/localtime

COPY nginx.conf /usr/local/nginx/conf/
WORKDIR /usr/local/nginx/
EXPOSE 80
CMD ["./sbin/nginx","-g","daemon off;"]

三、镜像构建工作逻辑

1、在一个自定义的目录下有Dockerfile文件;

命名首字母 必须是 大写
引用的文件必须在 当前的目录及其 以下 目录
如果有些文件不需要被打包,可以将这些文件 放在 当前目录下隐藏文件(.dockeringore)中;

2、在当前目录下执行docker build来进行打包成镜像,Dockerfile中的命令必须是docker支持的命令;
3、基于刚才打包的镜像启动容器;

通过Dockerfile制作成镜像并启动容器的过程如下:

 其中上面提到的CMD指令还有后面介绍的ENTRYPOINT指令都是在docker run的时候执行,其他指令在docker build的时候执行。

四、Dockerfile指令详解

FROM重要且必须是开篇第一个非注释行,用于镜像文件构建过程指定基础镜像,后续的指令运行是在此基础上运行。在实践中,基础镜像可以是任何可用镜像文件,默认情况下,docker build 会在docker主机上查找指定的镜像文件,在其不存在时,则会从docker HUB上拉取镜像,如果找不到镜像,则会报错

MAINTANIER用于指定Dockerfile制作者本人的信息,目前已经废弃。

LABEL:指定Dockerfile元数据标签信息,我们可以将MAINTANIER的作者信息写在LABEL标签里

RUN用于指定docker build过程中运行的程序,其可以是任何可执行命令

CMD:类似于RUN命令,CMD指令也可以运行命令或应用程序RUN指令运行于镜像文件构建过程,CMD运行于docker run的时候CMD指令的首要目的在于启动容器的时候运行程序,他运行结束后,容器也将终止,不过CMD指令可以被docker run的命令选项所覆盖Dockerfile中可以存多个CMD指令,但仅最后一个会生效;

ENTRYPOINT类似CMD指令功能,用于容器指定默认运行程序,从而使得容器像是一个单独的可执行程序。

CMD不同的是,由ENTRYPOINT启动程序不会被docker run命令指定的参数覆盖,而且,这些命令参数会被当做参数传递给ENTRYPOINT指定的程序docker run 命令的 --entrypoint选项的参数可覆盖NETRYPOINT指定的程序。

ADD:    将本地或者远程文件,添加到容器中,tar类型文件会自动解压

COPYdocker主机复制文件到镜像中。类似ADD,但是不会自动解压压缩文件。

ENV用于为镜像定义所需环境变量,并可被dockerfile文件中位于其后的其他指令所调用

EXPOSE用于为容器打开指定要监听的端口以实现与外部通信,在docker run的时候,如果没有指定-P参数,是不会暴露在docker主机上的。协议支持TCPUDP默认是TCPEXPOSE指令可以一次指定多个端口。

VOLUME 用于在镜像中创建一个挂载点目录,以挂载docker主机上的卷或者其它容器上的卷。

WORKDIR指定工作目录,类似于cd命令,每一次只影响当前目录到后的目录

USER:用于指定运行镜像时的或运行dockerfile中任何RUNCMD或者ENTRYPOINT指令指定的程序的用户名或UID

ARGbuild时使用,用于构建运行时传递变量。

ONBUILD用于在dockerfile中定义一个触发器。

dockerfile用于build镜像文件,此映像文件亦可作为base image被另一个dockerfile用作FROM指令参数,并以之构建新的映像,在后面的dockerfile中的FROM指令在build过程中被执行时,将会触发创建其base imagedockerfile文件中的ONBUILD指令定义的触发器。

五、Docker镜像打包案例

基础镜像:CentOS7.8.2003+JDK1.8

1)编写dockerfile

1)编写dockerfile
## Set the base image to Centos7 install jdk1.8
FROM                centos:7
MAINTAINER          xx@xx.com

ENV REFRESHED_AT    2020-11-04

COPY  jdk1.8.0_101  /usr/local/jdk1.8

RUN   yum  -y  install  vi   net-tools iproute nc
ENV JAVA_HOME /usr/local/jdk1.8
ENV JRE_HOME ${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH ${JAVA_HOME}/bin:$PATH

CMD tail -f /dev/null

2)构建镜像

生成镜像,名称: centos7_jdk8

# docker build -t centos7_jdk8 .

# docker images | grep centos

3)测试镜像

# docker run -it centos7_jdk8 /bin/bash

4)导入导出镜像

# docker save centos7_jdk8 -o centos7_jdk8.tar

# docker load -i centos7_jdk8.tar

后端镜像示例

1)镜像Dockerfile

文件名:Dockerfile

FROM centos7_jdk8
MAINTAINER  xx@xx.com

ENV JAVA_OPTS="-server -Xms1g -Xmx2g"
RUN mkdir /gscdp-terminal

ADD gscdp-terminal.jar /gscdp-terminal/gscdp-terminal.jar
ADD conf /gscdp-terminal/conf
ADD start.sh /gscdp-terminal/start.sh
ADD entrypoint.sh /gscdp-terminal/entrypoint.sh
ADD hosts /tmp/

WORKDIR /gscdp-terminal
RUN chmod +x start.sh entrypoint.sh

EXPOSE 8113
ENTRYPOINT cat /tmp/hosts  >>  /etc/hosts; sh /gscdp-terminal/entrypoint.sh 
-d postgre-server-db:5432,nacos-server-gsdss:8848,redis-server-gsdss:6379 -c 'bash /gscdp-terminal/start.sh;'

2)管理服务启动顺序脚本

文件名:entrypoint.sh

3)服务启动脚本

文件名:start.sh

#!/bin/bash

java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar gscdp-terminal.jar 

--spring.config.location=conf/bootstrap.properties --logging.config=conf/logback.xml

4hosts文件

文件名:hosts

5)服务配置文件

文件名:bootstrap.properties  logback.xml

前端镜像示例

1Dockerfile文件

文件名:Dockerfile

FROM nginx:1.18

RUN mkdir /home/gscdp-web
ADD gscdp-terminal-web.tar.gz /home/gscdp-web
ADD entrypoint.sh /home/gscdp-web/entrypoint.sh

ADD mis_8990.conf /etc/nginx/conf.d/mis_8990.conf
ADD hosts /tmp/hosts

EXPOSE 8990
WORKDIR /home/gscdp-web
ENTRYPOINT ["sh","entrypoint.sh"]

2)服务启动脚本

文件名:entrypoint.sh

3hosts文件

文件名:hosts

4nginx配置文件

文件名:mis_8990.conf

Docker镜像构建案例DoDocker镜像构建案例cker镜像构建案例DDocker镜像构建案例ocker镜像

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明算科

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值