编写 Dockerfile 将服务构建成镜像

什么是 Dockerfile
Dockerfile 是一个文本文件,包含了构建 Docker 镜像的所有指令。这些指令描述了从基础镜像开始,如何安装软件、配置环境变量、复制文件等操作,最终构建出一个可运行的 Docker 容器。

Dockerfile 的作用
自动化构建:Dockerfile 使得构建过程是可重复和自动化的,可以快速创建自定义镜像。

可移植性:通过 Dockerfile 打包应用程序及其依赖,可以在不同环境和平台上运行,实现应用程序的可移植性。

版本控制:Dockerfile 可以被版本控制,方便团队协作和镜像的迭代更新。

Dockerfile 指令介绍
这里介绍一些常用的指令,当然 Dockerfile 的指令也不单单只有这些:

FROM:指定基础镜像,作为构建新镜像的起点。后续的指令将在这个基础镜像之上进行操作。例如可以选择官方的编程语言镜像、操作系统镜像等。

WORKDIR:设置容器内的工作目录。后续的指令如果没有指定绝对路径,都将在这个工作目录下执行。

COPY:将本地文件或目录复制到容器内。可以指定源文件路径和目标容器内路径。

EXPOSE:声明容器在运行时监听的端口。这只是声明端口,并不实际开放端口,实际开放端口需要在运行容器时使用 -p 参数进行映射。

CMD:定义容器启动时执行的命令。可以是单个命令,也可以是一个命令数组。

RUN:在构建镜像时执行指定的命令。可以用于安装软件包、执行脚本等操作。

ENV:设置环境变量。可以在容器内的后续指令中使用这些环境变量。

编写一个 Dockerfile
我们先看一个 Dockerfile(它的文件名就叫做 Dockerfile)示例,这是一个构建运行.Net 6 项目的镜像服务:



# 使用 .Net6 作为基础镜像
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base

# 设置工作目录为 /app
WORKDIR /app

# 项目的根目录拷贝 项目 文件到当前目录
COPY ["NetCoreWeb/NetCoreWeb.csproj", "NetCoreWeb/"]

# 暴露容器的 5080 端口
EXPOSE 5080

# 定义容器启动时执行的命令,这里使用 dotnet 命令运行 dll 文件
ENTRYPOINT ["dotnet", "NetCoreWeb.dll"]


再给大家看一个构建 python flask 项目的示例:



# 使用官方 Python 镜像作为基础镜像
FROM python:3.9-slim

# 设置工作目录为 /app
WORKDIR /app

# 将本地的 requirements.txt 复制到容器中的 /app 目录下
COPY requirements.txt .

# 使用 pip 安装依赖
RUN pip install --no-cache-dir -r requirements.txt

# 将本地的 Flask 应用代码复制到容器中的 /app 目录下
COPY . .

# 暴露容器的 5000 端口,Flask 默认端口
EXPOSE 5000

# 定义容器启动时执行的命令,运行 Flask 应用
CMD ["python", "app.py"]

再给大家看一个构建 Java SpringBoot 项目的示例:



# 使用 Java 作为基础镜像
FROM openjdk:11-jre-slim

# 设置工作目录为 /app
WORKDIR /app

# 项目的根目录拷贝 jar 文件到当前目录
COPY target/*.jar ./app.jar

# 暴露容器的 5080 端口
EXPOSE 5080

# 定义容器启动时执行的命令,这里使用 java 命令运行 jar 文件
CMD ["java", "-jar", "app.jar"]

如果我们的服务非常的复杂,我们也可以将 ubuntu 作为基础镜像,在 ubuntu 中去执行一些 shell 命令安装需要的环境来满足我们的服务运行,例如:



 
# 使用官方 Ubuntu 镜像作为基础镜像
FROM ubuntu:latest

# 设置环境变量,避免安装过程中的交互
ENV DEBIAN_FRONTEND=noninteractive

# 更新 Ubuntu 软件包列表
RUN apt-get update && apt-get upgrade -y

# 安装 Nginx
RUN apt-get install -y nginx

# 复制自定义配置文件(如果有)
# COPY ./mynginx.conf /etc/nginx/nginx.conf

# 复制网站内容到 Nginx 的默认托管目录
# COPY ./mywebsite /var/www/html

# 暴露 Nginx 的默认端口 80 和 443
EXPOSE 80 443

# 启动 Nginx 服务
CMD ["nginx", "-g", "daemon off;"]


我们尽量在 Dockerfile 中,少使用 RUN 关键词,尽量把命令都放在一个 RUN 中,不然会导致镜像构建出来非常的大。例如可以这样优化:



 
# 更新 Ubuntu 软件包列表
RUN apt-get update && apt-get upgrade -y

# 安装 Nginx
RUN apt-get install -y nginx

# 优化后
RUN apt-get update && apt-get upgrade -y && apt-get install -y nginx


构建镜像
镜像不是写完 Dockerfile 就会自动出现,而是需要使用 docker build 命令进行构建的:



docker build -t my-srpingboot:latest .

这个命令的作用就是在当前目录下查找 Dockerfile,使用它来构建一个新的 Docker 镜像,并给这个新镜像打上 my-app 的名称和 latest 的标签。构建完成后,你可以通过 docker images 命令查看新创建的镜像。

然后我们就可以使用 docker run 去启动这个镜像:



docker run -d -p 5080:5080 my-app:latest

© 版权声明

☆ END ☆
喜欢就点个赞吧
点赞0 分享
图片正在生成中,请稍后...