我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何使用Dockerfile定制Java Web镜像

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何使用Dockerfile定制Java Web镜像

本篇内容介绍了“如何使用Dockerfile定制Java Web镜像”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、前言

对使用 Docker 搭建 Java Web 运行环境

启动容器:

docker run <相关参数> <镜像 ID> <初始命令>-i:表示以“交互模式”运行容器-t:表示容器启动后会进入其命令行-v:表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>

进入容器,配置环境,exit

查看所有容器 : 
docker container ls -a      或者 docker ps -a

docker commit 的语法格式为:
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]

--author "wwx<wuweixiang.alex@gmail.com>" \--message "修改了默认网页" \

docker commit 57c312bbaad1 huangyong/javaweb:0.1

启动容器:
docker run <相关参数> <镜像 ID> <初始命令>

 

慎用 docker commit,利用 commit 镜像构成,意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像。如果使用 docker commit 制作镜像,以及后期修改的话,每一次修改都会让镜像更加臃肿一次,所删除的上一层的东西并不会丢失,会一直如影随形的跟着这个镜像,即使根本无法访问到。这会让镜像更加臃肿。

二、使用 Dockerfile 定制Java Web镜像

①Dockerfile简介

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

②Dockerfile指令详解

#指定基础镜像 FROM   Dockerfile中必备指令,并且必须是第一条指令FROM scratch   不以任何镜像为基础,接下来的指令将作为镜像第一层开始存在#指定维护者信息MAINTAINER格式: MAINTAINER <name>#执行命令行命令RUN  定义每一层该如何构建(不是在写 Shell 脚本)每一个 RUN = 启动一个容器、执行命令、然后提交存储层文件变更两行 RUN 命令的执行环境不同格式:1) shell 格式: RUN <命令>                                   #类似命令行输入2) exec  格式: RUN ["可执行文件", "参数1", "参数2"]           #类似函数调用行尾 \ 换行行首 # 注释&& 命令串联#复制文件COPY 格式: 1) COPY <源路径>... <目标路径> 2) COPY ["<源路径1>",... "<目标路径>"]<源路径> 可以是多个,甚至可以是通配符   #上下文路径的相对路径<目标路径> 可以是容器内的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以用 WORKDIR 指令来指定)#更高级的复制文件ADD<源路径> 可以是一个 URL,如果是gzip , bzip2 以及 xz 的情况下,ADD 指令将会自动解压缩这个压缩文件到 <目标路径> 去所有的文件复制均使用COPY 指令,仅在需要自动解压缩的场合使用 ADD#容器启动命令CMD 容器就是进程。 既然是进程,在启动的时候,需要指定所运行的程序及参数。CMD 指令就是用于指定默认的容器主进程的启动命令对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义,从而退出,其它辅助进程不是它需要关心的东西。格式: 1) shell 格式:  CMD <命令>2) exec  格式:  CMD ["可执行文件", "参数1", "参数2"...]一般推荐使用 exec 格式,这类格式在解析时会被解析为 JSON 数组,因此一定要使用双引号 " ,而不要使用单引号CMD echo $HOME 在实际执行中,会将其变更为: CMD [ "sh", "-c", "echo $HOME" ]#入口点ENTRYPOINT 和 CMD 一样,都是在指定容器启动程序及参数实际执行时,将变为: <ENTRYPOINT> "<CMD>"   #启动时,可再对可执行文件进行传参ENTRYPOINT ["docker-entrypoint.sh"]      #应用运行前的准备工作,指定了 ENTRYPOINT 为 docker-entrypoint.sh 脚本,并且可在镜像启动时候传入参数来服务脚本#设置环境变量ENV 格式: 1) ENV <key> <value> 2) ENV <key1>=<value1> <key2>=<value2>...#构建参数ARG 和 ENV 所不同的是, ARG 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。格式: ARG <参数名>[=<默认值>]可以在构建命令docker build 中用 --build-arg <参数名>=<值> 来覆盖#定义匿名卷VOLUME 为了防止运行时用户忘记将动态文件所保存目录挂载为卷(volume),指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据格式: 1) VOLUME <路径>2) VOLUME ["<路径1>", "<路径2>"...] VOLUME /data 这里的 /data 目录就会在运行时自动挂载为匿名卷,任何向 /data 中写入的信息都不会记录进容器存储层-v mydata:/datamydata 这个命名卷挂载到了 /data 这个位置,替代了Dockerfile 中定义的匿名卷的挂载配置#声明端口EXPOSE 声明运行时容器提供服务端口#指定工作目录WORKDIR 改变以后各层的工作目录格式:WORKDIR <工作目录路径> 相当于 cd  ...WORKDIR /aWORKDIR bWORKDIR cRUN pwd则最终路径为 /a/b/c#指定当前用户USER USER 指令和 WORKDIR 相似,都是改变环境状态并影响以后的层USER 只是帮助你切换到指定用户而已,这个用户必须是事先建立好的,否则无法切换。#健康检查HEALTHCHECK 格式: 1) HEALTHCHECK [选项] CMD <命令>          #设置检查容器健康状况的命令 2) HEALTHCHECK NONE                      #如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令HEALTHCHECK 支持下列选项:--interval=<间隔> :两次健康检查的间隔,默认为 30 秒;--timeout=<时长> :健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;--retries=<次数> :当连续失败指定次数后,则将容器状态视为 unhealthy ,默认 3次。和 CMD , ENTRYPOINT 一样, HEALTHCHECK 只可以出现一次,如果写了多个,只有最后一个生效。HEALTHCHECK --interval=5s --timeout=3s \ CMD curl -fs http://localhost/ || exit 1#为他人做嫁衣裳ONBUILD 当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行格式: ONBUILD <其它指令> 做一个基础镜像,基础镜像更新,各个项目不用同步 Dockerfile 的变化,重新构建后就继承了基础镜像的更新

③构建镜像

#构建镜像 docker build [选项] <指定上下文路径/URL/-> 镜像并非在本地构建,而是在服务端,也就是镜像是在 Docker 引擎中构建的。那么在这种客户端/服务端的架构中,如何才能让服务端获得本地文件呢? 当构建的时候,用户会指定构建镜像上下文的路径, docker build 命令得知这个路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎。这样Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件。 初学者经常会问的为什么COPY ../package.json /app 或者 COPY /opt/xxxx /app 无法工作的原因,因为这些路径已经超出了上下文的范围,Docker 引擎无法获得这些位置的文件。 例如:COPY ./package.json /app/  是复制 上下文(context) 目录下的package.json   #COPY 这类指令中的源文件的路径都是上下文路径的相对路径 -f ../Dockerfile.php 参数指定某个文件作为Dockerfile 其它 docker build 的用法 直接用 Git repo 进行构建:Docker 就会自己去 git clone 这个项目、切换到指定分支、并进入到指定目录后开始构建 用给定的 tar 压缩包构建:Docker 引擎会下载这个包,并自动解压缩,以其作为上下文,开始构建

Dockerfile的编写

0.0 Dockerfile

# 版本信息FROM centos:7MAINTAINER wuweixiang <wuweixiang.alex@gmail.com># 设置工作目录WORKDIR /var/# 添加jdk、tomcatADD jdk-8u191-linux-x64.tar.gz .#ADD http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v8.5.35/bin/apache-tomcat-8.5.35.tar.gz .ADD apache-tomcat-8.5.35.tar.gz .# 设置环境变量ENV JAVA_HOME /var/jdk1.8.0_191ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/binENV TIME_ZONE Asia/Shanghai# 更改时区RUN set -x \&& echo "${TIME_ZONE}" > /etc/timezone \&& ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime# 开启内部服务端口EXPOSE 8080# 启动tomcat服务器CMD ["/var/apache-tomcat-8.5.35/bin/catalina.sh","run"] && tail -f /var/apache-tomcat-8.5.35/logs/catalina.out

构建方式(镜像已push,此步可忽略)

①linux安装git

sudo yum install git

②克隆项目源码

git clone https://gitee.com/wuweixiang/javaweb-docker.git

③构建镜像

进入到/javaweb-docker/dockerfile-java8-tomcat8目录下:

docker build -t  [<仓库名>[:<标签>]] .  #创建镜像 仓库名:经常以 两段式路径 形式出现,比如 wuweixiang/javaweb:1.0.0,前者Docker账号用户名,后者则往往是对应的软件名。    标签:指定所需哪个版本的镜像,默认latest。

使用方式

 1、新购买的服务器,安装docker,执行以下指令:

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

 2、创建/var/webapps/目录,并将war包放入该目录下

 3、运行以下命令,即可实现部署。

docker run -d -p 80:8080 \-v /var/webapps/:/var/apache-tomcat-8.5.35/webapps/ \--name <容器名>  \wuweixiang/javaweb:1.0.0

 注意: 

  挂载路径 /var/webapps/  为当前war上传位置

使用示例

下载一个war包到挂载路径/var/webapps/下:

如何使用Dockerfile定制Java Web镜像

可见,war包自动完成解压。

即可访问http://112.74.185.172/finder-web-2.4.9

如何使用Dockerfile定制Java Web镜像

总结

  该部署方式与之前的部署方式上,省去了jdk、tomcat环境的配置过程,只要上传war包即可。

“如何使用Dockerfile定制Java Web镜像”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何使用Dockerfile定制Java Web镜像

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何使用Dockerfile定制Java Web镜像

本篇内容介绍了“如何使用Dockerfile定制Java Web镜像”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、前言对使用 Docke
2023-06-19

Docker入门系列之二:使用dockerfile制作包含指定web应用的镜像

在前一篇文章:Docker入门系列之一:在一个Docker容器里运行指定的web应用 里,我们已经成功地将我们在本地开发的一个web应用部署到Docker容器里运行。本文将介绍如何制作一个包含了这个web应用的Docker镜像。镜像制作好之
2023-06-04

docker中Dockerfile如何自定义tomcat镜像

小编给大家分享一下docker中Dockerfile如何自定义tomcat镜像,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 1、创建目录[root@t-d
2023-06-04

使用Dockerfile如何构建一个docker镜像

这篇文章给大家介绍使用Dockerfile如何构建一个docker镜像,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。使用Dockerfile构建docker镜像1、什么是Dockerfile? dockerfil
2023-06-14

如何用dockerfile指令构建docker镜像

本篇内容主要讲解“如何用dockerfile指令构建docker镜像”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何用dockerfile指令构建docker镜像”吧!初识Dockerfile
2023-06-30

如何使用UltraISO制作Ubuntu的Live-USB系统镜像

这篇文章主要为大家展示了“如何使用UltraISO制作Ubuntu的Live-USB系统镜像”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用UltraISO制作Ubuntu的Live-US
2023-06-17

如何使用Nexus管理Docker镜像

这篇文章将为大家详细讲解有关如何使用Nexus管理Docker镜像,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Nexus简介Nexus是一个多功能的仓库管理器,是企业常用的私有仓库服务器软
2023-06-19

如何使用Docker镜像构建Go应用

这篇文章主要介绍了如何使用Docker镜像构建Go应用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用Docker镜像构建Go应用文章都会有所收获,下面我们一起来看看吧。修炼背景我夜以继日,加班加点开发了
2023-06-29

使用指南:如何设置pip镜像源

pip镜像源的使用指南随着Python语言的普及和应用领域的扩大,pip成为了Python开发者常用的包管理工具。然而,由于国内网络环境的特殊性,直接使用官方的pip源往往速度较慢,甚至无法正常下载和安装包。为了解决这个问题,我们可以使用
使用指南:如何设置pip镜像源
2024-01-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录