一个实战让你搞懂Dockerfile
摘要
在认识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
记住创建一个空白的目录,然后这个目录只存放我们需要的文件
[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的更多相关文章
- java线程间通信:一个小Demo完全搞懂
版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.从一个小Demo说起 上篇我们聊到了Java多线程的同步 ...
- 一个简单的例子搞懂ES6之Promise
ES5中实现异步的常见方式不外乎以下几种: 1. 回调函数 2. 事件驱动 2. 自定义事件(根本上原理同事件驱动相同) 而ES6中的Promise的出现就使得异步变得非常简单.promise中的异步 ...
- Java多线程同步问题:一个小Demo完全搞懂
版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.一个简单的Demo引发的血案 关于线程同步问题我们从一个 ...
- InfluxDB从原理到实战 - 一篇文章搞懂InfluxDB时区
0x00 简介 InfluxDB默认以UTC时间存储并返回时间戳,当接收到一个时序数据记录时,InfluxDB将时间戳从本地时区时间转换为UTC时间并存储,查询时,InfluxDB返回的时间戳对 ...
- 搞懂分布式技术5:Zookeeper的配置与集群管理实战
搞懂分布式技术5:Zookeeper的配置与集群管理实战 4.1 配置文件 ZooKeeper安装好之后,在安装目录的conf文件夹下可以找到一个名为“zoo_sample.cfg”的文件,是ZooK ...
- MySQL实战45讲,丁奇带你搞懂
之前,你大概都是通过搜索别人的经验来解决问题.如果能够理解MySQL的工作原理,那么在遇到问题的时候,是不是就能更快地直戳问题的本质? 以实战中的常见问题为切入点,带你剖析现象背后的本质原因.为你串起 ...
- 一个注解搞懂 Sentinel,@SentinelResource 总结
在前面的博客中,我给大家演示了使用 @SentinelResource 定义资源完成限流的例子, 下面就从源码解析开始,看下SentinelResource是如何实现限流的,以及@SentinelRe ...
- 十分钟搞懂什么是CGI
原文:CGI Made Really Easy,在翻译的过程中,我增加了一些我在学习过程中找到的更合适的资料,和自己的一些理解.不能算是严格的翻译文章,应该算是我的看这篇文章的过程的随笔吧. CGI真 ...
- 十分钟搞懂什么是CGI(转)
原文:CGI Made Really Easy,在翻译的过程中,我增加了一些我在学习过程中找到的更合适的资料,和自己的一些理解.不能算是严格的翻译文章,应该算是我的看这篇文章的过程的随笔吧. CGI真 ...
随机推荐
- mysql innodb事务的ACID及其实现的保证机制
MySQL事务的ACID,一致性是最终目的.保证一致性的措施有:A原子性:靠undo log来保证(异常或执行失败后进行回滚).D持久性:靠redo log来保证(保证当MySQL宕机或停电后,可以通 ...
- springboot使用@Value注入properties文件中的值,中文乱码
最近开发一个需求,讲一个中文值配置在properties文件中,然后代码中使用@Value注解进行注入使用,然而出现了如下状况: 中文出现乱码,将代码修改如下: String str = new St ...
- Java 中的同步集合与并发集合有什么区别?
同步集合与并发集合都为多线程和并发提供了合适的线程安全的集合,不过并发 集合的可扩展性更高.在 Java1.5 之前程序员们只有同步集合来用且在多线程并发 的时候会导致争用,阻碍了系统的扩展性.Jav ...
- Linux常用命令-学习笔记
Linux命令格式: 命令 [命令参数] [命令对象] # 命令之间的参数和对象用单个空格进行分割 # "[]"代表可选,{}代表必选其中的一项,|代表或者的关系,<> ...
- 一、mycat介绍
一.背景 随着时间和业务的发展,数据库中的数据量增长是不可控的,库和表中的数据会越来越大,随之带来的是更高的磁盘.IO.系统开销,甚至性能上的瓶颈,而一台服务的资源终究是有限的,因此需要对数据库和表进 ...
- 客户端回调 Watcher ?
客户端 SendThread 线程接收事件通知,交由 EventThread 线程回调 Watcher. 客户端的 Watcher 机制同样是一次性的,一旦被触发后,该 Watcher 就失效了.
- spring 支持哪些 ORM 框架?
Hibernate iBatis JPA JDO· OJB
- JVM学习思考
毕业以来技术上一直没有太大进步,仔细一想可能是没有做技术分享,我喜欢把学习总结记录在印象笔记中,那么理解的是对是错也就没人能评判一下.为了技术进步,接下来将陆续把一些学习总结迁移到博客园中,欢迎大家多 ...
- 学习Keepalived(三)
1.1Keepalived高可用软件 Keepalived起初是专为LVS设计的,专门用来监控LVS集群系统中各个服务节点的状态,后来又加入了VRRP的功能,因此除了配合LVS服务外,也可以作为其他服 ...
- AutoValue —— Generated immutable value classes
本文参考 在<Effective Java>第三版第十条"Obey the general contract when overriding equals"中提到goo ...