基础镜像不是一种概念,而是一种技巧。
比如我们计划在Linux系统上部署java项目,那么我们都需要准备什么呢?大概能列举的出来如JDK环境、Tomcat等等。如果我们是通过Docker发布,那这些前置环境我们需要怎么安装、安装大概需要多长时间、安装后的位置在哪里,小朋友你是否有一堆的问号?
我们在开发中常常会使用这样一种技巧,在项目中创建一个base类,其他类都继承这个base类,这样的好处就是当我们需要扩展某些基础功能的时候,只需要扩展base类,那么继承于它的类都会响应。我们今天构建的基础镜像同样是要实现这样的功能,我们会预先部署我们运行应用时需要的环境,当我们发布应用时,只需要关注当前容器部署应用的情况,而不会再考虑基础环境的配置,如果我们的运行环境发生了变化,我们也只需调整基础镜像的相关参数,重新发布应用即可。
运行命令,构建容器,如图所示:
docker run -p 50016:50016 --name ubuntu18_base -it ubuntu:18.10 /bin/bash
如上图,我们已经运行了一个以ubuntu:18.10为操作系统的容器,并映射容器的端口50016到宿主机的50016端口。
因为我们传入了 -it 参数,所以当前容器的运行模式为前台模式,直接进入容器中。
退出容器返回到宿主机有两种模式:
执行 docker ps -a 可以查看本地容器列表
执行 docker images 可以查看本地镜像列表。
docker服务重启或者docker容器退出后,本地容器就处于停止状态,如果想进入本地容器需执行一下命令。
如上图所示,docker容器的id为 a56380be0877
启动容器
docker restart a56380be0877
进入容器
docker attach a56380be0877
这样我们就进入了一个本地已停止的容器。
如果容器是在后台运行中的,则执行 docker attach a56380be0877 即可直接进入容器。
刚刚加载的容器我们可以视为一个刚做完系统的新服务器,所以我们对它进行简单的环境配置。
具体内容请参考前面的章节《持续化部署教程(二) 配置Ubuntu服务器》
刷新容器系统的软件安装源
apt-get update
apt-get upgrade
安装文本编译工具
apt-get install vim
首先,在容器中创建一个文件夹,命名为java。
退出当前容器,通过执行docker cp 命令 将 Tomcat和jdk1.8文件夹 (如何获取相应文件,见文末) 拷贝到 java文件夹中,并进入容器通过ls命令进行验证。
docker cp 基本语法为:
docker cp ["宿主机目录"] ["容器ID"] ["容器目录"]
执行 vim /etc/profile 命令,对profile文件进行编译,并在文件最后增加以下内容。
export JAVA_HOME=/java/jdk1.8
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export PATH=.:${JAVA_HOME}/bin:${JRE_HOME}/bin:$PATH
source /etc/profile
让配置文件立即生效,执行 java -version 返回如下图所示,证明安装成功。
执行 vim /java/tomcat7/bin/setclasspath.sh,对setclasspath.sh进行编辑,加入如下内容,如图:
export JAVA_HOME=/java/jdk1.8
export JRE_HOME=/java/jdk1.8/jre
保存退出后,进入bin文件夹执行如下命令,会报如下图所示错误:
./catalina.sh run
这是因为执行sh脚本是需要授权的,执行如下命令,即可解决此问题。
chmod u+x *.sh
再次执行 ./catalina.sh run命令,运行成功。
推送镜像的方式,请参考《持续化部署教程(四)docker基础命令》中的第四章节,此处就不在赘述了。
上面的章节,我们完成了基础镜像的构建和推送,接下来我们通过镜像来部署我们的应用了。
创建个DockerFile文件,粘贴如下内容,如果想了解细节,见《持续化部署教程(六)自定义脚本-DockerFile》。
#本地打包 推镜像脚本
#20200507 castle
#=======================begin===========================
#执行镜像(1)
FROM 192.168.1.100:9001/base_docker/base_pro:1.0
#作者信息
MAINTAINER caslte "[email protected]"
# 拷贝文件到指定目录
RUN echo "Asia/Shanghai" > /etc/timezone
# 将war包(2)
ADD war/web-server.war /java/tomcat7/webapps/
ENV LANG C.UTF-8
# 执行tomcat
CMD ["/java/tomcat7/bin/catalina.sh","run"]
# 开放端口
EXPOSE 80
(1)这里的镜像,就是我们构建的基础镜像,镜像内已经具备了JDK环境和Tomcat容器。
(2)在要发布的war包拷贝到DockerFile文件同目录的war文件夹下,通过docker命令就可以拷贝文件到容器的Tomcat指定目录中。
文章中提到的Tomcat和jdk文件包我都已经上传到百度云盘中,大家可以直接下载。
百度云盘地址:https://pan.baidu.com/s/1sPlQpRn14NlTeIoBf3hb1g 提取码:ick1
本章节中我有几处都是让大家去读以前的章节,而不是重复之前已经讲过的内容。这套教程通过循序渐进的方式,一层一层的来讲解Docker的相关技巧,不是为了堆积字数而去堆积字数,所以希望大家能按照章节顺序来阅读相关知识,最后,祝大家学习愉快,如果能对你后续的学习提供些许帮助,那就是我最大的快乐。
2020-05-07夜。