代码容器化

多余的午宴 · · 595 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

综述

从代码到镜像,再到跑起来的容器,就是代码容器化的过程,主要步骤是构建出对应镜像,所以容器化的基础和实质是镜像,所以也可以认为容器化过程就是从代码到镜像的过程。

容器化的过程一般有两个步骤:编译和构建。根据编程语言不同,有的语言需要编译,比如java、golang;有的语言不需要编译,比如python、nodejs,所以可以分成编译性语言容器化步骤和非编译性语言容器化步骤来进行讲解。

编译性语言代码容器化步骤(以java为例)

java代码容器化的一般步骤是:首先编译生成war包,然后,tomcat+war包启动服务。编译的过程依赖远远大于业务运行的依赖的,为求镜像的最小化,一般将编译和加载war包并运行起来分开。

总结来看,从java代码到镜像两个步骤为:编译生成war包;将war包打入到tomcat的基础镜像里:

简单模拟上述两个步骤(https://github.com/nichochen/mybank-demo-maven):

  1. 编译生成war包。

    1. Git clone 代码到本地: git clone https://github.com/nichochen/mybank-demo-maven

    2. 构建mvn镜像: 镜像名mvn

    3. 使用mvn镜像在本地生成war包:docker run -v $PWD/mybank-demo-maven:/opt/mybank-demo-maven mvn bash -c 'cd /opt/mybank-demo-maven && mvn package'

    4. mvn结果:

      >> ls mybank-demo-maven/target/
      ROOT ROOT.war classes maven-archiver maven-status surefire-reports test-classes
      

      target目录下的ROOT.war包就是我们想要得到的war包。

  2. 将war包打到装有tomcat的基础镜像中,使用dockerfile构建自己的应用镜像。这里,我们使用官方的tomcat镜像(tomcat:7.0.70-jre7-alpine)

    1. 编写Dockerfile:

      FROM tomcat:7.0.70-jre7-alpine #装有tomcat的基础镜像
      ADD ./mybank-demo-maven/target/ROOT.war /usr/local/tomcat/webapps/mybank.war #将war包加载到镜像中
      
    2. 构建镜像:docker build --rm -t bank .

    3. 运行镜像,验证可用性:运行命令:docker run -d -p 8089:8080 bank,通过浏览器访问网址http://localhost:8089/mybank/ ,可以正常访问。

非编译性语言代码容器化步骤(以nodejs为例)

非编译性语言不需要编译来生成可执行文件或者war包,所以,相较于编译性语言,只有一个步骤,就是构建镜像。

模拟构建步骤,以https://github.com/luoxueping/nodejs_test.git 为例:

  1. 编写dockerfile:

    FROM nodejs # nodejs的基础镜像
    ADD ./nodejs_test /opt/nodejs_test # 加载nodejs的代码
    RUN cd /opt/nodejs_test && npm install # 安装nodejs项目的依赖(python中对应应该是pip install -r requirement)
    ENTRYPOINT cd /opt/nodejs_test && node app.js # 容器启动项
    
  2. 构建镜像nodetestdocker build --rm -t nodetest .

  3. 运行镜像,验证可用性:

    >> docker run -d -p 8888:8888 nodetest
    >> curl http://localhost:8888
    

dockerfile的几个注意事项

  1. ADD 和 COPY区别:add会解压缩。
  2. CMD和ENTRYPOINT:cmd会被run后替换掉,entrypoint是容器必然执行的,另外shell格式的entrypoint会覆盖掉cmd/run。
  3. 命令的两种格式:exec格式和shell格式。

reference

初识node.js(通过npm下载项目依赖的包的过程)

https://github.com/luoxueping/nodejs_test


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:多余的午宴

查看原文:代码容器化

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

595 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传