摘要

在认识Dockerfile的基础功能之后,即一个用基础镜像来构建新镜像的文本文件,就需要在实际工作中使用其灵活便利的操作来提升我们的工作效率了,这里演示在Tomcat里运行一个程序的过程,以此来感受Docker带给我们的便利。

通常以往的操作,或者目前大部分的操作依然还是这样:在一个服务器上安装 JDK 和 Tomcat,然后上传war包到Tomcat指定目录下,或者一个jar包,直接运行即可。这样可能一个服务器就只能安装一个JDK和一个Tomcat,当然多个也是可以的,只不过非常麻烦,这个Dockerfile就可以完美解决,并且互相毫不影响。当然这里就只是简单举个例子,实时上还有其他很多不同之处,都有非常优秀的一面。

编写Dockerfile

这里我们直接编写Dockerfile文件,首先要准备Jdk和Tomcat安装包

tomcat:https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.62/bin/apache-tomcat-9.0.62.tar.gz

jdk:https://download.oracle.com/otn/java/jdk/8u331-b09/165374ff4ea84ef0bbd821706e29b123/jdk-8u331-linux-x64.tar.gz

记住创建一个空白的目录,然后这个目录只存放我们需要的文件

[root@hadoop101 ~]# cd /home/docker_test/docker_files/mytomcat
[root@hadoop101 mytomcat]# ll
total 155832
-r-------- 1 root root  11560971 Apr 21 23:49 apache-tomcat-9.0.62.tar.gz
-rw-r--r-- 1 root root      1099 Apr 22 00:29 Dockerfile
-r-------- 1 root root 148003999 Apr 21 23:47 jdk-8u331-linux-x64.tar.gz
-rw-r--r-- 1 root root         0 Apr 22 00:20 readme.txt
[root@hadoop101 mytomcat]#

这里我们把jdk和tomcat安装包放在这个目录下,然后加一个说明文档。

下面是Dockerfile文件具体内容:

FROM centos
MAINTAINER zhangbaohpu
COPY readme.txt /usr/local/readme.txt

#这里会自动解压
ADD jdk-8u331-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.62.tar.gz /usr/local/

ENV mypath /usr/local
WORKDIR $mypath

#将原有的yum配置备份下
RUN tar cvf /etc/yum.repos.d.tar /etc/yum.repos.d

#修改yum源配置,
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo

#删除掉多于的repo文件
RUN rm -rf /etc/yum.repos.d/CentOS-Linux-*

#使yum配置更新
RUN yum clean all
RUN yum makecache

#下载需要的工具类
RUN yum -y install vim

#设置环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_331
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.62
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.62

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

#对外暴露端口
EXPOSE 8080

#容器启动之后再启动tomcat,并打开日志
CMD /usr/local/apache-tomcat-9.0.62/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.62/logs/catalina.out

注:最新默认的Centos版本是8,自带的yum源已经失效,所以在这里我们顺便修改下yum源,然后再下载其他工具。

构建镜像

Dockerfile文件编写完成之后,就可以构建自己的镜像了,切记在Dockerfile所在目录下执行。

[root@hadoop101 mytomcat]# docker build -t mytomcat .
#具体构建过程太长就不再展示了,只要最后有两个Successfully就表示构建完成。
[root@hadoop101 mytomcat]# docker images
REPOSITORY           TAG       IMAGE ID       CREATED         SIZE
mytomcat             latest   b9cee7d729a7   10 minutes ago   697MB

运行镜像

有了我们自己自定义的镜像之后,就可以运行一个镜像实例,然后部署我们实际的应用程序

[root@hadoop101 mytomcat]# docker run -d -p 9090:8080 --name baotomcat -v /home/zhangbao/build/tomcat/test:/usr/local/apache-tomcat-9.0.62/webapps/test -v /home/zhangbao/build/tomcat/logs:/usr/local/apache-tomcat-9.0.62/logs mytomcat

访问 http://192.168.88.71:9090/ 就可以看到熟悉的页面了

命令解释:

-p 9090:8080 将容器内端口映射到宿主机端口

--name baotomcat 容器名称

-v /home/zhangbao/build/tomcat/test:/usr/local/apache-tomcat-9.0.62/webapps/test 将程序test根目录挂载到宿主机的指定目录下,前面为宿主机目录

-v /home/zhangbao/build/tomcat/logs:/usr/local/apache-tomcat-9.0.62/logs 挂载日志目录

最后一个是指定运行的镜像

部署项目

下面我们可以在宿主机发布程序了,因为部署程序test已经挂载到宿主机上了

[root@hadoop101 mytomcat]# cd /home/zhangbao/build/tomcat/
[root@hadoop101 tomcat]# ll
total 0
drwxr-xr-x 2 root root 197 Apr 22 22:26 logs
drwxr-xr-x 2 root root   6 Apr 22 22:26 test
[root@hadoop101 tomcat]# cd test
[root@hadoop101 test]# ll
总用量 4
-rw-r--r-- 1 root root 266 4月  22 23:46 index.jsp
drwxr-xr-x 2 root root  21 4月  22 23:52 WEB-INF

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

Hello World!

 

web.xml



然后访问 http://192.168.88.71:9090/test/ 可以看到Hello wold!

更多请在公号平台搜索:选手一号位,本文编号:2005,回复即可获取。

一个实战让你搞懂Dockerfile的更多相关文章

  1. java线程间通信:一个小Demo完全搞懂

    版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.从一个小Demo说起 上篇我们聊到了Java多线程的同步 ...

  2. 一个简单的例子搞懂ES6之Promise

    ES5中实现异步的常见方式不外乎以下几种: 1. 回调函数 2. 事件驱动 2. 自定义事件(根本上原理同事件驱动相同) 而ES6中的Promise的出现就使得异步变得非常简单.promise中的异步 ...

  3. Java多线程同步问题:一个小Demo完全搞懂

    版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.一个简单的Demo引发的血案 关于线程同步问题我们从一个 ...

  4. InfluxDB从原理到实战 - 一篇文章搞懂InfluxDB时区

    0x00 简介    InfluxDB默认以UTC时间存储并返回时间戳,当接收到一个时序数据记录时,InfluxDB将时间戳从本地时区时间转换为UTC时间并存储,查询时,InfluxDB返回的时间戳对 ...

  5. 搞懂分布式技术5:Zookeeper的配置与集群管理实战

    搞懂分布式技术5:Zookeeper的配置与集群管理实战 4.1 配置文件 ZooKeeper安装好之后,在安装目录的conf文件夹下可以找到一个名为“zoo_sample.cfg”的文件,是ZooK ...

  6. MySQL实战45讲,丁奇带你搞懂

    之前,你大概都是通过搜索别人的经验来解决问题.如果能够理解MySQL的工作原理,那么在遇到问题的时候,是不是就能更快地直戳问题的本质? 以实战中的常见问题为切入点,带你剖析现象背后的本质原因.为你串起 ...

  7. 一个注解搞懂 Sentinel,@SentinelResource 总结

    在前面的博客中,我给大家演示了使用 @SentinelResource 定义资源完成限流的例子, 下面就从源码解析开始,看下SentinelResource是如何实现限流的,以及@SentinelRe ...

  8. 十分钟搞懂什么是CGI

    原文:CGI Made Really Easy,在翻译的过程中,我增加了一些我在学习过程中找到的更合适的资料,和自己的一些理解.不能算是严格的翻译文章,应该算是我的看这篇文章的过程的随笔吧. CGI真 ...

  9. 十分钟搞懂什么是CGI(转)

    原文:CGI Made Really Easy,在翻译的过程中,我增加了一些我在学习过程中找到的更合适的资料,和自己的一些理解.不能算是严格的翻译文章,应该算是我的看这篇文章的过程的随笔吧. CGI真 ...

随机推荐

  1. Java基础 (上)

    基础概念与常识 Java 语言有哪些特点? 简单易学: 面向对象(封装,继承,多态): 平台无关性( Java 虚拟机实现平台无关性): 支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操 ...

  2. Captcha生成验证码,docker部署时问题

    https://blog.csdn.net/huofuman960209/article/details/100738712 Dockerfile FROM openjdk:8-jdk-alpine ...

  3. 介绍Collection框架的结构?

    随意发挥题,天南海北谁便谈,只要让别觉得你知识渊博,理解透彻即可.

  4. spring cloud 断路器的作用是什么?

    在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个错误响应,而不是长时间的等待.这样就不会使得线程因 ...

  5. MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如 何保证 redis 中的数据都是热点数据?

    Redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略. 相关知识:Redis 提供 6 种数据淘汰策略: volatile-lru:从已设置过期时间的数据集(server.db[i]. ...

  6. HTML 5中不同的新表单元素类型是什么?

    HTML 5推出了10个重要的新的表单元素: Color. Date Datetime-local Email Time Url Range Telephone Number Search

  7. 『现学现忘』Docker基础 — 36、CMD指令和ENTRYPOINT指令的区别

    目录 1.CMD指令和ENTRYPOINT指令说明 2.CMD指令只有最后一条生效的原因 3.CMD指令演示 4.ENTRYPOINT指令演示 5.总结 CMD指令和ENTRYPOINT指令作用都是指 ...

  8. Windows常用快捷操作

    Windows操作系统作为目前最广泛使用的PC端OS,掌握一些快捷键,方便快速在Windows系统下进行操作. 下面收集整理了一些常用的快捷操作: Ctrl + A   全选 Ctrl + C   复 ...

  9. 切图崽的自我修养-[ES6] 迭代器Iterator浅析

    Iterator 这真是毅种循环 Iterator不是array,也不是set,不是map, 它不是一个实体,而是一种访问机制,是一个用来访问某个对象的接口规范,为各种不同的数据结构提供统一的访问机制 ...

  10. 关于js中this指向的总结

    js中this指向问题一直是个坑,之前一直是懵懵懂懂的,大概知道一点,但一直不知道各种情况下指向有什么区别,今天亲自动手测试了下this的指向. 1.在对象中的this对象中的this指向我们创建的对 ...