Dockerfile
是一个用于定义 Docker 镜像构建过程的文本文件。它包含了一系列的指令,这些指令描述了如何从基础镜像创建一个新的镜像。Docker 使用这些指令自动化地构建镜像,并且可以确保创建出的镜像是一致的、可重复的。
Dockerfile 的常用指令
FROM
-
指定基础镜像。例如:
FROM ubuntu:20.04
-
每个 Dockerfile 必须以
FROM
指令开头,指定基础镜像。
RUN
-
在镜像内运行命令。常用于安装软件包或修改系统状态。例如
RUN apt-get update && apt-get install -y nginx
-
RUN
指令会创建一个新的镜像层。
CMD
-
设置容器启动时默认执行的命令。如果
docker run
命令中没有指定命令,则使用CMD
指令中的命令。例如CMD ["nginx", "-g", "daemon off;"]
-
CMD
只能有一个有效的指令,如果有多个CMD
指令,只有最后一个会生效。
ENTRYPOINT
-
指定容器启动时的主命令,并且可以配合
CMD
使用以提供默认参数。例如ENTRYPOINT ["/usr/bin/nginx"] CMD ["-g", "daemon off;"]
-
ENTRYPOINT
指令不会被docker run
命令中的参数覆盖。
COPY
-
将文件和目录从构建上下文复制到镜像内。例如
COPY ./myapp /usr/src/myapp
ADD
-
类似于
COPY
,但还支持解压缩和从 URL 下载文件。例如:ADD http://example.com/big.tar.gz /var/www/html/
WORKDIR
-
设置工作目录。后续的
RUN
、CMD
、ENTRYPOINT
指令将在这个目录下运行。例如WORKDIR /usr/src/myapp
EXPOSE
-
声明容器内的应用程序将使用的端口。例如
EXPOSE 80
-
这只是一个声明,实际的端口映射需要在运行容器时进行配置。
ENV
-
设置环境变量。例如:
ENV APP_ENV=production
VOLUME
-
创建一个挂载点,可以挂载外部存储到容器。例如
VOLUME ["/data"]
USER
-
设置容器运行时的用户。例如
USER www-data
ARG
-
定义构建时可用的变量。例如
ARG VERSION=1.0
示例 Dockerfile
以下是一个示例 Dockerfile,展示了如何创建一个简单的 Node.js 应用镜像
# 使用 Node.js 官方镜像作为基础镜像
FROM node:14
# 设置工作目录
WORKDIR /usr/src/app
# 将 package.json 和 package-lock.json 复制到工作目录
COPY package*.json ./
# 安装应用的依赖
RUN npm install
# 将应用源代码复制到工作目录
COPY . .
# 暴露应用运行的端口
EXPOSE 3000
# 启动应用
CMD ["node", "app.js"]
构建镜像
使用 docker build
命令来构建镜像
```
docker build -t my-node-app .
```
-
-t
选项用于为构建的镜像指定标签(例如my-node-app
)。 -
.
指定了构建上下文的路径,通常是 Dockerfile 所在的目录。
运行容器
使用 docker run
命令来运行基于构建镜像的容器
```
docker run -p 3000:3000 my-node-app
```
-
-p
选项用于将宿主机端口映射到容器端口。 -
my-node-app
是镜像的名称。