Docker进阶:深入了解 Dockerfile

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Dockerfile 是定义 Docker 镜像内容和构建步骤的文本文件,用于定制化镜像构建,包括基础镜像选择、软件安装和环境变量设置等。其优点在于支持容器化趋势,简化快速部署和交付,保证环境一致性,实现资源隔离和安全性,以及促进持续集成与持续部署。Dockerfile 指令如 FROM(指定基础镜像)、RUN(执行命令)、CMD(容器启动命令)和 EXPOSE(声明端口)。编写规则包括使用大写指令、创建 .dockerignore 文件排除无关文件等。

image.png

一、Dockerfile 概述

Dockerfile 是用来定义 Docker 镜像里的内容和构建步骤的文本文件。通过编写 Dockerfile,可以定制化镜像的构建过程,包括基础镜像选择、软件安装、环境变量设置等操作。通过编写 Dockerfile,用户可以自定义和构建自己的 Docker 镜像,实现应用程序的快速部署和跨环境运行。


二、Dockerfile 优点

1、容器化趋势: 容器化技术正在成为软件开发和部署的主流趋势。Docker 是当前最流行的容器化平台之一,而 Dockerfile 是定义 Docker 镜像的关键工具,掌握 Dockerfile 可以帮助开发人员更好地理解和应用容器化技术。


2、快速部署与交付: 使用 Dockerfile 可以定义应用程序的环境和依赖,将其打包成镜像,使得应用程序能够在不同环境中快速部署和交付。这种标准化的部署方式大大简化了部署流程,提高了开发团队的工作效率。


3、环境一致性: 通过 Dockerfile 构建的镜像可以确保应用程序在不同环境中的一致性运行,避免了因环境差异导致的问题,从而提高了应用程序的可移植性和稳定性。


4、资源隔离与安全性: Docker 容器提供了资源隔离和安全性,使用 Dockerfile 可以定义容器的运行环境和权限,确保应用程序在容器中的安全运行。


5、持续集成与持续部署: Dockerfile 可以作为持续集成和持续部署流程的一部分,帮助构建自动化的部署流程。


三、Dockerfile 编写规则

Dockerfile 是一个文本文件,其中包含用于构建 Docker 镜像的指令。每个指令都会创建一层,并且可以基于之前的层构建。


1、文件名以 Dockerfile命名。


2、Dockerfile 中引用的所有文件都应该与 Dockerfile 文件处于相同的目录层级,在 Dockerfile 中引用文件时,默认路径是相对于 Dockerfile 所在的目录。


3、Dockerfile 中非注释行的第一行必须是 FROM 指令,用于指定基础镜像。


4、注释:以井号(#)开头,用于注释 Dockerfile 中的内容。


5、通常为了提高可读性和一致性,建议按照惯例以大写形式书写 Dockerfile 指令,例如:

# Nginx基础镜像,并指定了使用最新版本

FROM nginx:latest

# 将本地的 nginx.conf 文件复制到容器中的 /etc/nginx 目录下

COPY nginx.conf /etc/nginx/nginx.conf

# 暴露 Nginx 的默认 HTTP 端口

EXPOSE 80

INSTRUCTION:指令,是关键字,告诉 Docker 如何处理后续的命令。

arguments:指令的参数,具体取决于指令的类型。

6、编写 Dockerfile 时,可以在同一目录下创建一个名为 .dockerignore 的文件,并根据需要列出需要排除的文件和目录。这样可以确保在构建 Docker 镜像时,只包含必要的文件,避免不必要的文件被添加到镜像中,减小镜像大小并提高构建效率。


以下是一些示例 .dockerignore 文件的用法:


# 忽略所有 .git 目录

.git


# 忽略所有 .DS_Store 文件

.DS_Store


# 忽略 log 目录及其下所有内容

log/


# 忽略 Dockerfile 中引用的一些文件

四、Dockerfile 中常用的指令

指令                    含义

FROM 镜像             指定基础镜像,用于构建新镜像的起点。

MAINTAINER 名字 说明镜像的维护人信。已在Docker中弃用,建议使用LABEL代替

RUN 命令             在镜像中执行命令,用于安装软件包、设置环境等操作。

CMD                          [ " 要运行的程序"," 参数1"," 参数2"] 指定容器启动时默认要运行的命令。

EXPOSE 端口号     声明容器运行时监听的端口,但并不会自动映射到宿主机的端口。

ENV 环境变量                变量值 设置环境变量。

ADD          源文件/目录 目标文件/目录 将文件或目录复制到容器中。

COPY 源文件/目录 目标文件/目录   类 似于 ADD,将文件或目录复制到容器中,但更推荐使用 COPY。

VOLUME ["目录 "]        声明持久化目录,用于存储数据或与其他容器共享数据。

USER 用户名/UID       指定运行容器的用户。

WORKDIR 路径      设置工作目录,指定容器中命令执行的默认路径。

ONBUILD 命令 定义触发器指令,在子镜像中执行。指定所生成的镜像作为一个基础镜像时所要运行的命令

HEALTHCHECK 用于指定容器的健康检查命令,可以检查容器内应用程序的状态

以下是 Dockerfile 中常用的指令及其详细解释:

1、FROM

作用:指定基础镜像,用于构建新镜像的起点。语法:FROM 镜像名称:标签 [AS <name>]示例1:FROM python:3.9-slim示例2:FROM ubuntu:20.04标签(可选):指定基础镜像的标签,表示特定版本。[AS <name>](可选):为基础镜像设置一个别名,用于多阶段构建。

2、LABEL

作用:为镜像添加元数据,通常用于提供关于镜像的描述信息。语法:LABEL <key>=<value> <key>=<value> ...示例1:LABEL maintainer="John Doe" description="My custom image"示例2:LABEL version="1.0" description="This is a sample Docker image"

3、RUN

作用:在镜像中执行命令,用于安装软件包、设置环境等操作。语法:RUN <command>示例1:RUN apt-get update && apt-get install -y python3示例2:RUN npm install express

4、CMD

作用:容器启动时要运行的命令。语法:Exec 格式:CMD ["executable","param1","param2"]Shell 格式:CMD command param1 param2示例:Exec 格式:CMD ["nginx", "-g", "daemon off;"]Shell 格式:CMD nginx -g 'daemon off;'示例1:CMD ["python", "app.py"]示例2:CMD ["npm", "start"]

5、ENTRYPOINT

ENTRYPOINT 指令用于设置容器启动时执行的默认命令。与 CMD 不同,ENTRYPOINT 指定的命令不会被 docker run 命令中指定的命令参数覆盖,而是作为容器启动时执行的固定命令。


ENTRYPOINT 可以在 Dockerfile 中以两种方式指定:Shell 格式和 Exec 格式。


Shell 格式示例:

ENTRYPOINT echo "Hello, World"

这条命令将作为 shell 命令执行,输出 “Hello, World” 并结束容器运行。

Exec 格式示例

ENTRYPOINT ["/bin/bash", "-c", "echo Hello, World"]


目录
相关文章
|
12天前
|
Docker 容器
在Docker中,Dockerfile有哪些常见指令?
在Docker中,Dockerfile有哪些常见指令?
|
12天前
|
缓存 Docker 容器
在Docker中,docker commit生成的镜像和dockerfile生成镜像有什么区别?
在Docker中,docker commit生成的镜像和dockerfile生成镜像有什么区别?
|
13天前
|
缓存 开发者 Docker
Dockerfile是Docker容器化过程中的核心组件,它允许开发者以一种可重复、可移植的方式自动化地构建Docker镜像
【8月更文挑战第19天】Dockerfile是构建Docker镜像的脚本文件,含一系列指令定义镜像构建步骤。每条大写指令后跟至少一个参数,按序执行,每执行一条指令即生成新的镜像层。常用指令包括:FROM指定基础镜像;RUN执行构建命令;EXPOSE开放端口;CMD指定容器启动行为等。优化策略涉及减少镜像层数、选择轻量基础镜像、利用缓存及清理冗余文件。示例:基于Python应用的Dockerfile包括设置工作目录、复制文件、安装依赖等步骤。掌握Dockerfile有助于高效自动化构建镜像,加速应用部署。
20 1
|
17天前
|
NoSQL Linux MongoDB
Docker 解析:使用 Dockerfile 自动构建镜像
Docker 解析:使用 Dockerfile 自动构建镜像
35 0
|
2月前
|
运维 数据安全/隐私保护 Docker
docker(五):DockerFile
docker(五):DockerFile
36 0
docker(五):DockerFile
|
3月前
|
Docker 容器
在 EAS 构建中使用其他 Docker 功能,如自定义 Dockerfile 或多阶段构建
在 EAS 构建中使用其他 Docker 功能,如自定义 Dockerfile 或多阶段构建
|
4月前
|
数据库 Docker 容器
【Docker 专栏】使用 Dockerfile 自动化构建 Docker 镜像
【5月更文挑战第8天】Dockerfile是构建Docker镜像的关键,它包含一系列指令,用于描述应用运行环境及所需软件包。通过自动化构建,能提高效率、保证可重复性并提升灵活性。确定基础镜像、安装依赖、设置环境后,执行Dockerfile生成镜像,用于应用程序部署。虽然需要熟悉Docker技术和应用细节,但其带来的益处使其成为现代软件开发和部署的重要工具。
126 1
【Docker 专栏】使用 Dockerfile 自动化构建 Docker 镜像
|
3月前
|
缓存 Linux 开发工具
win10下docker desktop:使用dockerfile基于CentOS:8创建可以使用vim的镜像
win10下docker desktop:使用dockerfile基于CentOS:8创建可以使用vim的镜像
151 0
|
3月前
|
Cloud Native Java Docker
java一分钟之-Docker化Java应用:Dockerfile与镜像构建
【6月更文挑战第6天】本文探讨了Docker在Java应用部署中的重要性,强调了Dockerfile在保证环境一致性和提升部署效率上的作用。Dockerfile是自动化构建Docker镜像的文本文件,它的使用能实现标准化、可重复性和透明度。文章指出了编写Dockerfile时的常见问题,如指令误用、镜像体积过大和安全性不足,并提供了相应的解决策略。通过一个Spring Boot应用的实战示例,展示了如何编写Dockerfile和构建镜像。总之,掌握Dockerfile和镜像构建技巧对于优化Java应用的云原生部署至关重要。
88 0
|
4月前
|
Linux 开发工具 Docker
Ubantu docker学习笔记(三)docker账号push及Dockerfile优化
Ubantu docker学习笔记(三)docker账号push及Dockerfile优化
下一篇
云函数