当前位置: 首页 > article >正文

【docker】Dockerfile指令讲解,与企业案例应用

Dockerfile 简介

Dockerfile 是一个文本文件,包含了构建 Docker 镜像所需的所有命令。通过执行 docker build 命令,Docker 会按照 Dockerfile 中的指令一步步构建出镜像。

Dockerfile 基本结构

一个简单的 Dockerfile 可能包含以下内容:

FROM ubuntu:20.04
LABEL maintainer="youremail@example.com"
RUN apt-get update && apt-get install -y \
    curl \
    vim \
    git
WORKDIR /app
COPY . /app
ENV APP_ENV=production
EXPOSE 8080
CMD ["python", "app.py"]

常用指令详解

指令说明示例使用场景
FROM指定基础镜像,Docker 会从该镜像开始构建新的镜像。FROM ubuntu:20.04基础镜像选择,例如从一个最小的 Ubuntu 镜像开始构建。
LABEL给镜像添加元数据(如维护者信息、版本等)。LABEL maintainer="youremail@example.com"添加镜像元数据,便于管理和标识镜像。
RUN在镜像内运行命令,例如安装依赖、更新包等。RUN apt-get update && apt-get install -y curl vim git安装软件包,设置环境等。
WORKDIR设置工作目录,后续的命令将在此目录下执行。WORKDIR /app设置工作目录,方便后续操作。
COPY将本地文件复制到容器内。COPY . /app复制本地项目文件到容器中。
ADD类似 COPY,但支持自动解压 .tar 文件并可以从 URL 下载文件。ADD file.tar.gz /app从 URL 下载文件或解压文件。
ENV设置环境变量。ENV NODE_ENV=production设置容器内的环境变量,如生产或开发环境。
EXPOSE声明容器将要监听的端口。EXPOSE 8080在容器内声明端口,方便映射到主机。
CMD容器启动时运行的默认命令,可以在 docker run 时覆盖。CMD ["python", "app.py"]容器启动时运行的主进程。
ENTRYPOINT定义容器启动时固定的命令,通常用于设置不可修改的容器行为。ENTRYPOINT ["python"]
CMD ["app.py"]
设置容器启动时的固定命令,并可追加参数。

企业运用 Docker 的常用案例及指令运用

案例 1: 微服务架构中的 Dockerfile 指令

假设有一个公司 A 在开发微服务架构的应用,每个微服务都是独立的 Docker 容器。为了让这些微服务能够在不同的环境中稳定运行,Dockerfile 是非常重要的工具。

示例 Dockerfile:

FROM node:14
LABEL maintainer="devops@companyA.com"
RUN apt-get update && apt-get install -y curl
WORKDIR /app
COPY . /app
RUN npm install
ENV NODE_ENV=production
EXPOSE 3000
CMD ["node", "server.js"]

解释:

  1. FROM node:14:这里选择了一个 Node.js 镜像作为基础镜像,因为微服务使用 Node.js 编写。
  2. LABEL maintainer=“devops@companyA.com”:添加镜像的维护者信息,以便跟踪和管理。
  3. RUN apt-get update && apt-get install -y curl:安装一些常见工具,如 curl,方便容器内部执行网络请求。
  4. WORKDIR /app:设置工作目录为 /app,后续命令将在该目录下执行。
  5. COPY . /app:将本地代码复制到容器的 /app 目录中。
  6. RUN npm install:安装项目的所有依赖。
  7. ENV NODE_ENV=production:设置环境变量为生产环境。
  8. EXPOSE 3000:告诉 Docker 容器将监听 3000 端口,通常是 Node.js 应用的端口。
  9. CMD [“node”, “server.js”]:容器启动时运行 node server.js,启动该微服务的主进程。

案例 2: 持续集成和持续部署(CI/CD)中的 Dockerfile 使用

在公司 B 的持续集成流程中,Dockerfile 被用于自动化构建和部署应用。每当有新的代码推送到 Git 仓库,CI/CD 系统会触发 Docker 构建镜像并部署到测试环境中。

示例 Dockerfile:

FROM ubuntu:20.04
LABEL maintainer="ci@companyB.com"
RUN apt-get update && apt-get install -y python3-pip git
WORKDIR /project
COPY . /project
RUN pip3 install -r requirements.txt
ENV APP_ENV=staging
EXPOSE 8080
CMD ["python3", "app.py"]

解释:

  1. FROM ubuntu:20.04:基础镜像选择 Ubuntu 20.04,适用于 Python 项目。
  2. LABEL maintainer=“ci@companyB.com”:标记镜像的维护者信息,便于团队内部跟踪。
  3. RUN apt-get update && apt-get install -y python3-pip git:安装 Python 和 Git,保证在容器内能够拉取代码和安装依赖。
  4. WORKDIR /project:设置工作目录为 /project,后续命令将在此目录下执行。
  5. COPY . /project:将代码复制到容器的 /project 目录。
  6. RUN pip3 install -r requirements.txt:安装 Python 项目的依赖包。
  7. ENV APP_ENV=staging:设置环境变量为 staging(测试环境)。
  8. EXPOSE 8080:暴露 8080 端口,通常是 Web 应用的端口。
  9. CMD [“python3”, “app.py”]:容器启动时,运行 app.py,启动应用。

案例 3: 数据分析应用中的 Dockerfile 使用

公司 C 专注于数据分析和机器学习模型的部署,Dockerfile 被用于创建可复用的数据分析环境。

示例 Dockerfile:

FROM python:3.8-slim
LABEL maintainer="data@companyC.com"
RUN pip install --upgrade pip && pip install numpy pandas matplotlib
WORKDIR /analysis
COPY . /analysis
ENV DATA_PATH=/data
EXPOSE 8888
CMD ["jupyter", "notebook", "--ip=0.0.0.0", "--allow-root"]

解释:

  1. FROM python:3.8-slim:选择了一个轻量级的 Python 镜像,适用于数据分析应用。
  2. LABEL maintainer=“data@companyC.com”:标记镜像的维护者信息。
  3. RUN pip install --upgrade pip && pip install numpy pandas matplotlib:安装常见的数据分析库,如 NumPy、Pandas、Matplotlib。
  4. WORKDIR /analysis:设置工作目录为 /analysis,所有数据分析工作都会在此目录下进行。
  5. COPY . /analysis:将分析代码和数据文件复制到容器中。
  6. ENV DATA_PATH=/data:设置数据文件的路径。
  7. EXPOSE 8888:暴露 Jupyter Notebook 默认的端口 8888。
  8. CMD [“jupyter”, “notebook”, “–ip=0.0.0.0”, “–allow-root”]:启动 Jupyter Notebook,允许远程访问。

总结

通过以上企业案例的应用,我们可以看到 Dockerfile 的常用指令如何在实际中帮助团队构建、部署和管理 Docker 镜像。不同的公司和项目可以根据需求选择合适


http://www.kler.cn/a/421626.html

相关文章:

  • python脚本:Word文档批量转PDF格式
  • [NOIP2015 提高组] 神奇的幻方
  • JS querySelector方法的优点
  • jvm-46-jvm Thread Dump 线程的信息获取+可视分析化工具 FastThread
  • 经典C语言代码——part 19(链表)
  • AD软件如何快速切换三维视图,由2D切换至3D,以及如何恢复
  • 数据结构自测5
  • java垃圾回收机制介绍
  • linux模拟试题
  • Seatunnel解决ftp读取json文件无法读取数组以及格式化之后的json无法解析的问题
  • TypeScript和JavaScript的区别
  • 如何使用brew安装phpredis扩展?
  • 零基础学安全--Burp Suite(4)proxy模块以及漏洞测试理论
  • CTF之WEB(php弱类型绕过)
  • openGauss极致RTO流程讲解及运维方法
  • vue实现懒加载
  • 30分钟学会正则表达式
  • Wwise SoundBanks内存优化
  • renderExtraFooter 添加本周,本月,本年
  • 数据库——创建索引的原则
  • 学成在线day08
  • k8s 亲和性之Affinity
  • 《Python基础》之Pandas库
  • PostgreSQL认证培训需要什么条件
  • 上天入地,智能诊断,多语言支持,璞华IETM打造产品技术信息管理极致用户体验
  • Python虚拟环境管理工具:Pipenv