容器化技术与微服务结合—docker(一)
容器化技术与微服务结合—Kubernetes基本介绍(二)
容器化技术与微服务结合—Pod详解(三)
容器化技术与微服务结合—实操service并部署一个简单对外开放的springboot HelloWord服务(四)
容器化技术与微服务结合—结合springcloud微服务框架进行部署(含切换成阿里云docker仓库)(五)
容器化技术与微服务结合—SpringCloud框架与阿里云serverless k8s的结合(六)
微服务现在技术成熟,其实没啥好说的,只是一种概念,一种大型项目无法单机和单应用研发部署而演进的一种新的概念,所以这里就不多介绍了。有太多的开源项目可以让你轻松玩转微服务,springcloud系列、dubbo系列甚至基于netty等自研通信系列。
通信、安全、隔离、熔断降级等,都是微服务的关键词,未必任何场景都需要微服务化。微服务的框架也势必造成研发、运维的成本增加
这里不过多介绍docker,可以自己去查看概念。docker是一种容器化,但是未必是最好的部署方式。对于创业团队或者业务集群(微服务)不是很多的,并且更在意跨区域通信的,使用云方案进行独占资源部署即可,既方便又快捷。
初期使用docker,大部分场景都是为了运维,docker的轻量简单让运维有了革命性的提升。并且大部分机房在同一个机架组内,每台机器又是高配,所以使用docker来运行不同的服务抢占同一个机器的资源。但是当涉及到云或者混合云的时候,你会发现,普通的系统,哪怕是十几个微服务的系统,使用docker甚至k8s编排,都会极大的影响开发效率,提高运维成本,完全没有单机抢占部署(比如一个java程序独占一台EC2资源,EC2不用高配即可)来的方便快捷,具体可以参考博主架构体系博客~
所以对于一个创业或者从0到1的团队,不需要考虑容器化技术,不过当然还是要学习的。
可以看到,其实云方案本身已经是容器化虚拟化技术了。docker和k8s的结合,更多用于独有机房的IT企业,会让运维变得轻量。如果是云或者混合云,博主极度不推荐自建容器化,使用云方案即可
Docker for Mac 要求系统最低为 macOS 10.10.3 Yosemite,或者 2010 年以后的 Mac 机型,准确说是带 Intel MMU 虚拟化的,最低 4GB 内存。
如果系统不满足需求,可以安装 Docker Toolbox。
使用 Homebrew 安装
Homebrew 的 Cask 已经支持 Docker for Mac,因此可以很方便的使用 Homebrew Cask 来进行安装:
brew cask install docker
成功后就有小鲸鱼图标了,自己登陆自己的docker账号,去dockerHub上创建个账号,把镜像发上去即可
docker简单的用法就是:研发完毕打包镜像上传到镜像仓库,然后服务器执行脚本pull最新的镜像,停止现有的镜像服务,然后删除老的镜像,启动新的镜像服务就行啦~
参考 https://www.jianshu.com/p/8b795475e3ce
docker run -d -p 8080:80 --name webserver nginx —用docker启动一个nginx实例,nginx默认80端口。docker将端口映射成8080。服务器访问8080即可。这个服务名称是webserver
docker ps --查看当前运行的服务
docker ps -a --查看所有的服务
docker stop webserver --停止webserver这个服务
docker rm webserver --删除webserver这个服务
docker run -d -p 10002:10001 -e “spring.profiles.active=prod” --name demo luffy -e后面可以带环境变量。更好的适配应用的配置文件
docker build -f ./Dockerfile -t codemon/luffy-dev . 创建镜像,后面有那个点,如果Dockerfile在当前目录下, -f ./Dockerfile 可以去掉
docker run -d -p 10001:10001 -e “spring.profiles.active=qa” -e “eureka_ip=10.31.12.218” --name demo luffy 这里可以-e无限添加环境变量
docker logs -f -t --since=“2017-05-31” --tail=10 edu_web_1
–since : 此参数指定了输出日志开始日期,即只输出指定日期之后的日志。
-f : 查看实时日志
-t : 查看日志产生的日期
-tail=10 : 查看最后的10条日志。
edu_web_1 : 容器名称
以springcloud微服务为例,如何让微服务和docker结合?springboot和cloud的脚手架这里就不介绍了
1.在你的项目中创建一个Dockerfile文件,内容:
FROM frolvlad/alpine-oraclejdk8:slim
RUN mkdir /docker/demo
RUN mkdir /docker/demo/logs
ADD ./target/app.jar /docker/demo/app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/docker/demo/app.jar"]
2.执行mvn package spring-boot:repackage docker:build
进行打包,达成可执行jar包,然后使用dockerFile构建镜像:
docker build -t codemon/app-dev .
注意最后的点是docker编译时的环境, 结尾重点讲解
3.执行一个非常简单的脚本进行发布
docker stop app
docker rm app
docker rmi docker.io/codemon/app-dev
docker pull codemon/app-dev
docker run -d -p 10001:10001 -v /home/emper/logs/app:/app/logs -e "spring.profiles.active=qa" -e "mysql_ip=xx.xx.xx.xx" -e "mysql_user=qa" -e "mysql_passwd=qa" --name app docker.io/codemon/app-dev
意思就是在服务器上停止老的镜像并删除,下载最新的镜像并启动,-v是挂在磁盘,-e可以无限添加,用于环境变量设定
不需要sudo也可以执行docker命令:http://blog.csdn.net/he_wolf/article/details/37796285
docker换源: http://blog.csdn.net/zzy1078689276/article/details/77371782
docker build -t emper/eureka:v1 .
上面可以看到,默认当前路径下的dockerFile,末尾的 . (点)代表此时docker开始运作(编译)的上下文环境
如果我们将dockerfile改成自己喜欢的名字,并放在任意一个地方,那么我们要执行如下语句
docker build -f ./qa-eureka-docker-file -t emper/eureka:v1 …/…/empr-eureka
-f 后面是dockerfile文件, 命令最后不在是点,而是指定:docker开始运作的时候,实在哪个地方执行的。
微服务严格意义上来说,可以说成是k8s容器化编排的一个子集,容器化或者微服务的魅力在于每个业务集群甚至个体都独立掌管子集内部的逻辑甚至DB,相互之间有极大的边界和隔离,这点类似于DDD。
原谅我盗了一张图,可以看到,服务已经不再强依赖于一个共同语言,每个服务质检靠某种协议传输,如果有容器化的编排和管理,那么势必整个大的业务集群就相当于已给内置局域网VPC(参考博主的云架构系列)
所以容器化极大提升了机器的利用率,提升了通信效率,不在依赖于某个云或者某种机器,使得混合云、私有云、公有云都可以随时随地编排部署。