因为业务需求的关系,需要通过docker打包一个包含python3和jre的Ubuntu基础镜像,以供aks(可理解为Azure版的k8s)部署服务使用。
一、 准备jre
既然用到了jre,那就需要准备一个jre。思路:1.下载jre(Oracle官网)。2.解压该jre压缩包,删除根目录下文本文件,然后删除其他不必要的文件。
实现:1.下载:去官网下载,搜jre。。。(过程省略)。将下载好的tar包传入远程服务器(可以是scp指令传输,如果有远程连接工具MobaXterm的话直接拖入即可)。
2.解压jre,并将不必要的文件删除。
#解压
tar xvcf jre-8u161-linux-x64.tar.gz
#进入目录
cd jre1.8.0_161/
#删除文本文件
rm -rf COPYRIGHT LICENSE README release THIRDPARTYLICENSEREADME-JAVAFX.txtTHIRDPARTYLICENSEREADME.txt Welcome.html
#删除其他无用文件
rm -rf lib/plugin.jar \
lib/ext/jfxrt.jar \
bin/javaws \
lib/javaws.jar \
lib/desktop \
plugin \
lib/deploy* \
lib/*javafx* \
lib/*jfx* \
lib/amd64/libdecora_sse.so \
lib/amd64/libprism_*.so \
lib/amd64/libfxplugins.so \
lib/amd64/libglass.so \
lib/amd64/libgstreamer-lite.so \
lib/amd64/libjavafx*.so \
lib/amd64/libjfx*.so
3.将瘦身之后的jre重新打包(瘦身之后,打成的tar包差不多只有45m)。
tar zcvf jre8.tar.gz *
二、制作带有python3的Ubuntu基础镜像
实现:1.准备Ubuntu基础镜像,运行进入镜像后再安装python3和所需要的python模块。再将该容器打包成新的镜像。
#下载ubuntu镜像
docker pull ubuntu
#运行容器
docker run -itd --name ubuntu-test ubuntu:latest
#进入容器
docker exec -it ubuntu-test(或者容器id) /bin/bash
#更新源
apt-get update
#安装python3
apt-get install python3
#安装pip3
apt-get install python3-pip
#安装咱们项目需要用到的python模块
pip3 install reportlab
pip3 install numpy
pip3 install matplotlib
pip3 install pandas
pip3 install oss2
2.输入exit退出该容器,将该容器封装成新的镜像供后面使用。
#查看正在运行的容器,获得容器id
docker ps(若要查看所有容器,即正在运行的和已经停止的容器:docker ps -a)
#将刚刚安装好python相关的ubuntu容器封装成镜像
docker commit bc4f9534351b(容器id或者名称) javanew:1.1(新的镜像名称:版本号)
ps:停止正在运行的容器:docker stop 容器id
重启容器: docker restart 容器id
三、为Ubuntu镜像配置jre
实现:将刚才封装的镜像作为基础镜像,基于Dockerfile构建新的带有jre的镜像。(最开始准备的jre压缩包出场了)
1.Dockerfile如下:
#基础镜像源(引自刚刚封装好的带有python的Ubuntu镜像)
FROM javanew:1.1
#作者信息
MAINTAINER xshbee
#将一开始准备的tar包传入指定目录并解压(ADD可以将tar包拷贝到指定目录并解压。COPY只能拷贝文件,没有解压功能)
ADD jre8.tar.gz /usr/java/jdk
#为jre配置环境变量
ENV JAVA_HOME /usr/java/jdk
ENV PATH ${PATH}:${JAVA_HOME}/bin
#解决中文乱码问题
ENV LANG C.UTF-8
2.基于该Dockerfile构建新的带有jre的镜像。
# cd到上面Dockerfile所在目录执行如下指令。**最后的点必须要加,指的是用当前目录下的Dockerfile构建镜像。(如果Dockerfile太多可以给其重命名,构建镜像时在指令中加上-f Dockerfile名称即可)
docker build -t 新镜像名:版本号 .
至此,一个带有python3和jre的Ubuntu镜像就构建完成了!可以用docker images指令查看镜像是否构建成功。本人能力有限,所以只能通过这种类似层层套娃的笨办法去做,如果可以在一个Dockerfile中将上述步骤全部实现,不但在效率上会更高,镜像体积也会更小(现在的最终镜像体积为788MB)。这就需要不断地学习以便日后完善了。
四、Dockerfile的指令
FROM | 基于哪个镜像实现 |
MAINTAINER | 镜像作者信息 |
ENV | 声明环境变量 |
RUN | 执行的命令 |
ADD | 添加宿主机文件到容器里,需要解压的自动解压 |
COPY | 添加宿主机文件到容器里 |
WORKDIR | 工作目录 |
EXPOSE | 应用内可使用的端口 |
CMD | 容器启动后所执行的程序,如果docker run后面跟启动命令会被覆盖掉 |
ENTRYPOINT | 与CMD功能相同,但是docker run不会覆盖,如果需要覆盖可以增加-entrypoint来覆盖 |
VOLUME | 将宿主机的目录挂在到容器里,卷挂载 |