Docker基本概念与实践(五)-使用dockerfile部署简单web项目和springboot项目

简介: Dockerfile简介Dcokerfile是一个文本格式的配置文件,由一系列命令和参数构建的脚本,用户可通过这个快速构建自定义的镜像 ​ 官方仓库dockerhub和一些镜像仓库已经提供大量的镜像,但有些时候不能满足我们的需求,例如安装一些安装比较少的第三方软件,或自定义的项目,这个时候只能先用公共仓库镜像,启动容器,然后在容器中按照我们的需求安装软件,修改配置等等操作,之后提交镜像等等。

Dockerfile简介

Dcokerfile是一个文本格式的配置文件,由一系列命令和参数构建的脚本,用户可通过这个快速构建自定义的镜像 

​ 官方仓库dockerhub和一些镜像仓库已经提供大量的镜像,但有些时候不能满足我们的需求,例如安装一些安装比较少的第三方软件,或自定义的项目,这个时候只能先用公共仓库镜像,启动容器,然后在容器中按照我们的需求安装软件,修改配置等等操作,之后提交镜像等等。。。

​ 这种方式显得比较臃肿,Dockerfile为自动化创建部署镜像提供了解决方案。

Dockerfile基本结构

基础镜像信息:以哪个镜像作为基础进行制作,用法是FROM 基础镜像名称
维护者信息:指定维护者信息,用法是MANITAINER 名字/邮箱
镜像操作命令:对基础镜像要进行的改造命令,比如安装新的软件,进行特殊配置等,使用run命令
容器启动执行命令:当基于该镜像的容器启动时需要执行哪些命令,常见的是CMD、ENTRYPOINT命令
几个重要参数
ENTRYPOINT,表示镜像在初始化时需要执行的命令,不可被重写覆盖
ENTRYPOINT/CMD都只能在文件中存在一次,并且最后一个生效 多个存在,只有最后一个生效,其它无效!
CMD,表示镜像运行默认参数,可被重写覆盖
copy与add的区别
copy:能够将构建命令所在的主机本地的文件或目录,复制到镜像文件系统
add:不仅能将构建命令所在的主机和目录,还能将远程url对应的文件或目录作为资源复制到镜像文件系统。如果是压缩文件如tar还会帮忙解压
若需要初始化多个命令,彼此可使用&&隔开

很形象的一张图

img_6f70399bf16f6bc023daf2449a7e810c.jpe
来自简书app
#创建dockerfile文件
touch dockerfile

#与mkdir的区别 touch能更新文件时间戳,如果不存在可新建文件(file),mkdir则只是新建目录(folder)
#如果filename存在,使用touch指令可更改这个文件或目录的日期时间,包括存取时间和更改时间
#如果filename不存在,touch指令会在当前目录下新建一个filename空白文件
需注意的地方

在Docker daemon(守护进程)模式下,无论你是使用ENTRYPOINT,还是CMD,最后的命令,一定要是当前进程需要一直运行的,才能够防容器退出,例如

#以下两种方式运行几秒钟之后,容器就会退出
ENTRYPOINT service tomcat8 start
CMD service tomcat8 start 

#以下方式容器不会自动退出
ENTRYPOINT service tomcat8 start && tail -f /var/lib/tomcat8/logs/catalina.out
CMD service tomcat8 start && tail -f /var/lib/tomcat8/logs/catalina.out

如创建包含jdk的ubuntu基础镜像不从本地获取 而在容器内apt-get安装,例如
FROM ubuntu:14.04
MAINTAINER mhy "641084049@qq.com"

RUN apt-get update
RUN apt-get install -y -q openjdk-7-jdk

WORKDIR /

ENV JAVA_HOME /usr/lib/jvm/java-7-openjdk-amd64
CMD ["/bin/bash"]
定制简单的dockerfile并运行完整例子

(这边我用已有的会比较快点,实际应用环境在容器内下载,从宿主机copy或add都有可能用到)

#基础镜像
FROM ubuntu:latest

#维护者信息
MAINTAINER Garwer 

#将压缩好的jdk1.8.0_171 命名为jdk8 并配置环境 (tomcat同理)
COPY jdk1.8.0_171 /usr/local/jdk8/
COPY apache-tomcat-9.0.7 /usr/local/tomcat9/
ENV JAVA_HOME /usr/local/jdk8
ENV PATH $JAVA_HOME/bin:$PATH
ENV CATALINA_BASE /usr/local/tomcat9
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

ENTRYPOINT /usr/local/tomcat9/bin/startup.sh&&tail -F /usr/local/tomcat9/logs/catalina.out
img_baa815b9598cd960de6886203b5b924c.png
文件结构
构建并运行
#在Dockerfile目录下构建镜像 并自定义 镜像名:标签 需注意后面有个.
docker build -t="ubuntu_web:v1" .

#启动镜像 
docker run -d -t -i -p 8080:8080 ubuntu_web:v1
img_d00d53b236a3cca46b76d58c059a31e4.png
img_545a28a2e78de52ead3f53db7f77e5c5.png
进入容器并测试本地运行
img_ed629cfcf3e5efab8e17f06ff08d5104.png
远程访问公网ip测试
2.定制dockerfile,使用springboot项目,导成jar包在ubuntu容器内运行的镜像
#springboot内嵌tomcat,例如在本地运行java -jar xxx  
java -jar docker.jar

#后台运行 后面加& 这种方式缺点是窗口关闭程序中止
java -jar docker.jar &

#不挂断运行命令 退出或终端关闭仍然运行 缺点:当用 nohup 命令执行作业时,缺省情况下该作业的所有输出被重定向到nohup.out的文件中,除非另外指定了输出文件
nohup java -jar docker.jar &

#指定输出文件运行jar 输出内容不打印到屏幕上 将输出pid 日志文件在自定义新生成的out.log查看
nohup java -jar docker.jar >out.log &

#根据不同的启动方式CTRL+c或者杀进程来关闭服务
img_bfdf713c0680bba9d539e3fb64bb1919.png
运行springboot项目导出的jar包

现在将jar包远程到装有docker的宿主机上,再导入到容器中,测试运行,编写dockerfile定制镜像,测试运行

大致步骤
1.将jar包传到服务器上,新建一个目录
2.跟前一个dockerfile大致相同 不过路径要做相应调整,编写dockerfile
3.构建镜像并运行

#构建镜像
docker build -t="ubuntu_springboot:v1" .

#启动镜像 
docker run -d -t -i -p 8080:8080 ubuntu_springboot:v1
#相比于上个dockerfile 因为jar包自带tomcat省掉了tomcat的配置 
FROM ubuntu:latest
MAINTAINER Garwer 
COPY jdk1.8.0_171 /usr/local/jdk8/
ENV JAVA_HOME /usr/local/jdk8
ENV PATH $JAVA_HOME/bin:$PATH
#ENV CATALINA_BASE /usr/local/tomcat9
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
ADD docker.jar app.jar

EXPOSE 8080

#运行这个jar -jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
img_d2ceec0768e4b6bca6779e1a52104998.png
成功运行并通过公网访问
目录
相关文章
|
9月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
790 1
|
前端开发 算法 API
构建高性能图像处理Web应用:Next.js与TailwindCSS实践
本文分享了构建在线图像黑白转换工具的技术实践,涵盖技术栈选择、架构设计与性能优化。项目采用Next.js提供优秀的SSR性能和SEO支持,TailwindCSS加速UI开发,WebAssembly实现高性能图像处理算法。通过渐进式处理、WebWorker隔离及内存管理等策略,解决大图像处理性能瓶颈,并确保跨浏览器兼容性和移动设备优化。实际应用案例展示了其即时处理、高质量输出和客户端隐私保护等特点。未来计划引入WebGPU加速、AI增强等功能,进一步提升用户体验。此技术栈为Web图像处理应用提供了高效可行的解决方案。
|
10月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
1080 64
|
JSON 前端开发 Java
深入理解 Spring Boot 中日期时间格式化:@DateTimeFormat 与 @JsonFormat 完整实践
在 Spring Boot 开发中,日期时间格式化是前后端交互的常见痛点。本文详细解析了 **@DateTimeFormat** 和 **@JsonFormat** 两个注解的用法,分别用于将前端传入的字符串解析为 Java 时间对象,以及将时间对象序列化为指定格式返回给前端。通过完整示例代码,展示了从数据接收、业务处理到结果返回的全流程,并总结了解决时区问题和全局配置的最佳实践,助你高效处理日期时间需求。
2144 0
|
存储 Java 数据库
Spring Boot 注册登录系统:问题总结与优化实践
在Spring Boot开发中,注册登录模块常面临数据库设计、密码加密、权限配置及用户体验等问题。本文以便利店销售系统为例,详细解析四大类问题:数据库字段约束(如默认值缺失)、密码加密(明文存储风险)、Spring Security配置(路径权限不当)以及表单交互(数据丢失与提示不足)。通过优化数据库结构、引入BCrypt加密、完善安全配置和改进用户交互,提供了一套全面的解决方案,助力开发者构建更 robust 的系统。
476 0
|
12月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:路由、中间件、参数校验
Gin框架以其极简风格、强大路由管理、灵活中间件机制及参数绑定校验系统著称。本文详解其核心功能:1) 路由管理,支持分组与路径参数;2) 中间件机制,实现全局与局部控制;3) 参数绑定,涵盖多种来源;4) 结构体绑定与字段校验,确保数据合法性;5) 自定义校验器扩展功能;6) 统一错误处理提升用户体验。Gin以清晰模块化、流程可控及自动化校验等优势,成为开发者的优选工具。
|
12月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。
|
11月前
|
安全 JavaScript Java
java Web 项目完整案例实操指南包含从搭建到部署的详细步骤及热门长尾关键词解析的实操指南
本项目为一个完整的JavaWeb应用案例,采用Spring Boot 3、Vue 3、MySQL、Redis等最新技术栈,涵盖前后端分离架构设计、RESTful API开发、JWT安全认证、Docker容器化部署等内容,适合掌握企业级Web项目全流程开发与部署。
957 0
|
缓存 前端开发 应用服务中间件
Web端实时通信技术SSE在携程机票业务中的实践应用
本文介绍了携程机票前端基于Server-Sent Events(SSE)实现服务端推送的企业级全链路通用技术解决方案。文章深入探讨了 SSE 技术在应用过程中包括方案对比、技术选型、链路层优化以及实际效果等多维度的技术细节,为类似使用场景提供普适性参考和借鉴。该方案设计目标是实现通用性,适用于各种网络架构和业务场景。
406 1
|
缓存 前端开发 应用服务中间件
Web端实时通信技术SSE在携程机票业务中的实践应用
本文介绍了携程机票前端基于Server-Sent Events(SSE)实现服务端推送的企业级全链路通用技术解决方案。文章深入探讨了 SSE 技术在应用过程中包括方案对比、技术选型、链路层优化以及实际效果等多维度的技术细节,为类似使用场景提供普适性参考和借鉴。
499 7

热门文章

最新文章