Docker 镜像概念及操作

Docker 专栏文章索引 👉Docker 简介 👉Docker 安装图文教程 👉Docker 镜像概念及操作 👉Dockerfile 深入理解

@[TOC](Docker 镜像及操作)

🟧1. 镜像

🟠1.1 什么是镜像

🎈镜像其实就是一种轻量级的、可以被执行的独立软件包,它包含了运行某个软件所需要的所有内容。通常,我们将应用程序和配置依赖打包形成一个可交付的运行环境(包括代码、运行时所需要的库、环境变量和配置文件等),这个打包好的运行环境就称为镜像 (image) 文件。

🟠1.2 联合文件系统

🎈联合文件系统(UnionFS)是一种分层的、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,UnionFS 是 Docker 镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(无父镜像),可以制作各种具体的应用镜像。

特点:一次同时加载多个文件系统,但是从外部只能看到一个文件系统,因为联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

🟠1.3 Docker 镜像加载原理

🎈Docker 的镜像由一层层的文件系统组成,这样层级的文件系统叫做 bootfs(boot file system),属于联合文件系统。bootfs 主要包含 bootloader 和 kernel,bootloader 主要用来引导加载 kernel,Linux 刚启动时会加载 bootfs 文件系统,在 Docker 镜像的最底层是引导文件系统 bootfs.

🎈bootfs 与典型的 Linux/Unix 系统类似,包含了 bootloader 和 kernel,当 boot 加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs 转交给内核,此时系统也会卸载 bootfs.

🎈bootfs 的上一层是 rootfs(root file system),包含的是 Linux 系统中的 /dev/, /proc, /bin, /ect 等标准目录和文件。实际上,rootfs 就是各种不同操作系统的发行版,例如 ubuntu,centos 等。

🖌思考:通常在虚拟机中创建的 CentOS 都有数G以上,为什么在 Docker 中才200M左右?

🎈其实是因为,对于一个精简版的操作系统,rootfs 可以非常小,只需要包含基本的命令、工具和程序库即可,因为底层直接使用宿主机的 kernel,自己只需要提供 rootfs 便可。此外,即使存在不同的 Linux 发行版本,但是 bootfs 基本都是一致的,可以公用 bootfs.

🟠1.4 Docker 镜像为什么要采用分层结构

镜像分层的一个最大优点就是,共享资源,便于复用。

🎈例如,如果多个镜像都是从相同的 base 镜像构建的,那么 docker 主机只需要在磁盘上保存一份 base 镜像,同时在内存中也只要加载一份 base 镜像便可以为所有容器服务,镜像的每一层都可以被共享。

🚀 Docker 镜像层都是只读的,容器层是可写的 。当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称为"容器层","容器层"之下的都叫"镜像层"。 🏰 所有对容器的改动,无论添加、删除还是修改文件都只会发生在容器层中

🟧2. Docker 镜像实例 commit 操作

关于 docker 镜像实例 commit 的命令

java 复制代码
docker commit 提交容器副本使之成为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]

下面将演示在 ubuntu 镜像上安装 vim:

首先,下载 ubuntu 镜像

java 复制代码
docker pull ubuntu

之后,在本地运行下载的 ubuntu 镜像

java 复制代码
docker run -it ubuntu /bin/bash

成功运行之后,进入容器,在容器内执行以下两条命令

java 复制代码
apt-get update            //更新包管理工具
apt-get -y install vim    //安装vim

安装完成之后,退出当前容器,在容器外部 commit 已经安装完vim的镜像,容器ID就是上图中箭头所指,fa2e8f0e41bc

java 复制代码
docker commit -m="add vim cmd" -a="hzz" fa2e8f0e41bc hzz/myubuntu:1.1

查看刚刚commit的镜像

java 复制代码
docker images

运行 docker 中新 commit 的容器,容器ID就是上图中箭头所指,a92ac9f96e17

java 复制代码
docker run -it a92ac9f96e17

执行 vim 命令

java 复制代码
vim a.txt

可以发现,进入到了vim编辑模式,comiit的镜像安装vim成功

🌈 Docker 中的镜像分层,支持通过扩展现有镜像,创建新的镜像。类似 Java 继承一个 base 基础类,自己再按需扩展。新的镜像是从 base 镜像一层层叠加生成的,每安装一个软件,就在现有镜像的基础上增加一层。

🟧3. 发布本地镜像

🟠3.1 发布本地镜像到阿里云

🔸3.1.1 在阿里云创建远程仓库

首先 ,登录阿里云开发者平台,第一次使用可以支付宝账号或者淘宝账号登录注册。 之后 ,进入控制台,在"全部产品与服务"搜索框中,输入搜索"容器镜像服务",进入容器镜像与服务页面 在"实例列表"展示页面,选择新建"个人实例" 之后 ,在个人实例页面,选择 "仓库管理->命名空间->创建命名空间",自定义命名空间名称。 创建了命名空间之后,便可以开始创建"镜像仓库",创建步骤如下图所示 创建完成之后,便可以在仓库管理->镜像仓库中看到我们创建的镜像仓库,名称为 myubuntu.

🔸3.1.2 推送镜像上云端

首先,点击 "myubunut",进入仓库管理界面获取脚本 上图中已经给出了将本地镜像推送到阿里云仓库,只要根据我们的实际情况替换相关参数即可。

Bash 复制代码
docker login --username=****** registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/huazaizai/myubuntu:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/huazaizai/myubuntu:[镜像版本号]

🔸3.1.3 下载云端镜像到本地

Bash 复制代码
docker pull registry.cn-hangzhou.aliyuncs.com/huazaizai/myubuntu:[镜像版本号]

🟠3.2 发布本地镜像到私服库

🌈 在公司内部使用内网开发时,由于阿里云这样的公共镜像仓库可能不太方便,所以需要创建一个本地私人仓库供给团队使用,基于公司内部项目构建镜像。Docker Registry 是官方提供的工具,可以用于构建私有镜像仓库。

🔸3.2.1 推送镜像到私服库

首先,下载镜像

Bash 复制代码
docker pull registry

运行私有库 registry,相当于本地有个私有 Docker Hub

Bash 复制代码
//默认情况下,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便与宿主机联调
docker run -d -p 5000:5000 -v /hzz/myregistry/:/temp/registry --privileged=true registry

案例演示:在下载好的 ubuntu 镜像上安装 ifconfig 命令(原始ubuntu镜像不带ifconfig命令)

首先,运行 ubuntu 镜像

Bash 复制代码
docker run -it ubuntu /bin/bash

之后,开始安装 ifconfig 命令,在容器内执行命令

Bash 复制代码
apt-get update
apt-get install net-tools

安装完成后,在容器内执行以下命令,如果没有提示 command not found,表示安装成功

java 复制代码
ifconfig

之后,再 commit 安装好 ifconfig 的新镜像,commit 命令操作在容器外执行

Bash 复制代码
//docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
docker commit -m="ifconfig cmd add" -a="hzz" 9927dae19b90 hzzubuntu:1.2

curl 验证私服上存在的镜像, 记得这里要替换成自己的主机的IP地址

Bash 复制代码
curl -XGET http://1.15.236.224:5000/v2/_catalog  

可以看到结果为空,这是因为私服上确实还没推送镜像,因此,出现这样的结果是与实际情况一致的。

之后,将新镜像 hzzubuntu:1.2 修改符合私服规范的 tag

Bash 复制代码
//docker tag 镜像:tag host:port/repository/tag
docker tag hzzubuntu:1.2 1.15.236.224:5000/hzzubuntu:1.2

由于 docker 默认不支持 http 方式推送镜像,因此需要修改配置文件使得支持 http

Bash 复制代码
vim /etc/docker/daemon.json

添加的内容如下

Bash 复制代码
{
        "registry-mirrors": ["https://aa25jngu.mirror.aliyuncs.com"],  // 阿里云提供的镜像加速地址
        "insecure-registries": ["1.15.236.224:5000"]   // 根据自己的主机IP地址添加
}

修改完成之后,如果还不生效,可以考虑重启 docker 服务(非必要不重启

Bash 复制代码
systemctl docker restart

将本地镜像推送到私服库

Bash 复制代码
docker push 1.15.236.224:5000/hzzubuntu:1.2

验证私服库上是否有镜像

Bash 复制代码
curl -XGET http://1.15.236.224:5000/v2/_catalog

从上图可以看到,私服库上已经有了刚推送的镜像!

🔸3.2.2 从私服库拉取镜像

首先,为了避免已有的本地镜像对拉取效果的影响,先将已有的 hzzubuntu:1.2 镜像删除掉

Bash 复制代码
docker rmi -f dd26a41647d7  // hzzubuntu:1.2 镜像的ID,根据自己的情况替换

查看所有镜像,确认已经删除 拉取私服库上的镜像

Bash 复制代码
docker pull 1.15.236.224:5000/hzzubuntu:1.2

拉取成功后,在本地运行镜像

Bash 复制代码
docker run -it dd26a41647d7 /bin/bash
相关推荐
柏油5 小时前
MySQL InnoDB 行锁
数据库·后端·mysql
咖啡调调。5 小时前
使用Django框架表单
后端·python·django
白泽talk5 小时前
2个小时1w字| React & Golang 全栈微服务实战
前端·后端·微服务
摆烂工程师5 小时前
全网最详细的5分钟快速申请一个国际 “edu教育邮箱” 的保姆级教程!
前端·后端·程序员
一只叫煤球的猫5 小时前
你真的会用 return 吗?—— 11个值得借鉴的 return 写法
java·后端·代码规范
Asthenia04126 小时前
HTTP调用超时与重试问题分析
后端
颇有几分姿色6 小时前
Spring Boot 读取配置文件的几种方式
java·spring boot·后端
AntBlack6 小时前
别说了别说了 ,Trae 已经在不停优化迭代了
前端·人工智能·后端
@淡 定6 小时前
Spring Boot 的配置加载顺序
java·spring boot·后端