1. 什么是镜像?

镜像是一个轻量级、独立、可执行的软件包,它包含软件运行所需的所有内容:代码、运行时、库、环境变量和配置文件。Docker 镜像是最常用的容器镜像格式。

 

2. 镜像构建

使用 Dockerfile 构建 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"]
	

 

3. 构建 Docker 镜像

在包含 Dockerfile 的目录中运行以下命令来构建 Docker 镜像:

docker build -t mywebapi:latest .

-t mywebapi:为镜像指定一个标签(tag),其中 mywebapi 是镜像名称,没有显式指定标签时,默认为 latest

其中 <repository>:<tag> 是镜像名称和标签的组合,通常使用 : 的格式

.:表示 Dockerfile 所在的当前目录

 

4.镜像管理

镜像管理涉及到对已构建的镜像进行存储、共享、更新和清理等操作。

 

4.1 列出本地镜像:

docker images

 

4.2 删除本地镜像:

docker rmi image_id_or_name

 

4.3 查找镜像:

docker search image_name

 

5.远程仓库管理

 

5.1 推送镜像到远程仓库:

将本地构建的镜像推送(push)到远程仓库(如 Docker Hub)。前提是需要登录远程仓库

docker push myusername/myapp:v1

 

5.2 从远程仓库拉取镜像:

docker pull myusername/myapp:v1

 

最佳实践

 

  • 精简镜像:尽量减少镜像的大小,避免不必要的依赖和文件。

     

  • 安全审查:定期审查和更新镜像中的软件包,确保安全性。

     

  • 版本控制:使用语义化版本控制,管理和发布不同版本的镜像。

     

  • 自动化构建:使用 CI/CD 工具自动化构建和部署镜像。

     

  • 定期清理:定期清理不再使用的本地和远程镜像,释放资源和存储空间。

     

通过合理的镜像构建和管理实践,可以帮助开发团队更高效地管理和部署容器化应用程序,提升系统的安全性、可靠性和可维护性。