Docker之Dockerfile原理

  • Post author:
  • Post category:其他

1什么是Dockerfile

Dockerfile可以认为是Docker镜像的描述文件,是由一系列命令和参数构成的脚本。主要作用是用来构建docker镜像的构建文件。

 

通过架构图可以看出通过DockerFile可以直接构建镜像

 2Dockerfile解析过程

 

3Dockerfile内容基础知识

1.每条保留字指令都必须为大写,且后面都要跟至少一个参数。

2.指令按照从上到下,顺序执行。

3.#表示注释。

4.每条指令都会创建一个新的镜像层,并对镜像进行提交。

4Dockerfile的保留命令

官方说明:Dockerfile reference | Docker Documentation

FROM 命令

基于那个镜像进行构建新的镜像,在构建时会自动从docker hub拉取base镜像 必须作为Dockerfile的第一个指令出现

语法:

FROM  <image>

FROM  <image>[:<tag>]     使用版本不写为latest

FROM  <image>[@<digest>]  使用摘要

MAINTAINER 命令

镜像维护者的姓名和邮箱地址[废弃]

语法:

MAINTAINER <name>

RUN 命令

RUN指令将在当前映像之上的新层中执行任何命令并提交结果。生成的提交映像将用于Dockerfile中的下一步

语法:

RUN <command> (shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows)

RUN echo hello

RUN ["executable", "param1", "param2"] (exec form)

RUN ["/bin/bash", "-c", "echo hello"]

 EXPOSE 命令

用来指定构建的镜像在运行为容器时对外暴露的端口

语法:

EXPOSE 80/tcp  如果没有显示指定则默认暴露都是tcp

EXPOSE 80/udp

CMD 命令

用来为启动的容器指定执行的命令,在Dockerfile中只能有一条CMD指令。如果列出多个命令,则只有最后一个命令才会生效。

注意: Dockerfile中只能有一条CMD指令。如果列出多个命令,则只有最后一个命令才会生效。

语法:

CMD ["executable","param1","param2"] (exec form, this is the preferred form)

CMD ["param1","param2"] (as default parameters to ENTRYPOINT)

CMD command param1 param2 (shell form)

WORKDIR 命令

用来为Dockerfile中的任何RUN、CMD、ENTRYPOINT、COPY和ADD指令设置工作目录。如果WORKDIR不存在,即使它没有在任何后续Dockerfile指令中使用,它也将被创建。

语法:

WORKDIR /path/to/workdir

WORKDIR /a

WORKDIR b

WORKDIR c

`注意:WORKDIR指令可以在Dockerfile中多次使用。如果提供了相对路径,则该路径将与先前WORKDIR指令的路径相对`

 ENV 命令

用来为构建镜像设置环境变量。这个值将出现在构建阶段中所有后续指令的环境中。

语法:

ENV <key> <value>

ENV <key>=<value> ...

ADD 命令

用来从context上下文复制新文件、目录或远程文件url,并将它们添加到位于指定路径的映像文件系统中。

语法:

ADD hom* /mydir/       通配符添加多个文件

ADD hom?.txt /mydir/   通配符添加

ADD test.txt relativeDir/  可以指定相对路径

ADD test.txt /absoluteDir/ 也可以指定绝对路径

ADD url 

COPY 命令

用来将context目录中指定文件复制到镜像的指定目录中

语法:

COPY src dest

COPY ["<src>",... "<dest>"]

VOLUME 命令

用来定义容器运行时可以挂在到宿主机的目录

语法:

VOLUME ["/data"]

15.4.11 ENTRYPOINT命令

用来指定容器启动时执行命令和CMD类似

语法

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

ENTRYPOINT command param1 param2

ENTRYPOINT指令,往往用于设置容器启动后的第一个命令,这对一个容器来说往往是固定的。 CMD指令,往往用于设置容器启动的第一个命令的默认参数,这对一个容器来说可以是变化的。

Dockerfile构建过程解析

1.Docker从基础镜像运行一个容器

2.执行一条命令并对容器进行修改

3.执行类似docker commit的操作提交一个新的镜像层

4.docker再基于刚提交的镜像运行一个新容器

5.执行dockerfile中的下一条指令直到所有指令都执行完毕

小总结

1.从应用软件的角度来看,Dockerfile、docker镜像、docker容器分别代表软件的三个不同阶段

  Dockerfile 是软件的原材料  

  docker镜像  是软件的交付品

  docker容器  可以认为是软件的运行状态

2.Dockerfile面向开发,docker镜像成为交付标准,docker容器则涉及部署与运维,三者缺一不可,合力充当docker体系的基石。

 

1.Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、进程服务和内核进程(当应用就进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等

2.docker镜像,在用Dockerfile定义一个文件之后,docker build 时会产生一个docker镜像,当运行docker镜像时,会真正开始提供服务

3.docker容器,容器是直接提供服务的

Dockerfile案例

Base镜像(scratch):Docker Hub中99%的镜像都是由base镜像中安装和配置需要的软件构建出来的。

自定义镜像myCentos

1. 先了解Docker Hub上的Centos是什么情况。

DockerHub上的centos镜像默认落脚点是/,默认不支持vim。那么现在我们想自定义一个centos,改变其默认落脚点,让其支持vim。

2. 编写Dockerfile

#基于Centos基础镜像构建

FROM centos

#镜像维护者的姓名和邮箱地址

MAINTAINER ZCN<15236674712@163.com>

#设置一个变量

ENV MYPATH /tmp

#设置落脚点

WORKDIR $MYPATH

#安装vim编辑器

RUN yum -y install vim

#对外暴露端口号

EXPOSE 80

#执行指令输出落脚点

CMD echo $MYPATH

#执行指令输出信息

CMD echo "build-------success"

#执行指令

CMD /bin/bash

3. 构建镜像

$ docker build -f /myDocker/dockerfile -t zcn/mycentos .

4. 运行容器

$ docker run -it -P zcn/mycentos

自定义镜像myTomcat

1. 先创建/mydocekrfile/tomcat这个目录

将tomcat和jdk8的tar包放进此目录下。然后创建一个dockerfile文件。

​

- apache-tomcat-8.5.46.tar.gz

- jdk-8u171-linux-x64.tar.gz

2. 编写Dockerfile

FROM centos

MAINTAINER ZCN<15236674712@163.com>

#把宿主机当前上下文的c.txt拷贝进容器的/usr/local/路径下

COPY ./c.txt /usr/local/cincontainer.txt

#把tomcat和jdk的tar包拷贝到容器中

ADD ./apache-tomcat-9.0.22.tar.gz /usr/local/

ADD ./jdk-8u171-linux-x64.tar.gz /usr/local/

#安装vim编辑器

Run yum -y install vim

#设置登录落脚点/usr/local

ENV MYPATH /usr/local/

WORKDIR $MYPATH

#配置java和tomcat的环境变量

ENV JAVA_HOME /usr/local/jdk1.8.0_171

ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 

ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22

ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.22

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

#容器运行时监听的端口

EXPOSE 8080

#启动时运行tomcat

# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.22/bin/startup.sh"]

# CMD ["/usr/local/apache-tomcat-9.0.22/bin/catalina.sh","run"]

CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out

java项目创建镜像 jar包

FROM centos

MAINTAINER ZCN<15236674712@163.com>

#把宿主机当前上下文的c.txt拷贝进容器的/usr/local/路径下

#把jdk的tar包拷贝到容器中

ADD ./jdk-8u171-linux-x64.tar.gz /usr/local/

#设置登录落脚点/usr/local

ENV MYPATH /usr/local/

WORKDIR $MYPATH

#配置java和tomcat的环境变量

ENV JAVA_HOME /usr/local/jdk1.8.0_171

ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

ENV PATH $PATH:$JAVA_HOME/bin

COPY ./yingx_zhangcn184s-0.0.1-SNAPSHOT.jar yingx_zhangcn184s-0.0.1-SNAPSHOT.jar

EXPOSE 9292

ENTRYPOINT ["java","-jar","./yingx_zhangcn184s-0.0.1-SNAPSHOT.jar"]

3. 构建镜像

$ docker build -t zcn/mytomcat .

这里没写-f是因为如果在当前目录下并且file文件名为正统的dockerfile 那么-f可以省略不写。

4. 运行容器

$ docker run -d -p 8888:8080 --name mytomcat -v /zcn/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test -v /zcn/tomcat/logs:/usr/local/apache-tomcat-9.0.22/logs --privileged=true zcn/tomcat

解释:创建数据卷,让容器中的webapps目录中的项目目录和主机中test目录做一个映射


版权声明:本文为m0_66194642原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。