docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > dockerfile构建docker镜像

docker利用dockerfile构建镜像

作者:肖哥弹架构

dockerfile是一种用于定义和构建docker镜像的文本文件,由一行行指令和参数组成,用于描述镜像的构建和配置过程;由基础映像、软件包安装、文件拷贝、环境变量设置等组成

dockerfile是一种用于定义和构建docker镜像的文本文件,由一行行指令和参数组成,用于描述镜像的构建和配置过程;由基础映像、软件包安装、文件拷贝、环境变量设置等组成;

基于dockerfile构建镜像可以使用docker build命令,使用 -f 可以指定具体的dockerfile文件;

使用dockerfile构建镜像的步骤如下:编写dockerfile文件-->docker build构建镜像-->docker run运行镜像;

Dockerfile概述

Dockerfile文件需放置在一个目录中,这个目录中有构建镜像的所有文件,是本次执行的上下文路目录(可以理解为docker根目录),可以创建子目录。
在Dockerfile文件中,"#“号开头表示注释,每行为"INSTRUCTION arguments”,习惯大写表示关键字(但并不区分大小写),后面小写表示值。
每个Dockerfile的第一行(注释行除外),必须使用"FROM"关键字。
当使用docker build构建镜像时,会将我们指定的上下文目录打包传递给docker引擎。这个上下文目录中并非所有文件都会在Dockerfile中使用,传送给docker引擎的目录过大会影响构建速度,可以在此目录中定义.dockerignore文件,将不使用的文件的文件名写入到.dockerignore文件屏蔽掉,且支持通配符。
最小化镜像的层数,Dockerfile中每一行命令就是一层,层数过多影响构建效率。
Dockerfile文件中命令从上往下逐行执行。

DockerFile镜像的指令和参数

Dockerfile 是一个文本文件,它包含了用于构建 Docker 镜像的一系列指令和参数。以下是 Dockerfile 的常见结构和组成部分:

指令说明
FROM指定基础镜像,开始构建新镜像
RUN执行命令并创建新的镜像层
CMD提供容器启动时执行的默认命令
ENTRYPOINT设置容器启动时的入口点
COPY从构建上下文复制新文件或目录到镜像中
ADD类似于 COPY,但可以解压缩归档文件并添加执行权限
ENV设置环境变量
ARG定义构建时使用的变量
VOLUME定义一个挂载点,用于数据持久化或共享
EXPOSE声明容器运行时监听的端口
WORKDIR设置工作目录
USER指定运行命令的用户
HEALTHCHECK定义容器的健康检查命令
ONBUILD指定当所创建的镜像作为其他镜像的基础镜像时执行的命令
STOPSIGNAL配置停止容器的信号
LABEL为镜像添加元数据
SHELL指定用于执行 RUN、CMD、ENTRYPOINT 和 SCRIPT 指令的 shell
MAINTAINER指定维护者的姓名和一个可选的电子邮件地址(已废弃)

DockerFile镜像案例

# 使用基础镜像,这是构建新镜像的起点
FROM ubuntu:20.04 AS base

# 维护者信息(使用 LABEL 替代 MAINTAINER)
LABEL maintainer="Name <email>"

# 设置环境变量,这会影响后续的RUN指令以及容器运行时的环境
ENV MY_ENV_VAR="my_value"
ENV PATH="/usr/local/bin:${PATH}"

# RUN 指令执行命令并创建一个新的镜像层,用于安装软件包
RUN apt-get update && apt-get install -y \
    curl \
    git \
    vim

# 工作目录 :WORKDIR 设置工作目录,后续的RUN、CMD、ENTRYPOINT指令都会基于这个工作目录
WORKDIR /app

# 复制当前目录内容到容器内的 /app 目录下,COPY 从构建上下文(通常为Dockerfile所在的目录)复制新文件或目录到镜像中
COPY . /app

# 添加额外的文件到镜像中:ADD 与COPY类似,但可以处理tar压缩文件,并且可以执行一些特殊操作
ADD ./files/* /app/files/

# 定义一个挂载点:VOLUME 定义一个挂载点,用于数据持久化或容器间数据共享
VOLUME /var/log/myapp

# EXPOSE 声明容器运行时监听的端口
EXPOSE 8000

# 指定容器启动时执行的命令:CMD 指令提供容器启动时执行的默认命令,可以被docker run的参数覆盖
CMD ["python", "/app/main.py"]

# 构建阶段:编译应用,使用多阶段构建来减小最终镜像的大小
FROM base AS builder
RUN apt-get update && apt-get install -y build-essential
COPY --from=base /app /app
RUN make /app

# 生产阶段:运行应用,使用基础镜像作为构建产物的运行环境
FROM base AS production
COPY --from=builder /app/bin /app/bin
CMD ["/app/bin/myapp"]

# 健康检查: HEALTHCHECK 定义容器的健康检查命令,提高容器的可靠性
HEALTHCHECK --interval=30s --timeout=30s --retries=3 \
  CMD curl -f http://localhost:8000 || exit 1

# 用户:USER 指定运行命令的用户和用户组,提高安全性
USER 1000:1000

# 构建缓存:ARG 定义构建缓存的变量,可以用于构建过程中的参数传递
ARG BUILD_DATE
LABEL org.label-schema.build-date=$BUILD_DATE

# 停止信号:STOPSIGNAL 配置停止容器的信号,可以是任何POSIX停止信号或数字
STOPSIGNAL SIGTERM

# 使用 SHELL 指令 :SHELL 指定用于执行指令的shell,可以是bash、sh等
SHELL ["/bin/bash", "-c"]

解释

基础镜像: 使用 ubuntu:20.04 作为基础镜像。

维护者信息: 使用 LABEL 替代已废弃的 MAINTAINER

环境变量: 设置环境变量 MY_ENV_VAR 和更新 PATH

更新和安装软件: 使用 RUN 安装软件包。

工作目录: 设置工作目录为 /app

复制文件: 使用 COPYADD 将文件添加到镜像中。

挂载点: 定义一个挂载点。

暴露端口: 声明容器运行时监听的端口。

默认命令: 设置容器启动时执行的默认命令。

构建阶段: 使用 builder 阶段编译应用。

生产阶段: 使用 production 阶段运行应用。

健康检查: 定义容器的健康检查命令。

用户: 指定运行命令的用户。

构建缓存: 使用 ARG 定义构建时的变量。

停止信号: 配置停止容器的信号。

SHELL: 指定用于执行指令的 shell。

命令详细说明

基础镜像指令 (FROM)

FROM ubuntu:20.04

FROM 指令指定了基础镜像,这是构建新镜像的基础。

维护者指令 (MAINTAINER) (可选,已废弃,建议使用 LABEL)

LABEL maintainer="name <email>"

LABEL 用于添加元数据,替代了以前的 MAINTAINER 指令。

环境变量指令 (ENV)

ENV PATH /usr/local/bin:$PATH

 ENV 用于设置环境变量。

工作目录指令 (WORKDIR)

WORKDIR /app

 WORKDIR 设置容器内的当前工作目录。

复制指令 (COPYADD)

COPY . /app

COPY 从构建上下文复制新文件或目录到容器的文件系统。

ADDCOPY 类似,但处理归档文件时有额外的功能。

 运行指令 (RUN)

RUN apt-get update && apt-get install -y nginx

 RUN 指令用于执行命令,并将其结果(如安装的软件)作为新的镜像层保存。

暴露指令 (EXPOSE)

EXPOSE 80

EXPOSE 指令通知 Docker 守护进程容器运行时监听的端口。

启动命令指令 (CMD)

CMD ["nginx", "-g", "daemon off;"]

CMD 指令指定了容器启动时执行的默认命令。

健康检查指令 (HEALTHCHECK)

HEALTHCHECK --interval=30s --timeout=30s --retries=3 CMD curl -f http://localhost || exit 1

HEALTHCHECK 指令用于指定如何检查容器健康状况。

构建缓存指令 (ARG)

ARG VERSION=latest

ARG 指令用于定义构建过程中的变量。

多阶段构建 (FROM 在 Dockerfile 中多次使用)

# 第一阶段: 构建阶段
FROM golang:1.16 AS builder
WORKDIR /app
COPY go.* ./
RUN go mod download
COPY . .
RUN go build -o /my-go-app

# 第二阶段: 生产环境
FROM alpine:latest
RUN apk add --no-cache ca-certificates
WORKDIR /root
COPY --from=builder /my-go-app .
CMD ["./my-go-app"]

使用多阶段构建可以减小最终镜像的大小,将构建产物从构建阶段复制到生产环境镜像。

DockerFile实战案例1:Spring Boot应用

项目结构

假设我们的Spring Boot应用结构如下:

springbootapp/
├── src/
│   ├── main/
│   │   ├── java/com/
│   │   │   └── example/
│   │   │       ├── controller/
│   │   │       │   └── HelloController.java
│   │   │       └── Application.java
│   │   └── resources/
│   │       └── application.properties
├── pom.xml
└── Dockerfile

HelloController.java 是Spring Boot控制器。

Application.java 是Spring Boot应用的主程序。

application.properties 包含应用配置。

pom.xml 是Maven构建配置文件。

Dockerfile

# 使用官方Java基础镜像,带有Maven环境,用于构建项目
FROM maven:3.8.1-jdk-11 AS build
# 设置工作目录
WORKDIR /app
# 复制项目文件到容器中
COPY src ./src
COPY pom.xml .
# 使用Maven构建项目
RUN mvn -f pom.xml clean package

# 使用官方Java基础镜像,用于运行应用
FROM openjdk:11-jre-slim
# 设置工作目录
WORKDIR /app
# 从构建阶段复制已构建的jar文件到运行阶段
COPY --from=build /app/target/*.jar ./app.jar
# 暴露端口
EXPOSE 8080
# 运行Spring Boot应用
CMD ["java", "-jar", "app.jar"]

构建和运行Docker镜像

构建镜像

docker build -t springbootapp .

运行容器:

docker run -p 8080:8080 springbootapp

DockerFile实战案例2:Spring Boot和MyBatis多模块项目

项目结构

多模块Spring Boot和MyBatis应用结构如下:

multimoduleapp/
├── pom.xml
├── Dockerfile
└── app/
    ├── common/
    │   ├── pom.xml
    │   └── src/
    │       ├── main/
    │       └── java/
    │           └── com/
    │               └── example/
    │                   └── common/
    │                       └── CommonService.java
    ├── api/
    │   ├── pom.xml
    │   └── src/
    │       ├── main/
    │       │   ├── java/
    │       │   │   └── com/
    │       │   │       └── example/
    │       │   │           └── api/
    │       │   │               └── ApiController.java
    │       │   └── resources/
    │       └── application.properties
    └── service/
        ├── pom.xml
        ├── src/
        │   ├── main/
        │   │   ├── java/
        │   │   │   └── com/
        │   │   │       └── example/
        │   │   │           └── service/
        │   │   │               └── BusinessService.java
        │   │   └── resources/
        └── src/
            └── main/
                └── resources/
                    └── mapper/
                        └── UserMapper.xml

CommonService.java 是一个通用服务。

ApiController.java 是Spring Boot控制器。

BusinessService.java 是业务逻辑服务。

UserMapper.xml 是MyBatis映射文件。

pom.xml 是Maven构建配置文件。

Dockerfile

# 使用官方Java基础镜像,带有Maven环境,用于构建项目
FROM maven:3.8.1-jdk-11 AS build
# 设置工作目录
WORKDIR /app
# 复制项目文件到容器中
COPY . .
# 使用Maven构建项目
RUN mvn -f pom.xml clean package

# 使用官方Java基础镜像,用于运行应用
FROM openjdk:11-jre-slim
# 设置工作目录
WORKDIR /app
# 从构建阶段复制已构建的jar文件到运行阶段
COPY --from=build /app/api/target/*.jar ./app.jar
# 暴露端口
EXPOSE 8080
# 运行Spring Boot应用
CMD ["java", "-jar", "app.jar"]

构建和运行Docker镜像

构建镜像

docker build -t multimoduleapp .

运行容器:

docker run -p 8080:8080 multimoduleapp

总结

到此这篇关于docker利用dockerfile构建镜像的文章就介绍到这了,更多相关dockerfile构建docker镜像内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文