Docker之Dockfile

摘要:
什么是DockerFileDockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。Docker程序将这些Dockerfile指令翻译真正的Linux命令。Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系。Docker程序将读取Dockerfile,根据指令生成定制的镜像。每个Dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个起效。

什么是DockerFile

Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。Docker程序将这些Dockerfile指令翻译真正的Linux命令。Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系。Docker程序将读取Dockerfile,根据指令生成定制的镜像(Image)。相比镜像这种黑盒子,Dockerfile这种显而易见的脚本更容易被使用者接受,它明确镜像是怎么产生的。有了Dockerfile,当我们需要定制自己额外的需求时,只需在Dockerfile上添加或者修改指令,重新生成镜像即可,省去了敲命令的麻烦,每次增加一条命令就相当于在镜像的基础增加一层。

Dockerfile基本结构

Docker之Dockfile第1张
Dockerfile一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,Dockerfile的指令是忽略大小写的,建议使用大写,使用#作为注释,每一行只支持一条指令,每条指令可以携带多个参数。

Dockerfile指令介绍

关于每个核心指令我都做自己学习时候可执行指令,大家耐心看,可以将指令拷贝执行一下,感悟会更加深刻。

FROM(指定基础镜像)

指定基础镜像,必须为第一个命令;后续的指令都依赖于该指令指定的镜像。FROM指令指定的基础镜像可以是官方远程仓库中的,也可以位于本地仓库。

#使用
FROM<image>
FROM<image>:<tag>
#demo
FROMmysql:5.7
#解释
tag是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
MAINTAINER(用来指定镜像创建者信息)

构建指令,用于将镜像制作者相关的信息写入到镜像中。当我们对该镜像执行docker inspect命令时,输出中有相应的字段记录该信息。

#使用
MAINTAINER<name>
#demo
MAINTAINERwtzwtz@163.com
RUN(构建镜像时执行的命令)

RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:

#shell执行方式
#使用
RUN<command>
#demo
RUNyuminstallwget
RUNwget-Oredis.tar.gz"http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUNtar-xvfredis.tar.gz
#exec执行方式
#使用
RUN["executable","param1","param2"]
#demo
RUN["/etc/execfile","arg1","arg1"]
#备注
RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:dockerbuild--no-cache
ADD(添加文件)

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

#使用
ADD<src>...<dest>
ADD["<src>",..."<dest>"]用于支持包含空格的路径
#demo
ADDtest.txt/test/#添加test文件到/test/
COPY(拷贝文件)

拷贝文件,不会自动解压文件,也不能访问网络资源;

CMD(构建容器后调用)

指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。后面这两点一定要注意,我做了一些对应的demo,大家可以参考一下。

#支持三种格式:
#使用exec执行,推荐方式;
CMD["executable","param1","param2"]
#在/bin/sh中执行,提供给需要交互的应用;
CMDcommandparam1param2
#提供给ENTRYPOINT的默认参数;
CMD["param1","param2"]
  1. CMD使用demo
#编写dockerfilecmdtest
vimdockerfilecmdtest
FROMcentos
CMD["ls","-a"]
#构建镜像
dockerbuild-fdockerfilecmdtest-tcentoscmdtest.
#查看镜像
dockerimages
#启动镜像
dockerrun8000ab3673ac

Docker之Dockfile第2张
Docker之Dockfile第3张Docker之Dockfile第4张

  1. 验证用户启动容器时候指定了运行的命令,则会覆盖掉CMD指定的命令;
#启动镜像时候执行-l查看详细的文件内容
dockerrun8000ab3673ac-l

Docker之Dockfile第5张

#我们执行一个ls-al发现就可以执行
dockerrun8000ab3673acls-al

Docker之Dockfile第6张

  1. 如果CMD指定了多条命令,只有最后一条会被执行;
#编辑dockerfilecmdtest
vimdockerfilecmdtest
#增加一条
CMDecho"Thisisatest."
#构建镜像
dockerbuild-fdockerfilecmdtest-tcentoscmdtest.
#查看启动镜像
dockeriamges
dockerrun86f69e6e6cbe

Docker之Dockfile第7张

ENTRYPOINT(构建容器后调用)

类似于CMD指令,配置容器启动后执行的命令,并且不被docker run提供的参数覆盖。
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
可以搭配CMD命令使用:变参会使用CMD ,这里的CMD等于是在给ENTRYPOINT传参。

#支持两种格式
#使用exec执行
ENTRYPOINT["executable","param1","param2"]
#shell中执行
ENTRYPOINTcommandparam1param2
  1. ENTRYPOINT使用demo并且验证ENTRYPOINT提供的参数不被docker run提供的参数覆盖;
#编写dockerentrypointtest
vimdockerentrypointtest
FROMcentos
ENTRYPOINT["ls","-a"]
#构建镜像
dockerbuild-fdockerentrypointtest-tdockerentrypointtest.
#启动镜像
dockerimages
dockerrun1ff15d1bff30-l
#删除镜像
dockerrmi1ff15d1bff30

Docker之Dockfile第8张
Docker之Dockfile第9张

  1. 搭配CMD命令动态传递参数;
#编辑dockerentrypointtest
vimdockerentrypointtest
FROMubuntu
CMD["-a"]
ENTRYPOINT["/usr/bin/ls"]
#启动容器
dockerrun601d1c5b2cdd

Docker之Dockfile第10张

ENV(设置环境变量)

设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。容器启动后,可以通过docker inspect查看这个环境变量,也可以通过在docker run --env key=value时设置或修改环境变量。

#使用
ENV<key><value>
EXPOSE(指定于外界交互的端口)

设置指令,该指令会将容器中的端口映射成宿主机器中的某个端口。当你需要访问容器的时候,可以不是用容器的IP地址而是使用宿主机器的IP地址和映射后的端口。要完成整个操作需要两个步骤,首先在Dockerfile使用EXPOSE设置需要映射的容器端口,然后在运行容器的时候指定-p选项加上EXPOSE设置的端口,这样EXPOSE设置的端口号会被随机映射成宿主机器中的一个端口号。也可以指定需要映射到宿主机器的那个端口,这时要确保宿主机器上的端口号没有被使用。EXPOSE指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用-p选项。

#使用
EXPOSE<port>[<port>...]
VOLUME(指定支持化的目录)

创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放需要持久化的数据。Volume设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用;

#使用
VOLUME["<mountpoint>"]
WORKDIR(切换目录)

设置指令,可以多次切换(相当于cd命令);

#格式
WORKDIR/path/to/workdir
USER(指定用户)

指定运行容器时的用户名或UID,默认是root,后续的RUN也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户;

#使用
USERuser
USERuser:group
USERuid
USERuid:gid
USERuser:gid
USERuid:group

Docker之Dockfile第11张

实战

创建一个自带tomcat的centos镜像;

  1. 编辑DockerFile;
#编辑文件centostomcat
vimcentostomcat
#基础镜像
FROMcentos
#作者
MAINTAINERwtz"171776704@qq.com"
#拷贝文件当前目录文件到/usr/local/中
COPYtest.txt/usr/local/test.txt
#拷贝当前目录下的文件tomcat和jdk到/usr/local/并解压
ADDjdk-8u141-linux-x64.tar.gz/usr/local/
ADDapache-tomcat-9.0.46.tar.gz/usr/local/
#安装vim
RUNyum-yinstallvim
#生命变量
ENVINSTALLPATH/usr/local
WORKDIR$INSTALLPATH
#配置环境变量
ENVJAVA_HOME/usr/local/jdk1.8.0_141
ENVJRE_HOME$JAVA_HOME/jre
ENVCLASSPATH$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/$CLASSPATH
ENVCATALINA_HOME/usr/local/apache-tomcat-9.0.46
ENVCATALINA_BASH/usr/local/apache-tomcat-9.0.46
ENVPATH$PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA/bin
#对外暴露8080端口
EXPOSE8080
#启动tomact并查看日志
CMD/usr/local/apache-tomcat-9.0.46/bin/startup.sh&&tail-F/usr/local/apache-tomcat-9.0.46/logs/catalina.out
  1. 构建镜像;
dockerbuild-fcentostomcat-tdockerfiletomcat.

Docker之Dockfile第12张

  1. 启动镜像,访问8088端口,发现tomact已经启动起来了;
dockerrun-d-it--nametomcattest-p8088:8080dockerfiletomcat
curllocalhost:8088

Docker之Dockfile第13张

  1. 进入镜像内部检查/usr/local目录下是否存在test.txt文件,是否安装Java;
#进入镜像
dockerexec-it141eec62a29a/bin/bash
ls
java-version

Docker之Dockfile第14张Docker之Dockfile第15张

免责声明:文章转载自《Docker之Dockfile》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mongodb聚合的使用数据库秒级平滑扩容架构方案下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

.Net Core自动化部署系列(二):使用Jenkins打造镜像发布流水线

一、简介 之前写过一篇关于Jenkins搭配GitLab实现.net core项目自动发布到IIS的博文,比较简单哈,只是个Demo。本篇我们将会使用Jenkins搭配GitLab实现镜像的自动打包和上传,这篇其实是一个铺垫篇,因为后面我们需要使用Jenkins实现kubernetes的发布流水线,即实现镜像的自动化打包和部署。 二、打包镜像 Jenkin...

DockerFile与镜像(Image)仓库

深入Docker 之 Image: 当我们使用docker pull mysql 这个命令获取镜像的时候,到底他是怎么做的?我们登录官方提供的仓库看一下 https://github.com/docker-library. 我们搜索mysql并且选择对应的版本,比如 5.7 我们会看到改目录下只有两个文件,其中最重要的则是这个Dockerfile 文件了...

Dockerfile构建php镜像

简单介绍一下Dockerfile: FROM centos:7 表示依赖centos:7版本的镜像,如果没有对应的镜像,会自动拉去最新的cenos:7镜像 RUN yum -y install libxml2 表示执行某一条命令 ENV 表示构建镜像过程中的环境变量,执行的时候可用 ENTRYPOINT 表示类似CMD命令,执行某条指令,比如执行nginx...

TrinityCore3.3.5编译过程-官方指导-踩坑总结

官方指导:主页->how to compile -> windows 指导文档写得很详细,但有不少细节点没提到,这里把过程简化总结,说明重点,及易坑点 1,安装需求 编译工具:cmake,安装最新版 a. vs2017,安装时注意勾选 Platform Toolset (x86 and x64) 若在cmake时发生错误:unknown c c...

ETL利器Kettle实战应用解析系列一【Kettle使用介绍】

: 一、ETL利器Kettle实战应用解析系列一【Kettle使用介绍】 二、ETL利器Kettle实战应用解析系列二 【应用场景和实战DEMO下载】 三、ETL利器Kettle实战应用解析系列三 【ETL后台进程执行配置方式】 本文主要阅读目录如下: 1、Kettle概念 2、下载和部署 3、Kettle环境配置 4、Kettle使用及组件介绍 ETL(...

Linux计划任务.md

crond crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。 Linux下的任务调度分为两类,系统任务调度和用户任务调度。...