编写 Dockerfile 将服务构建成镜像教程

文摘   2024-12-09 10:58   安徽  

什么是 Dockerfile

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

Dockerfile 的作用

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

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

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

Dockerfile 指令介绍

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

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

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

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

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

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

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

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

编写一个Dockerfile

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

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

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

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

# 暴露容器的 8080 端口
EXPOSE 8080

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

再给大家看一个构建 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"]

如果我们的服务非常的复杂,我们也可以将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-springboot 的名称和 latest 的标签。构建完成后,你可以通过 docker images 命令查看新创建的镜像。

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

docker run -d -p 8080:8080 my-springboot:latest

到此我们就掌握了Dockerfile的基础内容,以及如何构建自己的镜像服务,因为考虑到大部分人的基础不是很多,因此没有写的那么复杂,大家可以深入的再去学习一下。

欢迎大家关注我的公众号,将会为大家推荐更优质的内容!

青檬小栈
科长技术小栈,分享各种技术文章和教程集合。欢迎大家的关注!
 最新文章