简言:
最近刚完成公司的新系统,系统使用的是微服务架构,由于领导说要将服务docker化。下面将我的研究结果分享出来,如若有错误的地方,还请各位大佬多多指点。
目录:
- 什么是docker?
- 使用docker有什么好处?
- docker的使用和docker之间的通信
1. 什么是docker?
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱(沙箱:一个虚拟系统程序)机制,相互之间不会有任何接口。也就是说,我们可以用docker把我们系统和系统所需要的环境以及依赖的软件都打包成一个安装包,然后可以安装到linux或windows上。
关于docker三个核心概念:
- 仓库:存放镜像的仓库
- 镜像:类似于系统镜像
- 容器:镜像的实例
小时候我特喜欢去河边沙滩上玩耍,一般都带着一个袋子,里面装了许多形状的摸具。把沙子打湿之后,拿模具一按,一个形状块就有了,记得小时候最喜欢就就是五角星的模具。偶尔有调皮捣蛋的小伙伴会把我做的形状给弄散,当时我不哭也不恼,拿起模具迅速就再做出一个来,气的他没话可说。有时候突发奇想,想到一种新的形状,然后把它做出来之后,我就会把它记下来,然后回家立马弄个新形状的模具出来。
在这里,我把docker比喻沙滩,而我的袋子就好比仓库,而模具就是镜像,容器自然就是拿模具做出来的形状块。而真正的程序开发中,你可以把镜像理解为我们做的系统的安装包,容器理解为安装后的运行的系统。以上都是我自己个人对docker的理解,如果哪位大佬觉得不合理,还请多交流。
2.使用docker有什么好处?
以往的系统开发有这么一个问题,在开发人员的电脑上开发的系统,跑到其他人的电脑上或者是服务器上,需要配环境、安装一大堆的软件。不同的操作系统安装方法还有可能不一样。等安装完了之后,一启动发现一大堆的报错,而再自己的电脑上跑的好好的(这里我遇到过)。还有就是,有可能公司的文件服务器比较悠闲,运行多个系统又怕干扰(这里可以使用虚拟机,但性能不是很好)。
而使用docker,可以把开发好的系统以及系统所依赖的东西,打包成镜像,然后可以发布到支持docker的平台。并且docker能够确保每个容器都拥有自己的资源,并且和其他容器是隔离的。你可以用不同的容器来运行使用不同堆栈的应用程序等等(docker好处实在太多,我就不一一列举了)。
3.docker的使用和docker之间的通信
怎么安装docker,去哪下载等等我就不讲了,大家都不是编程小白。
第一步:首先下载dotnet core镜像:docker run -it microsoft/dotnet ,这个是启动命令,如果镜像不存在则会自动下载。
第二步:创建一个userservice和emailservice的web api core项目,分别创建user控制器和email控制器,在修改Program类文件
这里email服务依赖于user服务。写好了之后然后再分别发布下项目
第三步:编写Dockerfile
分别在publish文件夹同级建一个Dockerfile
首先编写emialservic的dockerfile
1 FROM microsoft/dotnet #本镜像继承自哪个镜像 2 COPY publish /publish # 拷贝当前文件夹下的publish文件夹到镜像中的根目录下的publish文件夹 3 WORKDIR /publish #设置镜像的工作目录 4 EXPOSE 4001/tcp # 暴露 tcp连接的4001端口 5 CMD ["dotnet","EmailService.dll","--databaseurl=132456789"] #设置命令,以及一些参数
在编写userservice的dockerfile
FROM microsoft/dotnet COPY publish /publish WORKDIR /publish EXPOSE 5000/tcp CMD ["dotnet","UserService.dll"]
有关dockerfile里面的指令解释,请阅读:https://www.cnblogs.com/linjiqin/p/8735230.html
第四步:分别在目录下运行cmd,然后输入:docker build -t dotnet/emailservice . 和 docker build -t dotnet/userservice . (注意后面的 . 号),然后镜像就制作完成了。
第五步:因为emailservice依赖于userservice,所以emailservice和userservice要进行通信。
docker通信有三种方式:
1.通过docker容器ip加端口号。因为docker容器重启之后ip地址会改变,不方便迁移。所以不推荐使用。(除非使用固定ip)
2.通过映射到主机的端口号。这种方式可以,但是会占用主机端口号
3.docker的link机制。docker的link机制可以通过一个name来和另一个容器通信,link机制方便了容器去发现其它的容器并且可以安全的传递一些连接信息给其它的容器。
我采用link机制,首先编写一个docker-compose.yml文件
version: '3' #采用哪个docker-compose的版本 services: #服务集合 user-service: #服务名,name image: dotnet/userservice #启动哪个镜像 ports: #端口映射设置,这里是主机的6001端口映射到docker里的5000端口 - "6001:5000" email-service: #服务名,name: image: dotnet/emailservice #启动哪个镜像 ports: #端口映射设置,这里是主机的4001端口映射到docker的4001端口 - "4001:4001" links: #依赖哪个服务 - "user-service"
然后emailservice可以通过:http://user-service:5000端口来访问userservice服务 。我在前面的代码中已经设置好了,就不用了
运行命令:docker-compose up,就行了
结果图如下