Docker学习路线7:构建容器镜像
容器镜像是可执行的软件包,包括运行应用程序所需的所有内容:代码、运行时、系统工具、库和设置。通过构建自定义镜像,您可以在任何支持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中的每个指令(例如RUN、COPY、ADD等)创建一个新层。如果指令自上次构建以来没有更改,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,简书,博客园,慕课,51CTO,helloworld,腾讯开发者社区,阿里开发者社区
看完如果觉得有帮助,欢迎点赞、收藏和关注
Docker学习路线7:构建容器镜像的更多相关文章
- Docker学习之4——构建NGINX镜像
Nginx是一个高性能的Web和反向代理服务器,它具有很多非常优越的特性:1.作为Web服务器.2.作为负载均衡服务器.3.作为邮件代理服务器.4.安装及配置简单.接下来我们介绍在docker构建ng ...
- 优秀的云计算工程师需要学什么?云计算Docker学习路线
云计算工程师要学什么?随着互联网的快速发展,云计算这个词大家并不陌生,但是云计算究竟是做什么的,想要从事云计算要学习什么,很多都不知道,那么今天就给大家讲一下云计算. 云计算是基于互联网的相关服务的增 ...
- docker 学习路线
docker 学习路线 参考资料 知乎 docker 的学习路线 Docker - 从入门到实践 Docker 核心技术与实现原理 Docker 入门 <Kubernetes in Action ...
- 使用Dockerfile构建容器镜像
Dockerfile官方文档: https://docs.docker.com/engine/reference/builder/ 获取容器镜像的方法 容器镜像是容器模板,通过容器镜像才能快速创建容器 ...
- Docker学习总结(二)—— 镜像,容器
1.Docker镜像 1.1相关概念:registry :用于保存Docker镜像,包括镜像层次结构和镜像元数据,类似于git仓库之类的实体. repository:某个Docker镜像所有迭代版本 ...
- docker学习笔记(3)- 镜像
简介 在docker学习笔记(1)- 架构概述一节中可以看到镜像是docker三大组件之一,可以将Docker镜像类比为虚拟机的模版. 镜像由多个层组成,每层叠加之后从外部看就像一个独立的对象,镜像的 ...
- 026.[转] 基于Docker及Kubernetes技术构建容器云平台 (PaaS)
[编者的话] 目前很多的容器云平台通过Docker及Kubernetes等技术提供应用运行平台,从而实现运维自动化,快速部署应用.弹性伸缩和动态调整应用环境资源,提高研发运营效率. 本文简要介绍了与容 ...
- docker学习7-Dockerfile制作自己的镜像文件
前言 如果你是一个python自动化测试人员,某天你在公司终于完成了一个项目的接口自动化脚本工作,在你自己常用的本机或者服务器上调试完成了脚本,稳稳地没问题. 可是晚上下班回家,你自己找了个linux ...
- docker学习笔记2:容器操作
一.列出主机上已经创建的容器 docker ps -a 二.创建交互式容器 命令: docker run -i -t ubuntu /bin/bash 其中-i -t 表示创建一个提供交互式shell ...
- Docker学习笔记 - 创建私有的镜像仓库
一.查找镜像仓库 https://hub.docker.com/ 二.下载镜像仓库 docker pull registry:2.6.2 三.安装镜像仓库 docker run -d -p 6000: ...
随机推荐
- 如何在矩池云复现开源对话语言模型 ChatGLM
ChatGLM-6B 是一个开源的.支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数.结合模型量化技术,用户可以在消费级的显卡上进行 ...
- Excel Undo-Redo的编程问题
Excel Undo历史栈对外是不透明的. 代码对Excel表单的编辑操作会清空Excel内部的Undo历史. Application.OnUndo只支持一次撤销,并且不支持ReDo. 使用DDE的方 ...
- 【Azure Redis 缓存】Azure Redis 功能性讨论三: 调优参数配置
问题描述 在使用Azure Redis的服务中,遇见了以下系列问题需要澄清: 在开源Redis 6.0 中,多线程默认禁用,只使用主线程.如需开启需要修改redis.config配置文件.Redis的 ...
- 【Azure 应用服务】在安全漏洞扫描中发现有泄露服务器IIS版本的情况,如何实现屏蔽服务版本号信息呢?
问题描述 当对Azure App Service应用进行安全扫描时,发现了HTTP/S请求的响应头中会包含服务端IIS的版本信息,这是一个低风险因素. 如: Server: Microsoft-IIS ...
- 【Azure 存储服务】App Service 访问开启防火墙的存储账号时遇见 403 (This request is not authorized to perform this operation.)
问题描述 需要 App Service 访问开启防火墙的存储账号.存储账号中设置为允许选中的VNET访问,同时允许了信任的Azure服务的访问,但是仍然报错 "403 (This reque ...
- 详解SSL证书系列(4)免费的SSL证书和收费的证书有什么区别
上一篇介绍了如何选择SSL证书,更多地是从证书类型角度介绍的.SSL证书有免费和收费的,那么它们之间有什么区别呢? SSL证书免费和收费的主要区别体现在以下几个方面: 1,验证类型 免费SSL证书通常 ...
- SpringMVC快速复习(超详细)
目录 一.SpringMVC简介 1.什么是MVC 2.什么是SpringMVC 3.SpringMVC的特点 二.HelloWorld 1.开发环境 2.创建maven工程 a>添加web模块 ...
- centos 磁盘满
1.使用命令:df -lk 找到已满磁盘 2.使用命令:du --max-depth=1 -h 查找大文件,删除
- OPPO 后端面试凉经(附详细参考答案)
这篇文章的问题来源于一个读者之前分享的 OPPO 后端凉经,我对比较典型的一些问题进行了分类并给出了详细的参考答案.希望能对正在参加面试的朋友们能够有点帮助! Java String 为什么是不可变的 ...
- 协议CAN&报文&仲裁
简介 物理层 CAN 协议提供了 5 种帧格式来传输数据 数据链路层 中数据帧和遥控帧有标准格式和扩展格式两种,标准格式有 11 位标识符(ID),扩展格式有 29 个标识符(ID) 显性0,隐性1 ...