一、背景介绍

  响应公司技术发展路线,开发的服务均需要将打成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. WEB应用服务器都有哪些?

    大型WEB服务器在UNIX和Linux平台下使用最广泛的免费HTTP服务器是W3C.NCSA和APACHE服务器,而Windows平台NT/2000/2003使用IIS的WEB服务器.在选择使用WEB ...

  2. fcitx无法切换到中文(manjaro)

    安装fcitx后不能切换到中文输入法,在.bashrc或者.profile中添加以下代码: #fcitx export GTK_IM_MODULE=fcitx  export QT_IM_MODULE ...

  3. java:Maven(Maven_ssm)

    1.maven_ssm: DOS命令向maven仓库导入jar包: mvn install:install-file -Dfile=F:\jars\json-lib-2.4-jdk15.jar -Dg ...

  4. Linux进程的虚拟内存

    简介 用户进程的虚拟地址空间是Linux的一个重要的抽象:它为每个运行进程提供了同样的系统视图,这使得多个进程可以同时运行,而不会干扰到其他进程内存中的内容. 每个应用程序都有自己的线性地址空间,与所 ...

  5. 手机app打开的web,在打开chrome浏览器

    手机app打开的web在,打开chrome浏览器 <a href='intent://#Intent;action=android.intent.action.VIEW;scheme=googl ...

  6. nginx下配置vue前端项目

    server { listen 80; server_name _; root /opt/h5/index/; location / { index index.html index.htm inde ...

  7. 【机器学习】HK算法(LMSE算法) LMS算法改进保证线性可分时均方误差标准能够找到线性可分的超平面

    1.其实HK算法思想很朴实,就是在最小均方误差准则下求得权矢量. 他相对于感知器算法的优点在于,他适用于线性可分和非线性可分得情况,对于线性可分的情况,给出最优权矢量,对于非线性可分得情况,能够判别出 ...

  8. JavaScript学习总结(一)——闭包、对象、函数

    一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...

  9. map member functions

    http://www.cplusplus.com 搜了才发现map的成员函数这么多orz,跟着cplusplus按字典序走一遍叭(顺序有微调orz <1>  map::at (c++11) ...

  10. gcc数据对齐之: howto 1.

    GCC支持用__attribute__为变量.类型.函数.标签指定特殊属性.这些不是编程语言标准里的内容,而属于编译器对语言的扩展. 本文介绍其中的两个属性:aligned和packed. align ...