什么是 Dockerfile
Dockerfile 是一个文本文件,包含了构建 Docker 镜像的所有指令。这些指令描述了从基础镜像开始,如何安装软件、配置环境变量、复制文件等操作,最终构建出一个可运行的 Docker 容器。
Dockerfile 的作用
自动化构建:Dockerfile 使得构建过程是可重复和自动化的,可以快速创建自定义镜像。
可移植性:通过 Dockerfile 打包应用程序及其依赖,可以在不同环境和平台上运行,实现应用程序的可移植性。
版本控制: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的基础内容,以及如何构建自己的镜像服务,因为考虑到大部分人的基础不是很多,因此没有写的那么复杂,大家可以深入的再去学习一下。
欢迎大家关注我的公众号,将会为大家推荐更优质的内容!