当前位置: 首页 > java >正文

Dockerfile实战:从零构建自定义CentOS镜像

Dockerfile文件

# this is a dockerfile
FROM centos:7 
# 基础环境
MAINTAINER Shane 1554096735@qq.com 
# 指定作者和邮箱
RUN echo "正在构建镜像!!!"
WORKDIR /home/shane  # 设置工作目录
COPY 123.txt /home/shane  
# 123.txt和dockerfile文件在一个目录下,使用相对路径
RUN yum install -y net-tools # 确保可以使用ipconfig

如果安转不了net-tools,请在此之前更换软件源;

# 更换镜像源
RUN sed -i -e 's|mirrorlist=|#mirrorlist=|g' /etc/yum.repos.d/CentOS-*.repo \&& sed -i -e 's|#baseurl=http://mirror.centos.org|baseurl=http://mirrors.aliyun.com|g' /etc/yum.repos.d/CentOS-*.repo

构建

使用docker build -t mycentos:v2 .命令进行构建(别忘记最后要指定当前位置的目录’.')
在这里插入图片描述

验证成功!!!

在这里插入图片描述

拓展

  1. docker history 容器id/name 可以查看镜像构建时候的分层结构。
    假如不在本机构建的命令会显示<missing>
    在这里插入图片描述

镜像的分层结构

在这里插入图片描述
特点
镜像层只读,容器层可读可写。
对容器的任何改动都发生在容器层。
容器会从上到下的读取镜像层的数据载入/删除。
详解:
在Docker的架构中,镜像和容器采用了分层存储的机制。镜像由多个只读层(Read-Only Layers)组成,这些层包含了应用程序运行所需的基础环境、依赖库和应用程序代码等。每个镜像层都是不可变的,这意味着一旦创建就不能被修改。

当基于一个镜像启动容器时,Docker会在镜像层之上创建一个可读写的容器层(Container Layer),也称为"可写层"或"容器可写层"。这个容器层是容器运行时唯一可以修改的部分。任何对容器的更改,包括文件系统的修改、新文件的创建、现有文件的删除等操作,都只会影响这个容器层,而不会改变底层的镜像。

当容器需要访问某个文件时,Docker会按照从上到下的顺序在容器层和镜像层中查找该文件。如果文件存在于容器层,则直接使用容器层中的版本;如果文件不存在于容器层,则会继续在镜像层中查找,直到找到该文件或确认文件不存在为止。这种机制使得多个容器可以共享同一个镜像,同时又能保持各自的独立性。

例如,假设我们有一个包含Python应用程序的Docker镜像,该镜像由以下层组成:

  1. 基础操作系统层(如Ubuntu)
  2. Python运行时层
  3. 应用程序代码层

当我们基于这个镜像启动一个容器时,Docker会在这三个只读镜像层之上创建一个可读写的容器层。如果我们在容器中修改了某个Python文件,这个修改只会保存在容器层中,而不会影响镜像中的原始文件。同样,如果我们在容器中安装了新的软件包,这些更改也只会存在于容器层中。

这种分层机制带来了多个优势:

  1. 节省存储空间:多个容器可以共享同一个镜像,只需要存储各自容器层的差异。
  2. 提高效率:镜像层可以被缓存和复用,加快容器的启动速度。
  3. 保证一致性:镜像的只读特性确保了基础环境的稳定性,避免了意外修改。
  4. 简化管理:容器层的隔离使得容器的创建、删除和迁移变得更加简单和安全。
http://www.xdnf.cn/news/6001.html

相关文章:

  • Python爬虫实战:研究进制流数据,实现逆向解密
  • 【优选算法 | 字符串】字符串模拟题精选:思维+实现解析
  • 【python实用小脚本-59】连续刷题7天,手动整理编程题目效率低下,Python代码5分钟搞定,效率提升80%(附方案)
  • 力扣刷题Day 48:盛最多水的容器(283)
  • Linux操作系统中的SOCKET相关 - Socket字节序调整与网络传输
  • Kubernetes 标签和注解
  • 【软件测试】第一章·软件测试概述
  • 行动算子(知识)
  • GZip+Base64压缩字符串在ios上解压报错问题解决(安卓、PC模拟器正常)
  • 服务器中存储空间不足该怎么办?
  • IP协议的特性
  • 大白话解释联邦学习
  • skolelinux系统详解
  • Proxmox VE 8.4.0显卡直通完整指南:NVIDIA Tesla T4 实战
  • 什么是懒加载?
  • 06_java常见集合类底层实现
  • unity 制作某个旋转动画
  • 分割一切(SAM) 论文阅读:Segment Anything
  • 用vue和go实现登录加密
  • 科研领域开源情报应用:从全球信息网络到创新决策
  • 微机原理|| 流水灯实验
  • 两种常见的C语言实现64位无符号整数乘以64位无符号整数的实现方法
  • 【嵌入式】记一次解决VScode+PlatformIO安装卡死的经历
  • Apifox使用方法
  • Xianyu AutoAgent,AI闲鱼客服机器人
  • 无人机信号监测系统技术解析
  • codeforcesE. Anna and the Valentine‘s Day Gift
  • 在 STM32 上使用 register 关键字
  • 部署大模型:解决ollama.service: Failed with result ‘exit-code‘的问题
  • ROS多机集群组网通信(四)——Ubuntu 20.04图形化配置 Ad-Hoc组网通信指南