综述
从代码到镜像,再到跑起来的容器,就是代码容器化的过程,主要步骤是构建出对应镜像,所以容器化的基础和实质是镜像,所以也可以认为容器化过程就是从代码到镜像的过程。
容器化的过程一般有两个步骤:编译和构建。根据编程语言不同,有的语言需要编译,比如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
有疑问加站长微信联系(非本文作者)