上手 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 鸿沟,谁能来填补?
上手 Docker 容器,不应该是个问题相关推荐
- 云服务器部署斗地主(docker容器部署,上手容易)
商用版H5棋牌游戏! 支持千万级用户同时在线!!! 发布此版本的初衷: 朋友聚会打个牌玩个麻将什么的,现在的游戏平台都要充值才能玩,而且还需要下载app.安装和注册,很麻烦-不能尽兴娱乐. 所以,整合 ...
- windows container (docker) 容器资料笔记
背景 业务需求:简化公司私有云,公有云的部署,尝试寻找更好的,更优化的技术方案替换现有的虚拟机部署方案. 技术背景: .net Docker 学习资料 Docker中文社区: http://www.d ...
- k8s 创建资源的两种方式 - 每天5分钟玩转 Docker 容器技术(124)
命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1. 用 kubectl 命令直接创建,比如: kubectl run nginx-deployment --image=nginx ...
- Docker容器实战思维
Docker成功的基础 Docker的实现用到的基础技术(cgroups, namespace,分层文件系统)在Docker之前已经存在很多年,并且 Linux Containers(LXC)也在很多 ...
- 为什么Docker容器将占领世界
为什么Docker容器将占领世界 我加入了bieryun,主持了一个关于Docker的网络研讨会,以及您可以使用容器将传统Windows应用程序迁移到云端以及运行开源无服务器平台. 我分享了Docke ...
- 微服务项目部署在docker容器运行
昨天的一篇微服务项目中涉及到docker部署,今天写一篇关于微服务项目部署在docker容器中运行,使用github上另外一个比较经典的微服务项目piggyMetric,项目的github地址:htt ...
- 正式环境docker部署hyperf_HyperLedger/Fabric SDK使用Docker容器镜像快速部署上线
HyperLedger/Fabric SDK Docker Image 该项目在github上的地址是:https://github.com/aberic/fabric-sdk-container ( ...
- Docker 快速入门(一文上手 Docker)
通过本篇文章,就可以达到在 Window 或 Linux 上手 Docker(有点长,可以根据目录选择你需要的内容看) 文章图片没有带过来,涉及的图片较多,就不一一挪了,大家可以直接看我 GitCha ...
- 自动化运维-----Docker容器
文章目录 一.Docker简介 1.什么是虚拟化 2. 什么是Docker 3.为什么选择Docker?(*敲黑板) 4.容器与虚拟化的比较 5.Docker组件 (1)Docker服务器与客户端 ( ...
最新文章
- Git命令集十五——拉取命令
- 11个三相异步电动机常见故障与维修方法。
- 形态学图像处理学习笔记
- android系统换动画,Android Activity动画跳转修改
- SAP License:特殊采购类型-寄售及其结算
- 微软开源项目 NeuronBlocks:像搭积木一样构建 NLP 深度学习模型!
- 《海量数据库解决方案》之位图索引的结构和特征
- AndroidTV开发12——大屏TV电视及盒子Apk远程安装说明文档
- MT4本地跟单使用说明
- UBuntu安装配置记录
- Python那些让我疑惑许久的代码--2
- 2015年度中国智能路由器市场监测报告
- 教你1个转换小技巧,免费多张jpg合并成pdf
- 20230304 CF855 div3 vp
- Symantec Backup Exec 2012 Agent For Linux安装
- Linux下tree命令的安装与使用
- 富兰克林自传 - 笔记
- PR剪辑教学之定格动画的制作
- 外景黑纱婚纱照高级感十足
- 方舟手游服务器配置文件,方舟完整gameperiod;ini文件 | 手游网游页游攻略大全
热门文章
- 华为服务器sn号查询网站,linux 查询服务器sn
- python怎么播放mp3_python上播放mp3歌曲
- leetcode 3 --- 无重复字符的最长子串
- amd插帧技术如何开启_联想ThinkPad笔记本电脑如何开启CPU的虚拟化技术图文教程...
- oracle关于时区,关于oracle时区
- mysql php 乱码问题_解决php与mysql中文乱码问题
- python简单网络爬虫_【Python】 简单网络爬虫实现
- 公式之美:打通复杂思维的任督二脉
- 以国家战略科学家身份,顶级AI学者朱松纯回国,筹建北京通用AI研究院
- 【福利】爱德华·阿什福德·李:人类与AI技术将是共生关系