一、背景介绍

  响应公司技术发展路线,开发的服务均需要将打成docker镜像,使用docker进行统一管理。可是随着服务越来越多,镜像也越来越多。每次制作镜像的时候都需要将依赖打进容器,这样一个jre的环境就是100多M。有一天突发奇想,容器能不能共用宿主机的环境?这样每次打镜像时体积就会少不少。于是就动手试试了试,结果还真可以,哈哈。

二、测试

  我们测试用的是java的web项目做的测试,框架用的springboot,由于集成了tomcat插件,所以web项目打成jar包即可运行。

  1、在宿主机上安装jdk环境,目录在/home/softwares/jdk1.8.0_151。

  2、制作没有jdk环境的镜像。

  Dockerfile文件内容如下:

  *****************************************************************************

  From debian:latest

  ADD springWeb.jar /app.jar

  ENV JAVA_HOME="/home/softwares/jdk1.8.0_151"

  ENV PATH="${PATH}:${JAVA_HOME}/bin:${JAVA_HOME}/sbin"

  ENTRYPOINT [ "java", "-jar", "/app.jar" ]

  ******************************************************************************

  以上镜像是没有jdk环境的,所以在生成容器的时候一定要把宿主机jdk目录挂载到容器中。

  3、生成镜像

  docker build -t jdktest .

  注释:jdktest是镜像的名字。

  4、生成容器

  docker run -d --name jdktest -p 8088:8081 -v /home/softwares:/home/softewares --restart=always jdktest

  5、打开8088端口,然后用浏览器访问项目地址,成功!

三、优点

  1、它的优点很明显,减少许多镜像体积。

    debian系统有的只有5M不到,加上自己的一个jar包,镜像可能也就30M不到。而一个jre1.8的环境就得100多M。可以所体积减少很多。

四、缺点

  1、增加了容器对宿主机的依赖性。

    一旦宿主机的运行环境进行升级或改动,必定影响容器的运行。

  2、增加了新人交接的难度。

    生成容器时必须要将宿主机的运行环境目录挂载到容器中,也就是上面的 -v /home/softwares:/home/softewares操作。若没有此操作,容器是生成后就退出了。若进

   行新人交接时,他不知道要进行环境目录挂载,后面就GG了。

五、影响

  目前尚不清楚运行环境目录挂载至容器中对项目运行的影响或不稳定性,以上只供测试使用。若大家对这种做法有什么看法,欢迎来交流。

docker容器共享宿主机环境,从而为镜像体积减负的更多相关文章

  1. 如何让Docker容器随宿主机的启动而自动启动

    使用Docker容器部署服务时,不仅需要让服务随Docker容器的启动而启动,还需要让Docker容器随宿主机的启动而自动启动,为此Docker提供了Docker run的restart参数 #doc ...

  2. docker容器和宿主机之间复制文件

    https://blog.csdn.net/u012416928/article/details/55049063 https://blog.csdn.net/u011596455/article/d ...

  3. docker容器与宿主机的数据交互

    在生产环境中使用 Docker ,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作. 方式一.Docker cp命令 docker cp :用于容器与主机之间 ...

  4. Docker容器获取宿主机信息

    最近在做产品授权的东西,开始宿主机为Window,程序获取机器硬件信息相对简单些,后来部署时发现各种各样的的环境问题,所有后来改用dokcer部署,docker方式获取宿主机信息时花了些时间,特此记录 ...

  5. Docker 容器与宿主机网段冲突导致网络无法 ping 通的解决方案

    docker 容器网络默认使用 bridge 桥接模式,正常情况下,容器会使用 daemon.json 中定义的虚拟网桥来与宿主机进行通讯. 最近更新 Docker for mac 之后,发现以前容器 ...

  6. 【docker】docker容器和宿主机之间文件互传,互相拷贝

    原文地址:https://www.cnblogs.com/areyouready/p/8973495.html [注意:命令中符号均为英文符号] 1.从容器里面拷文件到宿主机 答:在宿主机里面执行以下 ...

  7. 记一次自启动的docker容器将宿主机的开机用户登录界面覆盖事件

    宿主机的系统为CentOS7_7.7.1908,默认为GUI启动,安装了宝塔面板,docker-ce为最新版. 在启动了一个centos7的容器(镜像为centos官方镜像)后,将该容器重启策略设置为 ...

  8. Docker容器和宿主机互传文件

    1.docker容器向宿主机传送文件 格式: docker cp container_id:<docker容器内的路径> <本地保存文件的路径> 例: docker cp 10 ...

  9. docker容器与宿主机之间内容拷贝

    来自:http://blog.csdn.net/yangzhenping/article/details/43667785 常用的方式有3种: 从容器内拷贝文件到主机上 docker cp <c ...

随机推荐

  1. java并发编程 线程间协作

    线程间协作 1. 等待和通知 等待和通知的标准形式 等待方: 获取对象锁 循环中判断条件是否满足,不调用wait()方法 条件满足执行业务逻辑 通知方: 获取对象所 改变条件 通知所有等待在对象的线程 ...

  2. C#学习笔记二 (资源托管,泛型,数组和元组,运算符和类型强制转换)

     托管和非托管资源 1.托管资源是指GC管理的内存空间,非托管资源是指文件句柄,网络连接,数据库连接等. 2.方法中临时申请的变量,被存放在栈中.栈存储非对象成员的值数据.例如在方法中有B b=new ...

  3. Metinfo3.0 /include/common.inc.php PHP代码注入

  4. 【linux杂谈】安装linux虚拟机的时候发现的full name,user name有啥区别

    本人为了重温linux,在新电脑上又要安装linux虚拟机,在VMware内配置快速安装的时候看到有如下说明: 大家可能跟我一样对于username比较熟悉,但是这个fullname是干嘛的?我们先进 ...

  5. C语言Ⅰ作业12—学期总结

    一.我学到的内容 二.我的收获 作业链接 收获 C语言Ⅰ博客作业01 认识了PTA编程,博客园,Markdown基本语法1,Markdown基本语法2 C语言Ⅰ博客作业02 PTA系统常见问题解答 C ...

  6. [转帖].NET Core 项目指定SDK版本

    .NET Core 项目指定SDK版本 https://www.cnblogs.com/stulzq/p/9503121.html 一. 版本里的坑 自从 .NET Core 2.1.0版本发布以后, ...

  7. vue-loader介绍和单页组件介绍

    $ \es6\sing-file>  npm install vue-loader@14.1.1 -D vue-template-compiler@2.5.17 -D npm install v ...

  8. trigraph

    trigraph是c/c++对之前键盘无法输入一些符号而做出的补充设计,将以下字符用其他三个字符来代替 # ??= \ ??/ ^ ??' [ ??( ] ??) { ??< } ??> ...

  9. C++中的类型识别

    1,为什么会提出类型识别概念呢? 1,为什么在 C 语言中没有提出这个概念呢,就是因为在 C++ 中引入了面向对象的特性,面向对象里面有一个非常重要的原则就是赋值兼容性原则: 2,在面向对象中可能出现 ...

  10. 原生CURD

    <?phpheader("content-type:text/html;charset=utf8");$link=mysqli_connect("127.0.0.1 ...