docker-dockerfile入门教程

什么是dockerfile?

Docker可以通过读取dockerfile进行构建镜像。dockerfile是一个包含了用户可以在命令行中输入的所有去构建镜像命令的文本文件。使用docker build命令用户可以连续执行dockerfile中的命令去构建一个镜像。

如何编写dockerfile?

dockerfile是由docker官方自己所定义的语言组成的,所以如果需要编写dockerfile我们首先要学习dockerfile的指令。

这里我们就选几个指令进行讲解然后编写一个dockerfile作为示例来演示一下具体如何使用。

FROM指令制定基础镜像

所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。而 FROM 就是指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。

命令格式为下面三种

如果没有指定 tag /digest,则默认tag是latest,如果都没有则会报错。

WORKDIR 指定工作目录

WORKDIR指令是为了指定后续的工作目录,因为根据dockerfile进行构建其实是分层构建的,就是在上一条指令中进行了cd指令等,但是在下一条指令的时候又会回到基础的位置。所以如果我们需要切换工作目录我们就需要使用WORKDIR指令。如果指令制定的目录不存在指令会帮助进行目录的创建。

下面为WORKDIR命令的格式

ADD 更高级的复制

ADD是一个功能更强大的COPY指令,他不仅仅能够复制文件系统中的文件,同样也可以从连接中下载文件,还可以将压缩文件进行自动的解压,方便我们把外部的文件来添加到镜像当中。ADD还支持正则等多种形式,如果需要请参考官方文档。

ADD命令有下面两种形式,就是把src中的文件添加到dest当中

EXPOSE 暴露容器的端口

EXPOSE声明容器在运行时将暴露一系列的端口,但是EXPOSE的命令不会将宿主机与容器的端口进行绑定,如果你希望将宿主机的端口与容器的端口请使用-p参数。

现在Docker network的特性已经允许我们在不进行EXPOSE的情况下使用-p进行绑定端口,但是为了让镜像更加的标准化我们还是推荐将EXPOSE命令写入dockerfile当中。

下面为EXPOSE的命令形式

CMD 容器启动命令

Docker 不是虚拟机,容器就是进程。既然是进程,那么在启动容器的时候,需要指定所运行的程序及参数。CMD 指令就是用于指定默认的容器主进程的启动命令的。

对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义,从而退出,其它辅助进程不是它需要关心的东西。一个镜像只能有一个CMD命令,如果有多个CMD命令,那么将只有最后一个生效。

下面是容器启动命令的形式

一个简单的例子

这里是我们这个例子的文件结构。

然后编辑index.py文件,这里用 Python 程序来提供一个简单的 HTTP 服务,打印出访问者的 IP 和 实际的本地 IP。下面为index.py文件的内容。

生成一个临时的 index.html 文件,其内容会被 index.py 更新。

生成一个 Dockerfile,内容为

这里dockerfile中的几条指令在上面我们都已经进行讲解过。我们可以直接利用docker build命令在web目录进行镜像的构建。

至此我们就完成了一个简单的镜像构建,可以通过docker run 跑起来自己尝试一下。

打赏