内容简介:从代码到镜像,再到跑起来的容器,就是代码容器化的过程,主要步骤是构建出对应镜像,所以容器化的基础和实质是镜像,所以也可以认为容器化过程就是从代码到镜像的过程。容器化的过程一般有两个步骤:编译和构建。根据编程语言不同,有的语言需要编译,比如java、golang;有的语言不需要编译,比如python、nodejs,所以可以分成编译性语言容器化步骤和非编译性语言容器化步骤来进行讲解。java代码容器化的一般步骤是:首先编译生成war包,然后,tomcat+war包启动服务。编译的过程依赖远远大于业务运行的依赖的
综述
从代码到镜像,再到跑起来的容器,就是代码容器化的过程,主要步骤是构建出对应镜像,所以容器化的基础和实质是镜像,所以也可以认为容器化过程就是从代码到镜像的过程。
容器化的过程一般有两个步骤:编译和构建。根据编程语言不同,有的语言需要编译,比如 java 、golang;有的语言不需要编译,比如 python 、nodejs,所以可以分成编译性语言容器化步骤和非编译性语言容器化步骤来进行讲解。
编译性语言代码容器化步骤(以java为例)
java代码容器化的一般步骤是:首先编译生成war包,然后,tomcat+war包启动服务。编译的过程依赖远远大于业务运行的依赖的,为求镜像的最小化,一般将编译和加载war包并运行起来分开。
总结来看,从java代码到镜像两个步骤为:编译生成war包;将war包打入到tomcat的基础镜像里:
简单模拟上述两个步骤( https://github.com/nichochen/mybank-demo-maven
):
-
编译生成war包。
-
Git clone 代码到本地:
git clone https://github.com/nichochen/mybank-demo-maven
-
构建mvn镜像: 镜像名mvn
-
使用mvn镜像在本地生成war包:
docker run -v $PWD/mybank-demo-maven:/opt/mybank-demo-maven mvn bash -c 'cd /opt/mybank-demo-maven && mvn package'
-
mvn结果:
>> ls mybank-demo-maven/target/ ROOT ROOT.war classes maven-archiver maven-status surefire-reports test-classes
target目录下的ROOT.war包就是我们想要得到的war包。
-
-
将war包打到装有tomcat的基础镜像中,使用dockerfile构建自己的应用镜像。这里,我们使用官方的tomcat镜像(
tomcat:7.0.70-jre7-alpine
)-
编写Dockerfile:
FROM tomcat:7.0.70-jre7-alpine #装有tomcat的基础镜像 ADD ./mybank-demo-maven/target/ROOT.war /usr/local/tomcat/webapps/mybank.war #将war包加载到镜像中
-
构建镜像:
docker build --rm -t bank .
-
运行镜像,验证可用性:运行命令:
docker run -d -p 8089:8080 bank
,通过浏览器访问网址http://localhost:8089/mybank/
,可以正常访问。
-
非编译性语言代码容器化步骤(以nodejs为例)
非编译性语言不需要编译来生成可执行文件或者war包,所以,相较于编译性语言,只有一个步骤,就是构建镜像。
模拟构建步骤,以 https://github.com/luoxueping/nodejs_test.git
为例:
-
编写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 # 容器启动项
-
构建镜像
nodetest
:docker build --rm -t nodetest .
-
运行镜像,验证可用性:
>> docker run -d -p 8888:8888 nodetest >> curl http://localhost:8888
dockerfile的几个注意事项
- ADD 和 COPY区别:add会解压缩。
- CMD和ENTRYPOINT:cmd会被run后替换掉,entrypoint是容器必然执行的,另外 shell 格式的entrypoint会覆盖掉cmd/run。
- 命令的两种格式:exec格式和shell格式。
reference
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 小网站的容器化(下):网站容器化的各种姿势,先跟着撸一波代码再说!
- 跟我学Spring之自定义bean容器提升代码可读性
- 容器技术之容器镜像篇
- 多线程六 同步容器&并发容器
- 容器技术第一讲:容器入门篇
- Docker容器Centos容器安装openssh
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。