
镜像是一个轻量级、独立、可执行的软件包,它包含软件运行所需的所有内容:代码、运行时、库、环境变量和配置文件。Docker 镜像是最常用的容器镜像格式。
Dockerfile 是一个包含一系列指令的文本文件,用于描述如何构建 Docker 镜像,镜像构建是将应用程序及其依赖项打包成一个可部署的镜像的过程。在 Docker 中,通常使用 Dockerfile 来定义镜像的构建步骤和配置。
以下是一些常用的 Dockerfile 指令及其功能:
FROM:指定基础镜像,用于构建当前镜像的基础。例如:FROM ubuntu:20.04
。
WORKDIR:设置工作目录,在该目录下执行后续的命令。例如:WORKDIR /app
。
RUN:执行命令,用于安装依赖、运行脚本等。例如:RUN apt-get update && apt-get install -y curl
.
COPY 和 ADD:复制文件或目录到镜像中。COPY
用于复制本地文件,而 ADD
不仅可以复制本地文件,还支持自动解压缩和 URL 路径。例如:COPY . /app
。
CMD 和 ENTRYPOINT:定义容器启动时执行的命令。CMD
指定默认的容器启动命令,ENTRYPOINT
定义容器的主要执行命令。例如:CMD ["python", "app.py"]
。
EXPOSE:声明容器内部服务监听的端口。例如:EXPOSE 8080
。
以下为NET6 WEBAPI Dockerfile 示例
# 使用官方 .NET SDK 镜像作为构建环境
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env
WORKDIR /app
# 将 .csproj 文件复制并恢复依赖项
COPY *.csproj ./
RUN dotnet restore
# 复制所有项目文件
COPY . ./
# 构建项目
RUN dotnet publish -c Release -o out
# 使用官方 .NET 运行时镜像作为运行环境
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
# 从构建阶段复制已发布的输出文件
COPY --from=build-env /app/out .
# 暴露应用程序运行的端口
EXPOSE 80
# 运行应用程序
ENTRYPOINT ["dotnet", "MyWebApi.dll"]
在包含 Dockerfile 的目录中运行以下命令来构建 Docker 镜像:
docker build -t mywebapi:latest .
-t mywebapi:为镜像指定一个标签(tag),其中 mywebapi 是镜像名称,没有显式指定标签时,默认为 latest
其中 <repository>:<tag> 是镜像名称和标签的组合,通常使用
.:表示 Dockerfile 所在的当前目录
镜像管理涉及到对已构建的镜像进行存储、共享、更新和清理等操作。
docker images
docker rmi image_id_or_name
docker search image_name
将本地构建的镜像推送(push)到远程仓库(如 Docker Hub)。前提是需要登录远程仓库
docker push myusername/myapp:v1
docker pull myusername/myapp:v1
精简镜像:尽量减少镜像的大小,避免不必要的依赖和文件。
安全审查:定期审查和更新镜像中的软件包,确保安全性。
版本控制:使用语义化版本控制,管理和发布不同版本的镜像。
自动化构建:使用 CI/CD 工具自动化构建和部署镜像。
定期清理:定期清理不再使用的本地和远程镜像,释放资源和存储空间。
通过合理的镜像构建和管理实践,可以帮助开发团队更高效地管理和部署容器化应用程序,提升系统的安全性、可靠性和可维护性。