上手 Docker 容器,不应该是个问题

来源 | 无敌码农

责编 | 寇雪芹

头图 | 下载于视觉中国

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

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

目前Devops最流行的部署方案是基于K8s的集群方案,但是它本身也是基于Docker容器技术的,所以在接触K8s技术之前,先通过本文了解下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应用并写一个测试接口,如下图所示:


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

  创建Dockerfile文件构建Docker镜像

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

 1FROM java:82VOLUME /tmp3RUN mkdir /app4ADD springboot-1.0-SNAPSHOT.jar /app/springboot.jar5ADD runboot.sh /app/6RUN bash -c 'touch /app/springboot.jar'7WORKDIR /app8RUN chmod a+x runboot.sh9EXPOSE 9090
10CMD /app/runboot.sh
上述Dockerfile文件定义了运行的基础信息为JDK1.8、容器运行的目录为/app、并添加了所需的Jar包等信息,最后定义了要执行的命令为“/app/runboot.sh”脚本。runboot.sh脚本代码如下:
1sleep 10
2java -Djava.security.egd=file:/dev/./urandom -jar  /app/springboot.jar

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

 1<!--Docker Maven插件依赖-->2<plugin>3    <groupId>com.spotify</groupId>4    <artifactId>docker-maven-plugin</artifactId>5    <configuration>6        <imageName>${project.name}:${project.version}</imageName>7        <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>8        <skipDockerBuild>false</skipDockerBuild>9        <resources>
10            <resource>
11                <directory>${project.build.directory}</directory>
12                <include>${project.build.finalName}.jar</include>
13            </resource>
14        </resources>
15    </configuration>
16</plugin>

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

1mvn clean package docker:build

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


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

  创建docker-compose.yml文件

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

 1version: '3.2'2services:3  springboot:4    image: springboot:1.0-SNAPSHOT5    hostname: springboot6    environment:7      - SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE:-debug}8    ports:9      - "9999:9090"
10    networks:
11      - mynet
12networks:
13  mynet:
14    external: true

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

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

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

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

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

1$ docker ps
2CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                                                                      NAMES
34117e4a8963e        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服务了。

点击关注我们,记得标星哦~~~

更多阅读推荐

  • 一张魔力象限图,一眼看尽5G江湖

  • 低代码,让人人都可以是开发者

  • 三探云原生全景图,这次聊聊运行时层

  • 俯瞰云原生,这便是供应层

  • 13种重要的云原生工具,让交付过程更快

  • 冯诺依曼架构的 IO 鸿沟,谁能来填补?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/515430.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue+node前后端分离接口调用(初学者)

一、node编写接口 &#xff08;设定你已使用Nodeexpress搭建好了项目&#xff0c;可参照我的上一篇博客&#xff09; 我们就在users.js下进行接口编写 router.get(/getUserInfo,function(req,res,next){var user new User();//解析路由参数var params URL.parse(req.url, tr…

一款App基于mPaaS小程序如何进行改造?

这篇故事围绕着一款 App 基于 mPaaS 小程序进行改造娓娓展开。 作为国内校园服务场景最丰富的平台&#xff0c;笑联 App 已覆盖国内 130 所高校&#xff0c;服务近百万高校学生。 截止目前&#xff0c;笑联 App 内的 12 个业务模块目前已顺利实现小程序化。不仅获得媲美原生应用…

隐秘的角落里数亿场AI战争正在发生

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; "科技领域不做安全风控&#xff0c;就等于造汽车的时候没有做刹车。”蚂蚁集团首席AI科学家漆远这样形容安全风控的地位…

锐捷发布极简以太全光解决方案 打造“不一样”的全光网

3月9日&#xff0c;锐捷网络举办以“不一样的全光网”为主题的媒体发布会&#xff0c;正式对外发布新一代全光网络解决方案——极简以太全光解决方案&#xff08;以下简称极简光方案&#xff09;。这个方案正是面向不断升温的全光网络市场需求&#xff0c;针对教育、制造、医疗…

写给迷糊的你看的 浏览器从输入URL到页面渲染过程(呕心泣血 1.6w字)

第一步&#xff1a;用户输入 1、 对用户所输入内容进行解析&#xff1a; 为什么需要解析&#xff1a;判断出所输入的关键字是 搜索内容 还是 URL 搜索内容&#xff1a;地址栏会使用浏览器默认的搜索引擎&#xff0c;来合成带关键字的 URL URL&#xff1a;输入内容符合 URL 规则…

在Saas发展的黄金时代里带你理解SaaS设计

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 导读&#xff1a;软件即服务&#xff08;英语&#xff1a;Software as a Service&#xff0c;SaaS&#xff09;&#xff0c;亦…

优秀技术人,如何做到高效沟通?

作者 | 鲁佳(鹿迦) 阿里巴巴项目管理专家 导读&#xff1a;世界上有两件最难的事&#xff1a;把别人的钱装进自己的口袋&#xff1b;把自己的思想装进别人的脑袋。 为什么沟通那么重要 谁都知道在工作中沟通是非常重要的&#xff0c;那大家有没有真正想过为什么沟通这么重要…

技术分享助你突破职场瓶颈

IT行业是吃“青春饭”吗&#xff1f;IT行业35岁“中年危机”是否真的存在&#xff1f;个人认为竞争是激烈的&#xff0c;危机是存在的&#xff0c;如何破局成为每一个IT人必须面对的严峻课题。遥想2015年&#xff0c;我的职场生涯度过了轻松的5年&#xff0c;在传统行业过着朝九…

抖音实战~手机号验证码一键注册登录流程(限制手机终端登录)

文章目录一、手机号验证码二、前端2.1. 点击登陆流程2.2. 点击登录源码三、后端登录3.1. 登录流程图3.2. 流程简述3.3. 手机号验证码登录流程一、手机号验证码 二、前端 2.1. 点击登陆流程 1.先校验手机号是否合法&#xff1f;不合法&#xff0c;则提示“请输入正确的手机号”…

阿里云高级技术专家:面向5G的云网一体及云原生应用实践

7月15日&#xff0c;阿里云高级技术专家李晓成在2020亚太内容分发大会上发表《面向5G的云网一体及云原生应用实践》主题演讲&#xff0c;从边缘计算产业机遇与挑战来解读阿里云边缘计算的布局&#xff0c;并分享阿里云在云网一体化、边缘云原生等领域的技术实践&#xff0c;本文…

抖音实战~用户登出

文章目录一、前端1. 登出流程2. 流程简述3. 源码二、后端2.1. 登出逻辑2.2. 源码一、前端 1. 登出流程 2. 流程简述 1.点击登出按钮触发登出事件2.调用登出后端api3.后端返回 3.1. 成功&#xff1a;删除终端缓存的用户信息和token信息3.2. 失败&#xff1a;提示错误信息 4.跳…

无法恢复,欧洲云服务巨头数据中心起火

数据中心起火事件频频发生&#xff0c;这次 OVH 数据中心被大火烧毁又堪称是数据中心历史上史无前例的灾难性事件&#xff0c;数据中心到底该如何保护呢&#xff1f;作者 | 郑丽媛出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;报&#xff01;请注意&#xff0c;你…

128核云原生新力作:Ampere® Altra® Max性能参数公布,提升50%!

安晟培半导体科技有限公司&#xff08;Ampere Computing&#xff09;于日前公布了云原生服务器处理器Ampere Altra Max样片的基准测试数据。Ampere Altra Max是Ampere继去年3月发布的80核Altra 处理器后即将推出的重磅新品&#xff0c;内核数量达到业界领先的128核&#xff0c;…

《从单体迈向 Serverless 的避坑指南》

简介&#xff1a; 用户需求和云的发展两条线推动了云原生技术的兴起、发展和大规模应用。本文将主要讨论什么是云原生应用&#xff0c;构成云原生应用的要素是什么&#xff0c;什么是 Serverless 计算&#xff0c;以及 Serverless 如何简化技术复杂度&#xff0c;帮助用户应对快…

腾讯云~Docker安装RabbitMQ

文章目录1. 测试2. 安装策略组3. 控制台1. 测试 docker run -d --name myRabbitMQ -e RABBITMQ_DEFAULT_USERimooc -e RABBITMQ_DEFAULT_PASS123456 -p 15672:15672 -p 5672:5672 rabbitmq:3.8.14-management企业内部使用参考&#xff1a;https://gblfy.blog.csdn.net/article…

定义下一代存储,打造全新一代数据基础设施

简介&#xff1a; 智能时代&#xff0c;阿里云正重新定义下一代存储&#xff0c;打造全新一代数据基础设施。在未来&#xff0c;数据势必呈爆发式地增长&#xff0c;那么对于存储的性能&#xff0c;必然会提出更高、更严苛的要求。此次直播阿里云将为大家带来7款存储产品新功能…

Docker私有镜像仓库是什么?

来源 | 无敌码农责编 | 寇雪芹头图 | 下载于视觉中国Docker镜像仓库概述镜像仓库作为Docker技术的核心组件之一&#xff0c;其主要作用就是负责镜像内容的存储和分发。Docker镜像仓库从使用范围来说分为“公有镜像仓库”和“私有镜像仓库”&#xff0c;公有镜像仓库是可以被任何…

《掌门1对1微服务体系 Solar | 阿里巴巴 Sentinel 落地实践》

简介&#xff1a; 前言 掌门1对1精耕在线教育领域&#xff0c;近几年业务得到了快速发展&#xff0c;但同时也遭遇了“成长的烦恼”。随着微服务数量不断增加&#xff0c;流量进一步暴增&#xff0c;硬件资源有点不堪重负&#xff0c;那么&#xff0c;如何实现更好的限流熔断…

腾讯云~Docker安装Redis6.2.6

文章目录1. 测试2. 安装策略组3. 远程连接1. 测试 无密码 docker run \ -d \ --name redis-my \ -v /app/redis/data:/data \ -p 16379:6379 \ redis:6.2.6有密码&#xff08;推荐&#xff09; docker run \ -d \ --name redis-my \ -v /app/redis/data:/data \ -p 16379:63…

中台,很多人理解的都不对

简介&#xff1a; 最近中台比较热&#xff0c;但业界内并没有对中台有统一认可清晰的定义&#xff0c;很多人会把中台与数据仓库、数据湖混为一谈。但需要提醒读者注意的是&#xff0c;数据中台并不是一个系统&#xff0c;它首先是一种组织架构。前言&#xff1a; -更多关于数智…