5

Docker 从入门到进阶三:构建自己的镜像并分享给大家用

 2 years ago
source link: https://blog.csdn.net/qq_43762191/article/details/122813414
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

在这里插入图片描述

什么是镜像?

是什么我想大家都知道了,不过我放一段比较专业的话:是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。

只有通过这个镜像文件才能生成Docker容器实例。


镜像分层 与 联合文件系统

远的不说,我们再看一下上一篇里面的一张图,当时 run redis 的:
在这里插入图片描述

看是有五个 Pull complete 的。这说明什么?说明是下载了五个东西,最后拼出一个 redis 来。

这样有什么好处?如果积木搭好了为什么不融成一块?稍微思考思考。

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


Docker镜像加载原理

一遍没看明白可以多看两遍、

在这里插入图片描述

bootfs(boot file system) 主要包含 bootloader 和 kernel, bootloader 主要是引导加载 kernel, Linux 刚启动时会加载 bootfs 文件系统,在Docker 镜像的最底层是引导文件系统 bootfs。这一层与我们典型的 Linux/Unix 系统是一样的,包含 boot 加载器和内核。当 boot 加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs 转交给内核,此时系统也会卸载 bootfs。

rootfs (root file system) ,在 bootfs 之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs 就是各种不同的操作系统发行版,比如 Ubuntu,Centos 等等。

对于一个精简的 OS,rootfs 可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用 Host 的 kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的 linux 发行版, bootfs 基本是一致的, rootfs 会有差别, 因此不同的发行版可以公用 bootfs。

在这里插入图片描述

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


commit 构建镜像

docker commit -m="提交的描述信息" -a="作者" 基容器ID 要创建的目标镜像名:[标签名]

不多说,直接上个例子:
咱不是有个 ubuntu 原生镜像嘛,上面啥也没有,咱给它加个buff,就 vim 吧。

docker run -it ubuntu
apt update
apt install vim
docker commit -m="ubuntu + vim" -a="lionwlf" 19d42e1b312f lionwlf/myubuntu:1.1

docker images

这里的 19d42e1b312f 是我运行的 Ubuntu 容器的 ID。

可以看到有个新的 Ubuntu镜像出来:
在这里插入图片描述


本地镜像发布到阿里云

阿里云开发者平台

在这里插入图片描述

1、创建个人实例
2、创建镜像仓库
3、填完信息可选 “个人仓库”
4、自动进入 “容器镜像服务”,剩下的界面上已经讲的很清楚了,跟着做就好

这里要注意一点,命名空间和仓库名一定要对上你要推送的镜像名(所以我前面生成镜像的时候带了目录)。

在这里插入图片描述
在这里插入图片描述

弄完之后可以自己删一下本地镜像,然后从阿里云上拉下来运行一下试试看 vim 还在不在。


添加镜像到私有库

如果不是为了开源,镜像开始放到私有库吧。

Docker Registry是官方提供的工具,可以用于构建私有镜像仓库。

操作步骤:

1、下载镜像Docker Registry:docker pull registry
2、运行私有库Registry,相当于本地有个私有Docker hub:
docker run -d -p 5000:5000  -v /myregistry/:/tmp/registry --privileged=true registry
默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便于宿主机联调(容器卷下篇说)
3、构建一个新镜像
4、curl 验证私服库上有什么镜像
curl -XGET http://(IP)/v2/_catalog
5、将新镜像修改符合私服规范的Tag
按照公式: docker tag 镜像:Tag Host:Port/Repository:Tag
6、修改配置文件使之支持http
vim命令修改文件为如下内容:vim /etc/docker/daemon.json
{
  "registry-mirrors": ["不变"],
  "insecure-registries": ["你的ip:5000"]
}
7、修改完后如果不生效,建议重启docker
8、push推送到私服库
docker push (IP):5000/镜像名:[tag]
9、再次验证私服库

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK