Docker学习路线7:构建容器镜像

本文涉及的产品
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 容器镜像是可执行的软件包,包括运行应用程序所需的所有内容:代码、运行时、系统工具、库和设置。通过构建自定义镜像,您可以在任何支持Docker的平台上无缝地部署应用程序及其所有依赖项。

容器镜像是可执行的软件包,包括运行应用程序所需的所有内容:代码、运行时、系统工具、库和设置。通过构建自定义镜像,您可以在任何支持Docker的平台上无缝地部署应用程序及其所有依赖项。

Dockerfile

构建容器镜像的关键组件是 Dockerfile。它本质上是一个包含有关如何组装 Docker 镜像的说明的脚本。Dockerfile 中的每个指令都会在镜像中创建一个新层,从而更容易跟踪更改并最小化镜像大小。以下是 Dockerfile 的简单示例:

# Use an official Python runtime as a parent image
FROM python:3.7-slim
# Set the working directory to /app
WORKDIR /app
# Copy the current directory contents into the container at /app
COPY . /app
# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# Make port 80 available to the world outside this container
EXPOSE 80
# Define environment variable
ENV NAME World
# Run app.py when the container launches
CMD ["python", "app.py"]

构建镜像

创建 Dockerfile 后,您可以使用 docker build 命令构建镜像。在包含 Dockerfile 的目录中的终端中执行以下命令:

docker build -t your-image-name .

此命令告诉 Docker 使用当前目录中的 Dockerfile(.)构建镜像,并为其指定名称(-t your-image-name)。

检查镜像和层

成功构建后,您可以使用 docker image 命令检查创建的镜像:

docker image ls

要更仔细地查看镜像的各个层,请使用 docker history 命令:

docker history your-image-name

要查看镜像的层,也可以使用 docker inspect 命令:

docker inspect your-image-name

要删除镜像,请使用 docker image rm 命令:

docker image rm your-image-name

将镜像推送到注册表

构建镜像后,您可以将其推送到容器注册表(例如Docker Hub、Google Container Registry等),以轻松分发和部署应用程序。首先使用您的凭据登录注册表:

docker login

然后,使用注册表 URL 标记您的镜像:

docker tag your-image-name username/repository:tag

最后,将已标记的镜像推送到注册表:

docker push username/repository:tag

构建容器镜像是使用 Docker 的重要方面,它使您可以轻松打包和部署应用程序。通过创建具有精确指令的 Dockerfile,您可以轻松地构建和分发各种平台的镜像。

高效的层缓存

在构建容器镜像时,Docker会缓存新创建的层。这些层可以在构建其他镜像时重复使用,减少构建时间并最小化带宽使用。但是,要充分利用这种缓存机制,您需要了解如何有效地使用层缓存。

Docker层缓存的工作原理

Docker为Dockerfile中的每个指令(例如**RUNCOPYADD**等)创建一个新层。如果指令自上次构建以来没有更改,Docker将重用现有的层。

例如,考虑以下Dockerfile:

FROM node:14WORKDIR /appCOPY package.json /app/RUN npm installCOPY . /app/CMD ["npm", "start"]

第一次构建镜像时,Docker将执行每个指令并为每个指令创建一个新层。如果对应用程序进行了一些更改并再次构建镜像,Docker将检查更改的指令是否影响任何层。如果没有任何层受到更改的影响,Docker将重用缓存的层。

有效使用层缓存的技巧

  • 最小化Dockerfile中的更改: 尽量减少Dockerfile中更改的频率,并以使最常更改的行出现在底部的方式构造指令。
  • 构建上下文优化: 使用**.dockerignore*文件从构建上下文中排除不必要的文件,这些文件可能会导致缓存失效。
  • 使用较小的基础镜像: 较小的基础镜像减少拉取基础镜像所需的时间以及需要缓存的层数。
  • 利用Docker的-cachefrom标志: 如果您正在使用CI / CD流水线,则可以指定要用作缓存源的镜像。
  • 组合多个指令: 在某些情况下,组合指令(例如**RUN*)可以帮助最小化层数,使缓存更有效。

遵循这些最佳实践,您可以优化层缓存过程并减少Docker镜像的构建时间,从而使您的开发和部署过程更加高效。

镜像大小和安全性

在构建容器镜像时,了解镜像大小和安全性非常重要。镜像的大小会影响容器的构建和部署速度。较小的镜像可以提高构建速度,并减少下载镜像时的网络开销。安全性也非常重要,因为容器镜像可能包含漏洞,这可能会对您的应用程序造成风险。

减小镜像大小

  • 使用适当的基础镜像:选择一个更小、更轻量级的基础镜像,仅包含应用程序所需的必要组件。例如,如果可用,请考虑使用官方镜像的“alpine”变量,因为它通常比较小。
FROM node:14-alpine
  • 在单个“RUN”语句中运行多个命令:每个“RUN”语句都会在镜像中创建一个新的层,这会增加镜像的大小。使用“&&”将多个命令组合到单个“RUN”语句中,以最小化层数并减小最终镜像大小。
RUN apt-get update && \\\\    apt-get install -y some-required-package
  • 在同一层中删除不必要的文件:在镜像构建过程中安装软件包或添加文件时,可以在同一层中删除临时或未使用的文件,以减小最终镜像大小。
RUN apt-get update && \\\\    apt-get install -y some-required-package && \\\\    apt-get clean && \\\\    rm -rf /var/lib/apt/lists/*
  • 使用多阶段构建:使用多阶段构建创建更小的镜像。多阶段构建允许您在 Dockerfile 中使用多个“FROM”语句。每个“FROM”语句在构建过程中创建一个新的阶段。您可以使用“COPY --from”语句将文件从一个阶段复制到另一个阶段。
FROM node:14-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM node:14-alpine
WORKDIR /app
COPY --from=build /app/dist ./dist
COPY package*.json ./
RUN npm install --production
CMD ["npm", "start"]
  • 使用“.dockerignore”文件:使用“.dockerignore”文件从构建上下文中排除不必要的文件,这些文件可能会导致缓存失效并增加最终镜像大小。
node_modules
npm-debug.log

提高安全性

  • 保持基础镜像更新:定期更新您在 Dockerfile 中使用的基础镜像,以确保它们包括最新的安全补丁。
  • 避免使用 root 运行容器:始终在运行容器时使用非 root 用户,以最小化潜在风险。在运行应用程序之前,创建一个用户并切换到该用户。
RUN addgroup -g 1000 appuser && \\\\    adduser -u 1000 -G appuser -D appuser
USER appuser
  • 限制“COPY”或“ADD”指令的范围:具体说明要复制到容器镜像中的文件或目录。避免使用“COPY . .”,因为它可能会意外包含敏感文件。
COPY package*.json ./
COPY src/ src/
  • 扫描镜像以查找漏洞:使用 Anchore 或 Clair 等工具扫描您的镜像以查找漏洞,并在部署之前修复它们。

遵循这些最佳实践,您将能够构建更高效和安全的容器镜像,从而提高性能并降低应用程序中漏洞的风险。

最后

为了方便其他设备和平台的小伙伴观看往期文章,链接奉上:

公众号 Let us Coding牛客知乎开源中国CSDN思否掘金InfoQ简书博客园慕课51CTOhelloworld腾讯开发者社区阿里开发者社区

看完如果觉得有帮助,欢迎点赞、收藏关注

相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。   相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
4天前
|
NoSQL Java Linux
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
132 75
|
18天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
161 77
|
26天前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
5天前
|
Unix Linux Docker
CentOS停更沉寂,RHEL巨变限制源代:Docker容器化技术的兴起助力操作系统新格局
操作系统是计算机系统的核心软件,管理和控制硬件与软件资源,为用户和应用程序提供高效、安全的运行环境。Linux作为开源、跨平台的操作系统,具有高度可定制性、稳定性和安全性,广泛应用于服务器、云计算、物联网等领域。其发展得益于庞大的社区支持,多种发行版如Ubuntu、Debian、Fedora等满足不同需求。
21 4
|
17天前
|
供应链 安全 Cloud Native
阿里云容器服务助力企业构建云原生软件供应链安全
本文基于2024云栖大会演讲,探讨了软件供应链攻击的快速增长趋势及对企业安全的挑战。文中介绍了如何利用阿里云容器服务ACK、ACR和ASM构建云原生软件供应链安全,涵盖容器镜像的可信生产、管理和分发,以及服务网格ASM实现应用无感的零信任安全,确保企业在软件开发和部署过程中的安全性。
|
20天前
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
63 3
|
26天前
|
数据库 Docker 容器
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。Dockerfile定义了构建镜像所需的所有指令,包括基础镜像选择、软件安装、文件复制等,极大提高了开发和部署的灵活性与一致性。掌握Dockerfile的编写,对于提升软件开发效率和环境管理具有重要意义。
51 9
|
26天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
67 7
|
26天前
|
存储 Prometheus 监控
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
32 5
|
26天前
|
开发框架 安全 开发者
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。本文探讨了 Docker 在多平台应用构建与部署中的作用,包括环境一致性、依赖管理、快速构建等优势,以及部署流程和注意事项,展示了 Docker 如何简化开发与部署过程,提高效率和可移植性。
58 4

相关产品

  • 容器镜像服务