您当前的位置:首页 > 电脑百科 > 程序开发 > 容器

深入浅出微服务架构:一分钟让你轻松上手Docker容器

时间:2020-03-16 10:48:29  来源:  作者:
深入浅出微服务架构:一分钟让你轻松上手Docker容器

 

在微服务时代,服务数量及规模越来越大,服务的部署及运维的模式如果仍然采用传统方式就会大大增加运维成本。所以微服务时代的运维方式一定是Devops模式,通过构建自动化运维发布平台来打通产品、开发、测试及运维流程,从而整体上提升研发效能,而这也是目前大部分公司正在做的事情。

随着以Docker为代表的容器化技术的普及,目前Devops实践大多会采用容器(如Docker、K8s)这样的方式来作为微服务应用部署运行的载体,并通过容器的弹性扩展来实现快速扩容和缩容,从而更快地响应业务、更好地利用资源。

目前Devops最流行的部署方案是基于K8s的集群方案,但是它本身也是基于Docker容器技术的,所以在接触K8s技术之前,先通过本文了解下Docker及基于Docker的容器化部署。

Docker的基本概念

Docker是一个开源的应用容器引擎,也是目前最流程的应用部署方式,通过它可以把应用及其依赖打包到一个可移植的镜像中,然后利用Docker提供的部署机制将其发布至任意安装了Docker容器的系统环境中。从使用角度主要需要理解一下几个要点如图所示:

深入浅出微服务架构:一分钟让你轻松上手Docker容器

 

如上图所示,理解Docker的使用方式需要掌握以下几个概念:

  • Image(镜像):它是一个可执行文件,包含应用代码、依赖库、运行环境(如JRE等)以及环境变量及配置等信息,通过镜像可以启动一个应用,镜像的构建过程通过Dockefile文件描述。
  • Container(容器):使用Image启动的一个进程实例,它与镜像之间为一对多的关系,一个镜像可以启动多个容器实例。
  • Service(服务):一组提供对外服务的Container,这些Container使用同一个Image镜像,它与镜像为一对一、与容器为一对多的关系,Service由docker-compose文件定义。
  • Stack(应用):一组Service,相互协作对外提供服务,可以看作是一个完整的应用,在一些复杂的场景中会拆分为多个Stack,由docker-compose构建。

Docker部署一个Spring Boot服务

为了更进一步加深对上述概念的理解,这里以一个Spring Boot应用为例演示如何通过Docker部署一个Spring Boot服务。这里可以通过IDE创建一个简单的Spring Boot应用并写一个测试接口,如下图所示:

深入浅出微服务架构:一分钟让你轻松上手Docker容器

 

以上为通过IDEA创建的一个最为简单的Spring Boot应用程序,运行后启动服务可以通过端口访问测试接口,接下来使用Docker部署该服务,步骤如下:

创建Dockerfile文件构建Docker镜像

按照前面Docker的介绍,如果要让Spring Boot程序运行在Docker容器上,首先需要构建Docker镜像,而构建的过程则需要通过Dockerfile文件来描述。例如在项目src/main/docker目录创建Dockerfile文件,代码如下:

FROM JAVA:8
VOLUME /tmp
RUN mkdir /App
ADD springboot-1.0-SNAPSHOT.jar /app/springboot.jar
ADD runboot.sh /app/
RUN bash -c 'touch /app/springboot.jar'
WORKDIR /app
RUN chmod a+x runboot.sh
EXPOSE 9090
CMD /app/runboot.sh

上述Dockerfile文件定义了运行的基础信息为JDK1.8、容器运行的目录为/app、并添加了所需的Jar包等信息,最后定义了要执行的命令为“/app/runboot.sh”脚本。runboot.sh脚本代码如下:

sleep 10
java -Djava.security.egd=file:/dev/./urandom -jar  /app/springboot.jar

这里打包Spring Boot应用Docker镜像的Dockerfile文件就定义好了,为了能在Maven项目中执行Docker镜像构建命令,还需要在项目pom.xml文件添加Maven Build插件信息,代码如下:

<!--Docker Maven插件依赖-->
<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <configuration>
        <imageName>${project.name}:${project.version}</imageName>
        <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
        <skipDockerBuild>false</skipDockerBuild>
        <resources>
            <resource>
                <directory>${project.build.directory}</directory>
                <include>${project.build.finalName}.jar</include>
            </resource>
        </resources>
    </configuration>
</plugin>

接下来可以通过Maven命令构建Spring Boot应用Docker镜像,命令如下:

mvn clean package docker:build

运行成功可以看到本地Docker仓库中镜像信息,命令如下:

深入浅出微服务架构:一分钟让你轻松上手Docker容器

 

这表示Spring Boot程序的Docker镜像已打好,需要说明的是以上命令运行是需要你的系统已经安装Docker容器运行环境。

创建docker-compose.yml文件

有了Docker镜像,如何将镜像作为容器启动以及该镜像中启动那些服务、它的资源限制及网络使用什么方式,这些都是docker-compose文件定义的,其代码如下:

version: '3.2'
services:
  springboot:
    image: springboot:1.0-SNAPSHOT
    hostname: springboot
    environment:
      - SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE:-debug}
    ports:
      - "9999:9090"
    networks:
      - mynet
networks:
  mynet:
    external: true

在上述docker compose文件中定义了一个springboot服务,然后针对该服务描述了其所使用的Docker镜像、环境变量参数、容器端口映射及网络等信息。需要说明的是services下面还可以定义服务,stack(应用)与service(服务)的关系在docker-compose中是一对多的关系,只是这里暂时没有需要定义其他服务。

启动Docker容器实现应用容器部署

通过上述准备,此时就可以通过docker-compose启动Spring Boot应用的Docker镜像,目录切换到src/main/docker目录,执行如下命令:

$ docker-compose up -d
Creating docker_springboot_1 ... done

此时应用就已经通过Docker容器部署了,可以通过如下命令进行查看:

$ docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                                                                      NAMES
4117e4a8963e        springboot:1.0-SNAPSHOT   "/bin/sh -c /app/run…"   5 seconds ago       Up 3 seconds        9090/tcp, 0.0.0.0:9999->9999/tcp                                           docker_springboot_1

到这里就大功告成了,访问9999端口就能够访问到Docker容器中的Spring Boot服务了。



Tags:Docker容器   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
一、前因闲来没事,想着升级下树莓派中的应用,没曾想,全是最新的,害我以为被黑客眷顾,帮我升级了。多方查证,才知道,是上次搭建的photoprism搞的鬼,不过也不全是它的锅,只是它的yml文...【详细内容】
2021-12-28  Tags: Docker容器  点击:(2)  评论:(0)  加入收藏
对于初学者来说,刚刚接触docker会有点迷,特别是镜像与容器。其实我们可以理解镜像与容器为一对多的关系。下图错误的示范,为什么是错误的呢?因为可以通过一个镜像确实可以启动...【详细内容】
2021-06-09  Tags: Docker容器  点击:(136)  评论:(0)  加入收藏
Photo by William Warby on Unsplash您是否曾经想过为什么您的单应用程序Docker容器会增长到400 MB? 或者,也许为什么一个只有几十MB的应用程序二进制文件会生成一个MB的Docke...【详细内容】
2021-04-02  Tags: Docker容器  点击:(233)  评论:(0)  加入收藏
虚拟技术和云飞速发展的今天,云和容器已经深入人心,每个IT人都或多或少的使用容器和云。但是用归用,很多人对其底层的原理确实知之甚少。很多人想把容器当成虚拟机来用,却遭遇大...【详细内容】
2021-03-10  Tags: Docker容器  点击:(230)  评论:(0)  加入收藏
前言我之前发过几篇文章,比如搭建Zabbix监控系统、搭建ELK日志分析平台等,那有不少网友就给我留言了,说不用这么麻烦,用Docker部署就可以了,分分钟就搞定的事情。Docker真的有这...【详细内容】
2021-01-12  Tags: Docker容器  点击:(158)  评论:(0)  加入收藏
现在的项目部署运维中,使用Docker容器越来越多,Docker给我们提供创建容器的方式也有好几种,主要是docker run命令、Dockerfile文件、docker-compose三种方式,一个比一个方便。我...【详细内容】
2020-11-20  Tags: Docker容器  点击:(113)  评论:(0)  加入收藏
你是否还在大量控制台窗口中监控容器,还是对使用终端命令充满热情?而使用Docker的图形用户界面(GUI)工具,则可以更简单的对容器进行管理,并提高效率。而且它们都是免费的。Portain...【详细内容】
2020-11-16  Tags: Docker容器  点击:(114)  评论:(0)  加入收藏
本篇文章我们将讲解跨主机网络的容器通信实现,涉及到Docker overlay网络与MacVlan网络的解决方案,下面我们就一起来学习吧!01 Docker跨主机网络通信跨主机的容器网络方案主要有...【详细内容】
2020-10-26  Tags: Docker容器  点击:(92)  评论:(0)  加入收藏
接着文章「系统架构」如何使用Dockerfile制作Docker容器?(1)我们继续介绍ENV、ARG、VOLUME、EXPOSE、WORKDIR、USER、HEALTHCHECK、ONBUILD几个命令。7、ENV这个指令很简单,就...【详细内容】
2020-08-16  Tags: Docker容器  点击:(77)  评论:(0)  加入收藏
Docker让开发者可以打包应用程序及依赖包到可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。许多开发者关心如何在Docker容器中实现软件加密及授...【详细内容】
2020-08-07  Tags: Docker容器  点击:(98)  评论:(0)  加入收藏
▌简易百科推荐
一、前因闲来没事,想着升级下树莓派中的应用,没曾想,全是最新的,害我以为被黑客眷顾,帮我升级了。多方查证,才知道,是上次搭建的photoprism搞的鬼,不过也不全是它的锅,只是它的yml文...【详细内容】
2021-12-28  闲余悟道    Tags:Docker   点击:(2)  评论:(0)  加入收藏
一、为什么要搭建主从架构呢1.数据安全,可以进行数据的备份。2.读写分离,大部分的业务系统来说都是读数据多,写数据少,当访问压力过大时,可以把读请求给到从服务器。从而缓解数据...【详细内容】
2021-12-15  实战Java    Tags:Docker   点击:(12)  评论:(0)  加入收藏
在网页中渲染公式一直是泛学术工具绕不开的一个功能,最近更新产品功能,正巧遇到了这个需求,于是使用容器方式简单实现了一个相对靠谱的公式渲染服务。分享出来,希望能够帮到有类...【详细内容】
2021-12-01  编程菌zfn    Tags:Docker   点击:(11)  评论:(0)  加入收藏
1.1 docker命令直接部署1.1.1 拉取镜像docker pull wurstmeister/zookeeperdocker pull wurstmeister/kafka1.1.2 启动zookeeper容器docker run -d --name myzookeeper -p 2...【详细内容】
2021-11-15  无    Tags:docker   点击:(48)  评论:(0)  加入收藏
01 前言 顺着docker的发展,很多测试的同学也已经在测试工作上使用docker作为环境基础去进行一些自动化测试,这篇文章主要讲述我们在docker中使用浏览器进行自动化测试如果可以...【详细内容】
2021-10-29  小码哥聊软件测试    Tags:Docker   点击:(42)  评论:(0)  加入收藏
因为你懂得的原因,下载docker镜像速度非常喜感,故收集几个国内常用的docker镜像。Docker中国区官方镜像地址:https://registry.docker-cn.com网易163的镜像http://hub-mirror.c...【详细内容】
2021-10-28  抓蛙程序猿    Tags:docker   点击:(48)  评论:(0)  加入收藏
环境:Spring5.3.10通常,应用程序开发人员不需要对ApplicationContext实现类进行子类化。相反,SpringIOC容器可以通过插入特殊集成接口的实现来扩展。使用BeanPostProcessor自定...【详细内容】
2021-10-26  Java网络研发架构师    Tags:Spring   点击:(34)  评论:(0)  加入收藏
我们在很多场景下都需要做笔记,来对抗遗忘,一份好的笔记不仅能在需要的时候供我们查阅,也能帮助我们归纳整理知识提高做事效率。 目前市面上有很多云笔记软件,体验上各有不同,但...【详细内容】
2021-10-11  运维贼船    Tags:docker   点击:(62)  评论:(0)  加入收藏
1. Nacos官网Nacos Docker 快速开始2. Clone 项目git clone https://github.com/nacos-group/nacos-docker.git3. cd 到nacos-docker 路径下 直接启动即可cd nacos-dockerdo...【详细内容】
2021-09-16  程序狗爱化妆    Tags:Nacos   点击:(109)  评论:(0)  加入收藏
今天不做保姆级教程,分享奶爸常用、好用的Docker应用。有了这些Docker,Nas的可玩性会大幅提高,有时候奶爸也在想,刨去官方套件不考虑的话,Nas真的是差不多。如果小伙伴们有需要,后...【详细内容】
2021-09-03  晋升奶爸的垃圾佬    Tags:Docker   点击:(168)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条