建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
设置昵称

在此一键设置昵称,即可参与社区互动!

确定
我再想想
选择版块
鲲鹏论坛 主题:7962帖子:269143

【技术讨论】

通过欧拉提供的docker_save和docker_load工具进行分层镜像制作

zzhouz 2021/2/24 1490

原理介绍:

    当前大多应用都是使用相同的基础镜像层和lib层,只有应用层不一样,如果都是独立打包会占用很大的物理空间,一般针对这类只涉及应用层不一致的场景,我们会把Docker基础镜像进行分层打包,一般分为三层tarball,base层、lib层、应用层;通过欧拉提供的docker_save和docker_load工具进行分层打包,打出多份镜像,公共层占用的物理空间都是相同的一块,能节约很多的物理空间,如下图所示:

image.png 

制作过程:

1. 制作基础镜像层

当前存在baseimage基础镜像包baseimage,通过FusionStage镜像仓库可以查到10.21.252.61:20202/gdcrm/baseimage
下载基础镜像到本地服务器
docker pull 10.21.252.61:20202/gdcrm/baseimage
下载过程
SZX1000399607:~/liuyi # docker pull 10.21.252.61:20202/gdcrm/baseimage
Using default tag: latest
latest: Pulling from gdcrm/baseimage
a35579ce456b: Already exists
0a15bfde0b4c: Already exists
49d3f4e19a07: Already exists
226c66284e98: Already exists
aa5cb9619ad7: Already exists
Digest: sha256:03af03a9bb27ead13df1181df10d101fcf201271a5888f51a0e64d7b574ec058
Status: Downloaded newer image for 10.21.252.61:20202/gdcrm/baseimage:latest
成功后本地查询
SZX1000399607:~/liuyi # docker images -a |grep baseimage
10.21.252.61:20202/gdcrm/baseimage latest 8205e03ffdb0 12 days ago 81.43 MB

2. 制作lib镜像层,随便写个.c
vi foo.c
#ifndef foo_h__
#define foo_h__
extern void foo(void);
#endif //foo_h__
#include <stdio.h>
void foo(void)
{
    puts("Hello, I'm foo.");
}
编译libfoo.so出来
gcc -fPIC -shared foo.c -o libfoo.so
检查编译结果
SZX1000399607:~/liuyi/mutliLayerDocker/libDocker # ls
foo.c libfoo.so
写Docker文件
SZX1000399607:~/liuyi/mutliLayerDocker/libDocker # vi Dockerfile.libfoo
FROM 10.21.252.61:20202/gdcrm/baseimage
COPY libfoo.so /usr/lib64
生成基础+lib镜像,在~/liuyi/mutliLayerDocker/libDocker目录下
docker build -t baseimage:libfoo -f Dockerfile.libfoo .
执行过程
SZX1000399607:~/liuyi/mutliLayerDocker/libDocker # docker build -t baseimage:libfoo -f Dockerfile.libfoo .
Sending build context to Docker daemon 13.31 kB
Step 1 : FROM 10.21.252.61:20202/gdcrm/baseimage
---> 8205e03ffdb0
Step 2 : COPY libfoo.so /usr/lib64
---> cfca0f38bf48
Removing intermediate container dd32039f1d59
Successfully built cfca0f38bf48
检查结果
SZX1000399607:~/liuyi/mutliLayerDocker/libDocker # docker images -a| grep libfoo
baseimage libfoo cfca0f38bf48 About a minute ago 81.44 MB

3. 制作应用层镜像
SZX1000399607:~/liuyi/mutliLayerDocker/app # ls
Dockerfile.app app.tar.gz
写Docker文件
SZX1000399607:~/liuyi/mutliLayerDocker/app # vi Dockerfile.app
FROM baseimage:libfoo
ADD app.tar.gz /home/apps
CMD /home/apps/run.sh
生成应用镜像
docker build -t lymultilayer -f Dockerfile.app .
执行过程
SZX1000399607:~/liuyi/mutliLayerDocker/app # docker build -t lymultilayer -f Dockerfile.app .
Sending build context to Docker daemon 26.98 MB
Step 1 : FROM baseimage:libfoo
---> cfca0f38bf48
Step 2 : ADD app.tar.gz /home/apps
---> 842ecdcb270a
Removing intermediate container 3a61f77114be
Step 3 : CMD /home/apps/run.sh
---> Running in df9d09ec99d6
---> 237b26819b0f
Removing intermediate container df9d09ec99d6
Successfully built 237b26819b0f
检查结果
docker images -a |grep lymultilayer
SZX1000399607:~/liuyi/mutliLayerDocker/app # docker images -a |grep lymultilayer
lymultilayer latest 237b26819b0f About a minute ago 111.4 MB

4.导出镜像
docker_save -l baseimage:libfoo lymultilayer
执行过程
SZX1000399607:~/liuyi/mutliLayerDocker/multiLayer # docker_save -l baseimage:libfoo lymultilayer
saving...
saving /root/liuyi/mutliLayerDocker/multiLayer/Images/lymultilayer_latest_lib_image.tar.gz done
saving /root/liuyi/mutliLayerDocker/multiLayer/Images/lymultilayer_latest_base_image.tar.gz done
saving /root/liuyi/mutliLayerDocker/multiLayer/Images/lymultilayer_latest_image.tar.gz done
检查结果

对应目录multiLayer多了个Images目录,进去查询发现导出三层
SZX1000399607:~/liuyi/mutliLayerDocker/multiLayer/Images # ll
total 80932
-rw-r--r-- 1 root root 1928080 Jan 22 15:38 lymultilayer_latest_base_image.tar.gz
-rw-r--r-- 1 root root 26979538 Jan 22 15:38 lymultilayer_latest_image.tar.gz
-rw-r--r-- 1 root root 53863246 Jan 22 15:38 lymultilayer_latest_lib_image.tar.gz
-rw-r--r-- 1 root root 390 Jan 22 15:38 manifest

5.加载镜像
将上述导出Images目录打包,发送到公共机器上,此处实际可以多加应用层
SZX1000399607:~/liuyi/mutliLayerDocker/multiLayer # docker_load -d Images
Do you mean to load lymultilayer:latest?(Y/N)Y
loading...
loading lymultilayer:latest done.

检查结果
SZX1000399607:~/liuyi/mutliLayerDocker/multiLayer # docker images -a |grep lymultilayer
lymultilayer latest 237b26819b0f 17 minutes ago 111.4 MB



回复2

2021/2/24 21:41

一般什么场景下会用分层镜像呢,第一次接触到这个概念

2021/3/15 01:06

day(11):2021 HDC预热签到+永远支持华为,感谢华为,感谢华为云,一起加油

上划加载中
直达楼层
标签
您还可以添加5个标签
  • 没有搜索到和“关键字”相关的标签
  • 云产品
  • 解决方案
  • 技术领域
  • 通用技术
  • 平台功能
取消

采纳成功

您已采纳当前回复为最佳回复

zzhouz

发帖: 8粉丝: 2

发消息 + 关注

发表于2021年02月24日 16:43:56 1490 2
直达本楼层的链接
楼主
显示全部楼层
[技术讨论] 通过欧拉提供的docker_save和docker_load工具进行分层镜像制作

原理介绍:

    当前大多应用都是使用相同的基础镜像层和lib层,只有应用层不一样,如果都是独立打包会占用很大的物理空间,一般针对这类只涉及应用层不一致的场景,我们会把Docker基础镜像进行分层打包,一般分为三层tarball,base层、lib层、应用层;通过欧拉提供的docker_save和docker_load工具进行分层打包,打出多份镜像,公共层占用的物理空间都是相同的一块,能节约很多的物理空间,如下图所示:

image.png 

制作过程:

1. 制作基础镜像层

当前存在baseimage基础镜像包baseimage,通过FusionStage镜像仓库可以查到10.21.252.61:20202/gdcrm/baseimage
下载基础镜像到本地服务器
docker pull 10.21.252.61:20202/gdcrm/baseimage
下载过程
SZX1000399607:~/liuyi # docker pull 10.21.252.61:20202/gdcrm/baseimage
Using default tag: latest
latest: Pulling from gdcrm/baseimage
a35579ce456b: Already exists
0a15bfde0b4c: Already exists
49d3f4e19a07: Already exists
226c66284e98: Already exists
aa5cb9619ad7: Already exists
Digest: sha256:03af03a9bb27ead13df1181df10d101fcf201271a5888f51a0e64d7b574ec058
Status: Downloaded newer image for 10.21.252.61:20202/gdcrm/baseimage:latest
成功后本地查询
SZX1000399607:~/liuyi # docker images -a |grep baseimage
10.21.252.61:20202/gdcrm/baseimage latest 8205e03ffdb0 12 days ago 81.43 MB

2. 制作lib镜像层,随便写个.c
vi foo.c
#ifndef foo_h__
#define foo_h__
extern void foo(void);
#endif //foo_h__
#include <stdio.h>
void foo(void)
{
    puts("Hello, I'm foo.");
}
编译libfoo.so出来
gcc -fPIC -shared foo.c -o libfoo.so
检查编译结果
SZX1000399607:~/liuyi/mutliLayerDocker/libDocker # ls
foo.c libfoo.so
写Docker文件
SZX1000399607:~/liuyi/mutliLayerDocker/libDocker # vi Dockerfile.libfoo
FROM 10.21.252.61:20202/gdcrm/baseimage
COPY libfoo.so /usr/lib64
生成基础+lib镜像,在~/liuyi/mutliLayerDocker/libDocker目录下
docker build -t baseimage:libfoo -f Dockerfile.libfoo .
执行过程
SZX1000399607:~/liuyi/mutliLayerDocker/libDocker # docker build -t baseimage:libfoo -f Dockerfile.libfoo .
Sending build context to Docker daemon 13.31 kB
Step 1 : FROM 10.21.252.61:20202/gdcrm/baseimage
---> 8205e03ffdb0
Step 2 : COPY libfoo.so /usr/lib64
---> cfca0f38bf48
Removing intermediate container dd32039f1d59
Successfully built cfca0f38bf48
检查结果
SZX1000399607:~/liuyi/mutliLayerDocker/libDocker # docker images -a| grep libfoo
baseimage libfoo cfca0f38bf48 About a minute ago 81.44 MB

3. 制作应用层镜像
SZX1000399607:~/liuyi/mutliLayerDocker/app # ls
Dockerfile.app app.tar.gz
写Docker文件
SZX1000399607:~/liuyi/mutliLayerDocker/app # vi Dockerfile.app
FROM baseimage:libfoo
ADD app.tar.gz /home/apps
CMD /home/apps/run.sh
生成应用镜像
docker build -t lymultilayer -f Dockerfile.app .
执行过程
SZX1000399607:~/liuyi/mutliLayerDocker/app # docker build -t lymultilayer -f Dockerfile.app .
Sending build context to Docker daemon 26.98 MB
Step 1 : FROM baseimage:libfoo
---> cfca0f38bf48
Step 2 : ADD app.tar.gz /home/apps
---> 842ecdcb270a
Removing intermediate container 3a61f77114be
Step 3 : CMD /home/apps/run.sh
---> Running in df9d09ec99d6
---> 237b26819b0f
Removing intermediate container df9d09ec99d6
Successfully built 237b26819b0f
检查结果
docker images -a |grep lymultilayer
SZX1000399607:~/liuyi/mutliLayerDocker/app # docker images -a |grep lymultilayer
lymultilayer latest 237b26819b0f About a minute ago 111.4 MB

4.导出镜像
docker_save -l baseimage:libfoo lymultilayer
执行过程
SZX1000399607:~/liuyi/mutliLayerDocker/multiLayer # docker_save -l baseimage:libfoo lymultilayer
saving...
saving /root/liuyi/mutliLayerDocker/multiLayer/Images/lymultilayer_latest_lib_image.tar.gz done
saving /root/liuyi/mutliLayerDocker/multiLayer/Images/lymultilayer_latest_base_image.tar.gz done
saving /root/liuyi/mutliLayerDocker/multiLayer/Images/lymultilayer_latest_image.tar.gz done
检查结果

对应目录multiLayer多了个Images目录,进去查询发现导出三层
SZX1000399607:~/liuyi/mutliLayerDocker/multiLayer/Images # ll
total 80932
-rw-r--r-- 1 root root 1928080 Jan 22 15:38 lymultilayer_latest_base_image.tar.gz
-rw-r--r-- 1 root root 26979538 Jan 22 15:38 lymultilayer_latest_image.tar.gz
-rw-r--r-- 1 root root 53863246 Jan 22 15:38 lymultilayer_latest_lib_image.tar.gz
-rw-r--r-- 1 root root 390 Jan 22 15:38 manifest

5.加载镜像
将上述导出Images目录打包,发送到公共机器上,此处实际可以多加应用层
SZX1000399607:~/liuyi/mutliLayerDocker/multiLayer # docker_load -d Images
Do you mean to load lymultilayer:latest?(Y/N)Y
loading...
loading lymultilayer:latest done.

检查结果
SZX1000399607:~/liuyi/mutliLayerDocker/multiLayer # docker images -a |grep lymultilayer
lymultilayer latest 237b26819b0f 17 minutes ago 111.4 MB



镜像服务 Docker

举报
分享

分享文章到朋友圈

分享文章到微博

采纳成功

您已采纳当前回复为最佳回复

重新来过

发帖: 212粉丝: 12

发消息 + 关注

发表于2021年02月24日 21:41:34
直达本楼层的链接
沙发
显示全部楼层

一般什么场景下会用分层镜像呢,第一次接触到这个概念

点赞 评论 引用 举报

采纳成功

您已采纳当前回复为最佳回复

hwlinzhiying

发帖: 2粉丝: 1

发消息 + 关注

发表于2021年03月15日 01:06:45
直达本楼层的链接
板凳
显示全部楼层

day(11):2021 HDC预热签到+永远支持华为,感谢华为,感谢华为云,一起加油

点赞 评论 引用 举报

游客

富文本
Markdown
您需要登录后才可以回帖 登录 | 立即注册

结贴

您对问题的回复是否满意?
满意度
非常满意 满意 一般 不满意
我要反馈
0/200