如何使用Dockerfile创建容器映像

如何使用Dockerfile创建容器映像

Dockerfile是一个基于文本的文档,用于创建容器映像。它为映像构建器提供有关要运行的命令、要复制的文件、启动命令等的说明。在这篇博客中,我们将介绍如何编写一个Dockerfile来生成一个可立即运行的应用程序容器映像。

Dockerfile 示例

以下是一个简单的Dockerfile示例,它将生成一个可立即运行的Python应用程序:

dockerfile 复制代码
FROM python:3.12
WORKDIR /usr/local/app

# Install the application dependencies
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

# Copy in the source code
COPY src ./src
EXPOSE 5000

# Setup an app user so the container doesn't run as the root user
RUN useradd app
USER app

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"]

Dockerfile 通用指令

Dockerfile中一些最常见的指令包括:

  • FROM - 指定构建将扩展的基本图像。
  • WORKDIR - 指定"工作目录"或图像中复制文件和执行命令的路径。
  • COPY - 从主机复制文件并将它们放入容器映像中。
  • RUN - 运行指定的命令。
  • ENV - 设置正在运行的容器将使用的环境变量。
  • EXPOSE - 配置映像要公开的端口。
  • USER - 为所有后续指令设置默认用户。
  • CMD ["", ""] - 设置使用此映像的容器将运行的默认命令。

要通读所有说明或更详细地了解,请查看Dockerfile参考.

快速入门:构建Node.js应用程序的Dockerfile

在这个快速动手指南中,我们将编写一个Dockerfile来构建一个简单的Node.js应用程序。如果您不熟悉基于JavaScript的应用程序,请不要担心,按照以下步骤操作即可。

设置

  1. 下载并解压这个ZIP文件到您的机器上。
  2. 下载并安装Docker Desktop
  3. 在与package.json相同的文件夹中创建一个名为Dockerfile的文件。

创建Dockerfile

在Dockerfile中,通过添加以下行来定义您的基本映像:

dockerfile 复制代码
FROM node:20-alpine

使用WORKDIR指令定义工作目录。这将指定未来命令将在哪里运行,目录文件将被复制到容器映像中:

dockerfile 复制代码
WORKDIR /usr/local/app

使用COPY指令将机器上项目中的所有文件复制到容器映像中:

dockerfile 复制代码
COPY . .

使用yarn CLI和包管理器安装应用程序的依赖项。为此,请使用RUN指令运行命令:

dockerfile 复制代码
RUN yarn install --production

最后,使用CMD指令指定要运行的默认命令:

dockerfile 复制代码
CMD ["node", "./src/index.js"]

有了这些步骤,你应该有以下Dockerfile:

dockerfile 复制代码
FROM node:20-alpine
WORKDIR /usr/local/app
COPY . .
RUN yarn install --production
CMD ["node", "./src/index.js"]

需要注意的是,此Dockerfile尚未遵循所有最佳实践(按设计)。它将构建应用程序,但构建不会像它们可能的那样快,并且图像可能不够安全。以下是一些改进建议:

  1. 使用多阶段构建:减少最终映像的大小。
  2. 缓存依赖项:最大化构建缓存,提高构建速度。
  3. 非root用户运行:提高容器的安全性。
相关推荐
Davie_Liu5 小时前
【Docker Buildx】docker buildx本地构建多架构镜像,拉取镜像时的网络延迟问题(已解决)
网络·docker·buildx
_Walli_5 小时前
k8s集群搭建(三)-------- Dashboard UI
云原生·容器·kubernetes
target酱9 小时前
Docker部署全流程
前端·docker
橙*^O^*安11 小时前
Kubernetes集群部署Jenkins指南
云原生·容器·kubernetes·jenkins·devops
Anthony_23111 小时前
MySQL的常用命令
运维·数据库·mysql·adb·docker
傻傻虎虎11 小时前
【Docker】常用帮忙、镜像、容器、其他命令合集(1)
运维·docker·容器
2301_7943339111 小时前
Docker Compose 运行 Milvus (Mac) 并与 python 连接测试
macos·docker·milvus
三十_17 小时前
【Docker】学习 Docker 的过程中,我是这样把镜像越做越小的
前端·后端·docker
Lin_Aries_042118 小时前
使用阿里云容器镜像服务 ACR
linux·阿里云·docker·云原生·centos·云计算
zzz.1019 小时前
【Kubernetes知识点】CRD客户资源定义及Gateway
云原生·容器·kubernetes