Docker基础:Dockerfile相关知识介绍

语言: CN / TW / HK

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情

今天给大家整理一下Dockerfile相关的知识,希望对大家能有所帮助!

1、Dockfile介绍

Dockfile是一种可以被Docker解释的脚本文件,Dockerfile其实由若干条的指令组成,每条指令对应Linux下面的一条脚本命令。Docker应用程序可以将这些指令转化为Linux实际执行的命令。Docker读取Dockerfile文件的指令然后生成对应的docker镜像。通过dockerfile文件可以比较明确的描述出Docker镜像是如何一步一步构建的。有了Dockerfile,我们可以根据实际的因业务需要构建自己的镜像并可以添加一些需要执行的命令,这样可以避免后续的部署工作省去了需要重复敲命令的繁琐过程,大大节约了项目部署的时间成本

2、Dockerfile命令书写规则

Dockerfile的指令忽略大小写,不过建议使用大写,可以使用#作为指令的注释,每一行只能表示一条指令,每条指令可以携带多个参数。

3、Dockerfile的指令的分类

根据作用可以分为两种,构建指令和设置指令。

构建指令:用于构建Docker镜像,其指定的操作不会在运行image的容器上执行,属于镜像的构建过程。。

设置指令:用于设置Docker镜像的属性,其指定的操作会在运行镜像的容器中执行。

4、Dockerfile指令组成

image_97f2d2bf.png

4.1 From(指定基础镜像)

  • Dockerfile必须指定FROM ,并且是第一行,属于构建命令。
  • 表示基于那个基础镜像来构建
  • 基础镜像可以是本地镜像也可以是远程仓库的镜像

语法: FROM image name

4.2 MAINTAINER(指定镜像作者信息)

用来指定构建镜像的作者信息,方便后续通过docker inspect命令查看,对镜像没有实际的影响。

语法: MAINTAINER author name

4.3 RUN (指定需要执行的shell命令)

该命令会在新创建的镜像上添加新的层面。docker build 时运行。

格式:RUN command命令

4.4 CMD(设置容器启动时执行的操作)

可以是执行自定义脚本,也可以是执行系统命令,该指令只能在文件中存在一次,如果有多个,则只会执行最后一条。docker run时运行。

格式: CMD ["executable","param1","param2"] 或 CMD ["param1","param2"]

4.5 ENTRYPOINT(设置容器启动时执行的操作)

设置指令,指定容器启动时执行的命令,可以追加命令,但是只有最后一个ENTRYPOINT有效。

格式: ENTRYPOINT ["executable", "param1","param2"]

4.6 USER(设置容器执行shell命令的用户)

设置指令,设置启动该容器的用户,默认是root用户。

格式:USER root

4.7 EXPOSE(宿主和容器端口映射设置)

指定容器需要映射到宿主机器的端口。

格式: EXPOSE port

4.8 ENV(设置环境变量)

ENV指令可以用于为docker容器设置环境变量。

示例: ENV JAVA/HOME /usr/local/jdk1.8.0.25 指定java环境变量

4.9 ADD(文件复制命令)

复制文件命令,支持自动下载和解压

格式:ADD 源路径 目标路径

优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。

缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

说明:参数:destination 是容器内的路径。source 可以是 下载文件的URL 或者宿主主机的目录

4.10 COPY

类似ADD命令,将地文件拷贝到镜像中

本地目录为源目录时,官方推荐使用COPY。

4.11 VOLUME (指定挂载点)

创建一个可以从本地主机或其他容器挂载的挂载点,用来存放数据库和需要保持的数据等

4.12 WORKDIR(设置工作目录)

指定RUN、CMD与ENTRYPOINT 命令的工作目录。

格式: WORKDIR /path/to/workdir

5、完整的Dockerfile示例

5.1 创建mytomcat文件

```java FROM centos

设置作者

MAINTAINER xiaoming [email protected]

拷贝tomcat jdk 到镜像内并解压

ADD apache-tomcat-8.5.30.tar.gz /usr/local/tomcat ADD jdk-8u202-linux-x64.tar.gz /usr/local/jdk

设置工作目录

ENV MYPATH /usr/local WORKDIR $MYPATH

配置jdk 和tomcat的环境变量

ENV JAVA_HOME /usr/local/jdk/jdk1.8.0_202 ENV CATALINA_HOME /usr/local/tomcat/apache-tomcat-8.5.30 ENV CATALINA_BASE /usr/local/tomcat/apache-tomcat-8.5.30 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

设置暴露的端口

EXPOSE 8080

运行tomcat

CMD /usr/local/tomcat/apache-tomcat-8.5.30/bin/startup.sh && tail -f /usr/local/tomcat/apache-tomcat-8.5.30/logs/catalina.out ```

5.2 构建镜像

java docker build -f mytomcat -t xm/tomcat:1.8 .

注意:docker build 命令最后要有一个 .

5.3 运行镜像

java docker run -d -p 8080:8080 --name mytomcat1.8 -v /usr/local/tomcat/logs:/usr/local/tomcat/apache-tomcat-8.5.30/logs/ -v /usr/local/tomcat/webapps:/usr/local/tomcat/apache-tomcat-8.5.30/webapps/ xm/tomcat:1.8