Dockerfile镜像打包_dockerfile打包镜像-程序员宅基地

技术标签: 容器  运维  docker  

一、什么是Dockerfile

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

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

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

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

二、Dockerfile基本结构

Dockerfile 一般分为四部分

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

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

                例如:

                     FROM nginx

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

                例如:

                      MAINTAINET  [email protected]

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

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

                例如:

                    RUN  apk  add  curl

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

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

如下示例

FROM docker.io/centos
LABEL "auth"=“xx" \
      "mail"=“[email protected]"
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          [email protected]

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  [email protected]

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/LG_15011399296/article/details/123545563

智能推荐

JWT(Json Web Token)实现无状态登录_无状态token登录-程序员宅基地

文章浏览阅读685次。1.1.什么是有状态?有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session。例如登录:用户登录后,我们把登录者的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session。然后下次请求,用户携带cookie值来,我们就能识别到对应session,从而找到用户的信息。缺点是什么?服务端保存大量数据,增加服务端压力 服务端保存用户状态,无法进行水平扩展 客户端请求依赖服务.._无状态token登录

SDUT OJ逆置正整数-程序员宅基地

文章浏览阅读293次。SDUT OnlineJudge#include<iostream>using namespace std;int main(){int a,b,c,d;cin>>a;b=a%10;c=a/10%10;d=a/100%10;int key[3];key[0]=b;key[1]=c;key[2]=d;for(int i = 0;i<3;i++){ if(key[i]!=0) { cout<<key[i.

年终奖盲区_年终奖盲区表-程序员宅基地

文章浏览阅读2.2k次。年终奖采用的平均每月的收入来评定缴税级数的,速算扣除数也按照月份计算出来,但是最终减去的也是一个月的速算扣除数。为什么这么做呢,这样的收的税更多啊,年终也是一个月的收入,凭什么减去12*速算扣除数了?这个霸道(不要脸)的说法,我们只能合理避免的这些跨级的区域了,那具体是那些区域呢?可以参考下面的表格:年终奖一列标红的一对便是盲区的上下线,发放年终奖的数额一定一定要避免这个区域,不然公司多花了钱..._年终奖盲区表

matlab 提取struct结构体中某个字段所有变量的值_matlab读取struct类型数据中的值-程序员宅基地

文章浏览阅读7.5k次,点赞5次,收藏19次。matlab结构体struct字段变量值提取_matlab读取struct类型数据中的值

Android fragment的用法_android reader fragment-程序员宅基地

文章浏览阅读4.8k次。1,什么情况下使用fragment通常用来作为一个activity的用户界面的一部分例如, 一个新闻应用可以在屏幕左侧使用一个fragment来展示一个文章的列表,然后在屏幕右侧使用另一个fragment来展示一篇文章 – 2个fragment并排显示在相同的一个activity中,并且每一个fragment拥有它自己的一套生命周期回调方法,并且处理它们自己的用户输_android reader fragment

FFT of waveIn audio signals-程序员宅基地

文章浏览阅读2.8k次。FFT of waveIn audio signalsBy Aqiruse An article on using the Fast Fourier Transform on audio signals. IntroductionThe Fast Fourier Transform (FFT) allows users to view the spectrum content of _fft of wavein audio signals

随便推点

Awesome Mac:收集的非常全面好用的Mac应用程序、软件以及工具_awesomemac-程序员宅基地

文章浏览阅读5.9k次。https://jaywcjlove.github.io/awesome-mac/ 这个仓库主要是收集非常好用的Mac应用程序、软件以及工具,主要面向开发者和设计师。有这个想法是因为我最近发了一篇较为火爆的涨粉儿微信公众号文章《工具武装的前端开发工程师》,于是建了这么一个仓库,持续更新作为补充,搜集更多好用的软件工具。请Star、Pull Request或者使劲搓它 issu_awesomemac

java前端技术---jquery基础详解_简介java中jquery技术-程序员宅基地

文章浏览阅读616次。一.jquery简介 jQuery是一个快速的,简洁的javaScript库,使用户能更方便地处理HTML documents、events、实现动画效果,并且方便地为网站提供AJAX交互 jQuery 的功能概括1、html 的元素选取2、html的元素操作3、html dom遍历和修改4、js特效和动画效果5、css操作6、html事件操作7、ajax_简介java中jquery技术

Ant Design Table换滚动条的样式_ant design ::-webkit-scrollbar-corner-程序员宅基地

文章浏览阅读1.6w次,点赞5次,收藏19次。我修改的是表格的固定列滚动而产生的滚动条引用Table的组件的css文件中加入下面的样式:.ant-table-body{ &amp;amp;::-webkit-scrollbar { height: 5px; } &amp;amp;::-webkit-scrollbar-thumb { border-radius: 5px; -webkit-box..._ant design ::-webkit-scrollbar-corner

javaWeb毕设分享 健身俱乐部会员管理系统【源码+论文】-程序员宅基地

文章浏览阅读269次。基于JSP的健身俱乐部会员管理系统项目分享:见文末!

论文开题报告怎么写?_开题报告研究难点-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏15次。同学们,是不是又到了一年一度写开题报告的时候呀?是不是还在为不知道论文的开题报告怎么写而苦恼?Take it easy!我带着倾尽我所有开题报告写作经验总结出来的最强保姆级开题报告解说来啦,一定让你脱胎换骨,顺利拿下开题报告这个高塔,你确定还不赶快点赞收藏学起来吗?_开题报告研究难点

原生JS 与 VUE获取父级、子级、兄弟节点的方法 及一些DOM对象的获取_获取子节点的路径 vue-程序员宅基地

文章浏览阅读6k次,点赞4次,收藏17次。原生先获取对象var a = document.getElementById("dom");vue先添加ref <div class="" ref="divBox">获取对象let a = this.$refs.divBox获取父、子、兄弟节点方法var b = a.childNodes; 获取a的全部子节点 var c = a.parentNode; 获取a的父节点var d = a.nextSbiling; 获取a的下一个兄弟节点 var e = a.previ_获取子节点的路径 vue