Docker 学习篇(七)
共 5221字,需浏览 11分钟
·
2021-10-01 05:08
1、自定义 mytomcat9 镜像,运行这个镜像,生成 myt9 容器。
接下来我们使用 DockerFile 做一个稍微复杂一些的镜像,以 tomcat9.0.53 为例,做一个我们自己的镜像,命名为 mytomcat9。
(1)、创建一个名为 /mydockerfile/tomcat9 的文件夹,mkdir -p /mydocker/tomcat9。
(2)、在 /mydockerfile/tomcat9 文件夹下,创建一个文件,touch c.txt。后续我们将使用 c.txt 这个文件,演示 ADD 和 COPY 保留字指令,这两个指令的作用,都是将宿主机中的文件拷贝进容器。
(3)、在 /mydockerfile/tomcat9 文件夹下,下载 jdk8 和 tomcat9.0.53 安装的压缩包,即 jdk-8u131-linux-x64.tar.gz 和 apache-tomcat-9.0.53.tar.gz。
(4)、在 /mydockerfile/tomcat/tomcat9 文件夹下新建 Dockerfile 文件,touch Dockerfile。
Dockerfile 文件内容如下所示:
FROM centos
MAINTAINER zhouxuejiao<happy_girl@163.com>
# 把宿主机当前目录下的 c.txt 文件拷贝到容器 /usr/local 路径下,并重命名为 cincontainer.txt。
COPY c.txt /usr/local/cincontainer.txt
# 把 JDK 和 tomcat 添加到容器 /usr/local 路径下,ADD 解压缩之后拷贝。
ADD jdk-8u131-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.53.tar.gz /usr/local/
# 安装 vim 编辑器
RUN yum -y install vim
# 设置工作访问时候的 WORKDIR 路径,登录落脚点,即访问容器,最先进入哪个目录
ENV MY_PATH /usr/local
WORKDIR $MY_PATH
# 配置 java 和 tomcat 的环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_131
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.53
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.53
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
# 容器运行时监听的端口
EXPOSE 8080
# 容器启动时运行 tomcat,有两种方式,ENTRYPOINT 和 CMD,我们采用 CMD 的方式。
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.53/bin/startup.sh"]
# CMD ["/usr/local/apache-tomcat-9.0.53/bin/catalina.sh", "run"]
# 容器启动时运行 tomcat,并且打印 tomcat 日志
CMD /usr/local/apache-tomcat-9.0.53/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.53/bin/logs/catalina.out
编辑 Dockerfile,vi Dockerfile,将上述内容复制进去。
(5)、根据 Dokcerfile 构建镜像,镜像命名为 mytomcat9,docker build -f /mydocker/tomcat9/Dockerfile -t mytomcat9 .。
(6)、查看镜像,docker images,可以发现有我们创建的 mytomcat9 镜像。
(7)、运行 mytomcat9 这个镜像。
docker run -d -p 9080:8080 --name myt9
-v /zhouxuejiaouse/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.53/webapps/test
-v /zhouxuejiaouse/mydockerfile/tomcat9/tomcat9logs:/usr/local/apache-tomcat-9.0.53/logs
--privileged=true
mytomcat9
-d:后台打印日志,加上这个参数,执行这条命令时,就不会哗啦啦打印出一大堆日志。
-p 9080:8080:9080和8080端口映射。
--name myt9:运行起来的容器命名为 myt9。
-v:容器卷,以第一条 -v 命令为例,主机的/zhouxuejiaouse/mydockerfile/tomcat9/test和容器内部的/usr/local/apache-tomcat-9.0.53/webapps/test一一对应。
--privileged=true:如果写权限不够,可以把这个加上。
(8)、验证容器运行起来了,首先执行 docker ps 命令,可以看到我们刚刚运行起来的容器,status 是 UP,见图14。
此外,由于之前设置了端口映射,当我们在主机上访问 localhost:9080,就能访问容器内部 8080 的 tomcat,见图15。
如果你本地没有安装 centos 桌面,那么就执行 curl http://localhost:9080 ,如果有内容返回,也可以证明 tomcat 容器跑起来了,见图16。
(9)、进入容器内部,查看其/usr/local工作目录下都有什么。
首先 docker ps,获取容器ID,容器ID 为 c977d3ba82fa。
然后 docker exec c977d3ba82fa ls -l,docker exec c977d3ba82fa 表示进入容器内部,ls -l 因为之前我们已经指定过进入容器,首先进入/usr/local目录,所以我们直接执行 ls -l 列出这个目录下的所有内容即可。
(10)、查看容器卷是否创建成功。主机上的目录创建成功,见图19。
容器内的数据卷也创建成功了,见图20、图21。
2、建立一个名为 test 的 web 工程,并将其部署到刚才创建的 tomcat 容器上。
(1)、一个标准的 web 工程,包含 WEB-INF 和 jsp 文件,WEB-INF 中包含 web.xml 配置文件。
使用主机中已经存在的 /zhouxuejiaouse/mydockerfile/tomcat9/test 这个文件夹(在第2步中会讲到为什么选择使用这个文件夹作为 test 工程的目录)作为我们的 test 工程目录,然后在其中创建 WEB-INF 目录,最后在 WEB-INF 中创建 web.xml 并编写。
然后我们回到 test 目录,创建一个 jsp 文件,命名为 a.jsp,并编写该文件。
至此,我们已经创建好了一个名为 test 的 web 工程,见图26。
(2)进入 mytomcat9 容器的 /usr/local/apache-tomcat-9.0.53/webapps/test 这个目录,发现这个 test 目录和刚才的 test 目录一模一样,这就是为什么第一步选择在 /zhouxuejiaouse/mydockerfile/tomcat9/test 这个文件夹中创建工程,因为二者已经做了联结,容器卷可以让容器和主机实现数据共享。
(3)经过(2)的分析,说明 test 工程已经部署到 tomcat 的 webapps 目录下了,此时我们重启 tomcat 容器,程序也就跟着启动了。
重启之后,我们访问 http://localhost:9080/test/a.jsp,出现 jsp 中的内容,表示 tomcat 启动成功,我们的 web 程序也启动成功了,见图29、图30。
(4)到这,我们要说一下用容器部署应用的一个好处,当我们想要修改 a.jsp 文件的内容,如果使用传统的部署方式,我们肯定是要将程序停了,然后修改文件内容,然后再将程序起起来。使用容器部署的话,我们可以不停程序,直接修改,下面我来演示一下。
因为主机的 /zhouxuejiaouse/mydockerfile/tomcat9/test 目录和容器的 /usr/local/apache-tomcat-9.0.53/webapps/test 目录是数据共享的,所以我们直接在主机上修改其 test 目录下的 a.jsp 文件,见图31、32,然后刷新 http://localhost:9080/test/a.jsp 页面,我们会发现页面内容自动修改了,见图33。
(5)最后我们来看一下程序运行过程中的日志,进入主机的 /zhouxuejiaouse/mydockerfile/tomcat9/tomcat9logs 这个目录即可看到日志,因为这个目录和容器运行日志目录 /usr/local/apache-tomcat-9.0.53/logs 也做了联结,数据可以共享。
3、将本地镜像发布到阿里云上
(1)本地镜像发布(push)到阿里云的流程,见图36。
(2)将本地镜像推送到阿里云
1、登录阿里云开发者平台,https://dev.aliyun.com/search.html,控制台-》产品与服务-》容器镜像服务-》个人版。
2、创建命名空间 zhouxuejiao,见图39、40。
3、创建镜像仓库 mycentos,见图41、42、43。
4、将本地镜像 mycentos 推送到阿里云上面去,推送步骤如下所示。
第一步:登录
$ docker login --username=coder_zhouzhou registry.cn-hangzhou.aliyuncs.com
第二步:
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/zhouxuejiao/mycentos:[镜像版本号],[ImageId]为要推送的那个镜像的镜像ID,[镜像版本号]表示这个镜像推送到阿里云之后,它的版本号为多少,可以不与本地的相同。
第三步:
$ docker push registry.cn-hangzhou.aliyuncs.com/zhouxuejiao/mycentos:[镜像版本号],这个镜像版本号和第二步的保持一致。
5、将镜像推送到阿里云之后,我们在阿里云上就可以搜索到刚才推上去的那个镜像啦。
(3)将阿里云上的镜像下载到本地
见图47,从阿里云拿到镜像地址,使用 docker pull 镜像地址,即可将镜像下载到本地,注意从阿里云拿镜像地址时,不带版本号,当我们pull时,要在后面加上版本号。