Dockerfile是构建Docker镜像的配方。
这就是工作流程:首先你创建一个Dockefile,然后你用docker build ,从它建立一个Docker镜像,最后你从镜像中运行一个容器。
Dockerfile是一个文本文件,包含如何构建镜像的说明。
这些指令是配置语言的一部分,其中包括关键字,如FROM 、LABEL 、RUN 、COPY 、ENTRYPOINT 、CMD 、EXPOSE 、ENV 等等。
让我们来创建我们的第一个Docker文件。
假设你有一个文件夹,里面有一个简单的Node.js应用程序,由一个app.js ,一个package.json 文件,其中列出了你在运行应用程序之前需要安装的几个依赖项,以及package-lock.json 。
在它里面,创建一个名为Dockerfile 的纯文本文件,没有扩展名,有这样的内容。
FROM node:14
WORKDIR /usr/src/app
COPY package*.json app.js ./
RUN npm install
EXPOSE 3000
CMD ["node", "app.js"]
注意:在
CMD行中使用双引号。单引号会导致错误。
在第一行,我们说我们要从哪个图像开始。这将是我们的基本图像。在这种情况下,它将采用官方的Node.js镜像,基于Alpine Linux,使用Node 14。当从Docker文件中创建一个容器时,Docker将从Docker Hub获得该镜像。
接下来我们将工作目录设置为/usr/src/app ,这意味着我们所有的命令都将在这个文件夹中运行,直到我们再次改变它。这是一个我们知道已经存在于Node镜像中的文件夹。
我们将当前文件夹中存在的package.json 、package-lock.json (使用* 通配符)和app.js 文件复制到工作目录中。
我们运行npm install 来安装package.json 文件中列出的软件包。
然后,我们将3000端口暴露给外界,因为我们的应用程序就是在这个端口上运行的。除非你使用EXPOSE 命令暴露它的一个端口,否则容器是100%与网络隔离的。我们稍后会看到如何将我们电脑上的端口映射到Docker容器中的端口。
最后,我们运行node app.js ,以启动该应用程序。
这是一个Docker文件,我们很快就会看到如何从它那里实际创建一个容器。