5.Dockerfile
Dockerfile简介
Dockerfile 是一个文本文件,包含一系列用于自动化构建 Docker 镜像的指令和参数。通过编写 Dockerfile,你可以定义容器的环境、设置基础镜像、运行命令、复制文件等,从而创建一个自定义的 Docker 镜像。
常用命令
-
FROM: 指定基础镜像,构建的新镜像将基于该镜像。
FROM ubuntu:20.04 -
MAINTAINER: 设置镜像的作者信息(已经不推荐使用,而是使用 LABEL 指令)。
MAINTAINER Your Name <[email protected]> -
LABEL: 设置镜像的元数据信息,比如维护者、版本等。
LABEL maintainer="Your Name <[email protected]>" -
RUN: 在镜像中运行命令,用于安装软件包、配置环境等。
RUN apt-get update && apt-get install -y \
package1 \
package2 -
COPY: 将文件从主机复制到镜像中。
COPY ./source /destination -
ADD: 类似于 COPY,但还支持 URL 和解压缩功能。
ADD ./source /destination -
WORKDIR: 设置工作目录,后续命令将在这个目录下执行。
WORKDIR /app -
EXPOSE: 暴露容器运行时的端口。
EXPOSE 80 -
CMD: 设置容器启动时执行的默认命令。
CMD ["executable","param1","param2"] -
ENTRYPOINT: 设置容器启动时执行的默认命令,并允许在运行容器时提供参数。
ENTRYPOINT ["executable", "param1", "param2"]
示例文件:
# 使用 Node.js 14 作为基础镜像
FROM node:14
# 设置工作目录
WORKDIR /app
# 复制 package.json 和 package-lock.json 到工作目录
COPY package*.json ./
# 安装应用程序的依赖
RUN npm install
# 将当前目录下的所有文件复制到工作目录
COPY . .
# 暴露应用程序运行的端口
EXPOSE 3000
# 设置容器启动时执行的默认命令
CMD ["node", "app.js"]
最佳实践:
- 使用官方基础镜像: 尽量使用官方仓库提供的基础镜像,如
ubuntu,alpine,node,python等。 - 合并 RUN 命令: 将多个 RUN 命令合并为一个,减少镜像层的数量,节省空间。
- 清理缓存: 在安装软件包后,使用
apt-get clean或yum clean all来清理缓存,减小镜像大小。 - 指定标签版本: 在
FROM指令中指定版本,避免使用 latest,确保镜像的可重现性。 - 最小化层数: 尽量减少镜像的层数,以提高构建速度和减小镜像大小。
- 使用 .dockerignore: 在构建上下文目录中添加
.dockerignore文件,避免不必要的文件被复制到镜像中。
Dockerfile打包过程
Docker 镜像的打包过程通常包括编写 Dockerfile、构建镜像、推送镜像到镜像仓库等步骤。
一般步骤
- 编写 Dockerfile
- 构建镜像
- 查看构建的镜像
- 推送到镜像仓库(可选)
- 拉去镜像运行
以下创建一个 Node.js 应用演示
编写 Dockerfile
创建一个 Node.js 应用
在一个空白目录下创建一个简单的 Node.js 应用。我们假设有一个 app.js 文件,内容如下:
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello, Docker!\n');
});
const PORT = 3000;
server.listen(PORT, () => {
console.log(`Server running on http://localhost:${PORT}`);
});
创建 Dockerfile
在同一目录下创建一个名为 Dockerfile 的文件,内容如下:
# 使用 Node.js 14 作为基础镜像
FROM node:14
# 设置工作目录
WORKDIR /app
# 复制 package.json 和 package-lock.json 到工作目录
COPY package*.json ./
# 安装应用程序的依赖
RUN npm install
# 将当前目录下的所有文件复制到工作目录
COPY . .
# 暴露应用程序运行的端口
EXPOSE 3000
# 设置容器启动时执行的默认命令
CMD ["node", "app.js"]
构建 Docker 镜像
打开终端,进入到包含 app.js 和 Dockerfile 的目录,执行以下命令:
docker build -t my-node-app:1.0 .
这将根据 Dockerfile 中的指令构建一个名为 my-node-app,标签为 1.0 的 Docker 镜像。
查看构建的镜像
执行以下命令查看构建的镜像:
docker images
找到你刚刚构建的 my-node-app 镜像,并记下其镜像 ID 或名称。