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
成功运行并通过公网访问
目录
相关文章
|
1天前
|
Linux 持续交付 Docker
掌握Docker:从入门到实践
Docker 是一个开源容器引擎,允许开发者将应用及其依赖打包成可移植的容器,在任意 Linux 机器上运行。本文从基本概念入手,详细介绍 Docker 的安装、基本操作、镜像构建及 Docker Compose 的使用,并通过实战案例展示如何部署 Web 应用、构建微服务架构及实现 CI/CD。通过学习,你将掌握 Docker 的核心功能,提升应用开发和部署效率。
|
14天前
|
Linux iOS开发 Docker
Docker:容器化技术的领航者 —— 从基础到实践的全面解析
在云计算与微服务架构日益盛行的今天,Docker作为容器化技术的佼佼者,正引领着一场软件开发与部署的革命。它不仅极大地提升了应用部署的灵活性与效率,还为持续集成/持续部署(CI/CD)提供了强有力的支撑。
192 69
|
5天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker与Kubernetes入门
【9月更文挑战第30天】在云计算的浪潮中,云原生技术正以前所未有的速度重塑着软件开发和运维领域。本文将通过深入浅出的方式,带你了解云原生的核心组件——Docker容器和Kubernetes集群,并探索它们如何助力现代应用的构建、部署和管理。从Docker的基本命令到Kubernetes的资源调度,我们将一起开启云原生技术的奇妙之旅。
|
9天前
|
Cloud Native 持续交付 Docker
云原生技术入门与实践:Docker容器化部署示例
【9月更文挑战第25天】在数字化转型的浪潮下,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,为初学者揭示云原生技术的核心概念及其应用价值。我们将以Docker容器为例,逐步引导读者了解如何将应用程序容器化,并在云端高效运行。这不仅是对技术趋势的跟随,更是对资源利用和开发效率提升的探索。
29 4
|
17天前
|
运维 Ubuntu Linux
深入理解并实践Docker容器化技术
深入理解并实践Docker容器化技术
44 6
|
17天前
|
Java 应用服务中间件 开发者
深入探索并实践Spring Boot框架
深入探索并实践Spring Boot框架
27 2
|
21天前
|
Devops jenkins 持续交付
DevOps实践:构建和部署一个Docker化的应用
【9月更文挑战第14天】在当今快节奏的软件开发领域,DevOps已经成为提升效率、加速交付的关键。本文将引导你理解DevOps的核心概念,并通过一个实际的示例—构建和部署一个Docker化的应用—来深入探讨其实践方法。我们将从简单的应用出发,逐步实现Docker容器化,并最终通过CI/CD流水线自动化部署过程。这不仅是对DevOps流程的一次实操演练,也是对现代软件开发理念的一次深刻体验。
|
1月前
|
Cloud Native 持续交付 Docker
云原生技术实践:Docker容器化部署教程
【9月更文挑战第4天】本文将引导你了解如何利用Docker这一云原生技术的核心工具,实现应用的容器化部署。文章不仅提供了详细的步骤和代码示例,还深入探讨了云原生技术背后的哲学,帮助你理解为何容器化在现代软件开发中变得如此重要,并指导你如何在实际操作中运用这些知识。
|
2月前
|
Java Spring Apache
Spring Boot邂逅Apache Wicket:一次意想不到的完美邂逅,竟让Web开发变得如此简单?
【8月更文挑战第31天】Apache Wicket与Spring Boot的集成提供了近乎无缝的开发体验。Wicket以其简洁的API和强大的组件化设计著称,而Spring Boot则以开箱即用的便捷性赢得开发者青睐。本文将指导你如何在Spring Boot项目中引入Wicket,通过简单的步骤完成集成配置。首先,创建一个新的Spring Boot项目并在`pom.xml`中添加Wicket相关依赖。
58 0
|
2月前
|
Java Spring 开发者
Java Web开发新潮流:Vaadin与Spring Boot强强联手,打造高效便捷的应用体验!
【8月更文挑战第31天】《Vaadin与Spring Boot集成:最佳实践指南》介绍了如何结合Vaadin和Spring Boot的优势进行高效Java Web开发。文章首先概述了集成的基本步骤,包括引入依赖和配置自动功能,然后通过示例展示了如何创建和使用Vaadin组件。相较于传统框架,这种集成方式简化了配置、提升了开发效率并便于部署。尽管可能存在性能和学习曲线方面的挑战,但合理的框架组合能显著提升应用开发的质量和速度。
33 0
下一篇
无影云桌面