Learn DevOps:Start DevOps with Docker(三)
一、Docker与Microservices
很多人都在谈论microservices的优势,但是它不是免费的,面临着许多挑战,Docker在解决这些挑战方面发挥至关重要的作用。在微服务体系结构中,我们将构建许多微小的服务,而不是构建一个大的整体,这些微服务中的每一个都可以用不同的技术来构建。由于这些微服务十分微小,因此部署数量呈指数级增长,如果我们有一个整体的应用程序,并且每天执行10次部署,那么在微服务架构中构建相同的程序,则要执行数百次或数千次部署。Docker帮助我们简化构建过程,我们可以创建可以在任何地方运行的image,我们不需要担心如何部署,只需要创建一个符号标准的image。
如果我们所有微服务都构建为container,那么我们还可以围绕这些容器构建许多技术,我们可以使用标准程序进行监视、扩展和部署,还可以使用容器编排工具。
接下来,让我们快速概述一下我们在本课程中使用的两个微服务。我们有两个微服务:
- Currency Conversion Service
- Currency Exchange Service
这两个简单的微服务可以相互通信,一个微服务需要知道另一个微服务在哪里,在这里,我们创建了一个环境变量。因此我们可以在Currency Conversion Service中构建一个环境变量,指定另一个微服务的位置。
Configure an Environment Variable - `CURRENCY_EXCHANGE_SERVICE_HOST` --env CURRENCY_EXCHANGE_SERVICE_HOST=http://currency-exchange
所以我们只需要配置host,这个host作为环境变量。
现在让我们在本地计算机中运行一下这些微服务,先去Docker hub网站寻找微服务的镜像:
https://hub.docker.com/u/in28min
找到0.0.1.RELEASE:
运行如下命令:
docker run -p 8000:8000 --name=currency-exchange in28min/currency-excahnge:0.0.1-RELEASE
此处我们使用“--name”来进行命名,然后运行命令:
程序已经成功运行,现在我们去文件中寻找网址:
http://localhost:8000/currency-exchange/from/EUR/to/INR
可以看到程序已经运行并返回结果,现在让我们删除现有的容器,使用detached模式来运行:
成功运行,现在让我们尝试运行另一个微服务:
docker run -d -p 8100:8100 --name=currency-conversion in28min/currency-conversion:0.0.1-RELEASE
http://localhost:8100/currency-conversion/from/EUR/to/INR/quantity/10
让我们使用这个网址,但是看到出现了错误:
当一个微服务试图从容器内部调用另一个微服务是,它无法与之对话。应该如何解决呢?我们在下一步中来详细解释。
二、Using Docker Link to Connect Microservices
我们需要知道的是,Docker中的默认网络模式实际上是一种称为桥接网络的模式。存在于默认桥接网络中的容器不能使用本地主机直接相互通信。使用如下命令:
docker network ls
我们可以看到bridge网络,接下来执行这个命令:
docker network inspect bridge
我们可以看到两个微服务都是桥接网络的一部分,因此二者不能进行通信。如果我们想要进行交谈,能做的就是“抄近路”。这是一条捷径,当然有其他更好的方法。
我们现在将其他容器都停止,只留下currency exchange,现在我希望两个服务可以对话,我们需要在他们两个之间构建联系, 使用如下命令,使用“--link”来建立连接,此外我们还要更新URL。当我们建立连接后,可用于currency-exchange的URL是什么?
其容器的名称为“currency-exchange”,则URL就是:http://currency-exchange。
docker run -d -p 8100:8100 --env CURRENCY_EXCHANGE_SERVICE_HOST=http://currency-exchange --name=currency-conversion --link currency-exchange in28min/currency-conversion:0.0.1-RELEASE
我们不用担心使用哪种技术来构建微服务,我们都可以创建环境变量,配置使微服务可以相互通信,因此我们加入了“--env”环境变量。
现在我们可以看到程序正常运行,并且返回信息。
总结:当我们将两个容器发送到桥接网络中时,可以使用link在它们之间建立连接,但是这不总是推荐的选项,接下来我们将探索其他的方法。
二、Using customer networking to connect
我们可以看到,任何创建的容器都默认分配为桥接网络,
我们可以看到,此处还有其他的选项,比如host和none。当我们在主机网络上运行容器时,容器将直接在主机上运行,不使用自己的任何网络,而是直接在主机的网络中运行。另一个选项是none,也就是没有网络,我们不会和其他任何container有联系,这个我们不考虑使用。
Host网络只适用于Linux系统,那么我们应该怎么办呢,我们可以创建自定义网络,让这些服务成为网络的一部分。使用如下命令:
docker network create currency-network
然后删除现有的container:
docker container rm currency-conversion
docker container rm currency-exchange
运行下边的命令:
docker run -d -p 8000:8000 --name=currency-exchange --network=currency-network in28min/currency-exchange:0.0.1-RELEASE
docker run -d -p 8100:8100 --env CURRENCY_EXCHANGE_SERVICE_HOST=http://currency-exchange --name=currency-conversion --network=currency-network in28min/currency-conversion:0.0.1-RELEASE
可以看到环境变量不变,我们不再需要--link,而是增加了--network。一旦容器成为同一网络的一部分,它们就可以使用“http://容器名称”。此时我们到网页刷新,可以看到两个服务都正常运行。
三、Docker compose简化命令
在上一节中,我们可以看到命令越来越长,变得很棘手。Docker compose是一个用于定义和运行多容器Docker应用程序的工具。当我们有多个容器希望相互通信时,可以使用这个工具。
我们的Docker desktop已经包含了这个工具,进入我们的文件,我们可以看到docker-compose.yaml。文件的内容十分简单:
1. 首先我们定义了version
2. 接着我们定义了所有的微服务
3. 最后我们定义了network,在这里我们希望使用自定义的网络
depends_on说明conversion的服务是否可用取决于货币兑换服务是否可用。
我们进入到当前目录下,运行如下命令:
docker-compose up
然后我们到网页刷新,发现两个服务都已经成功启动运行。
Docker compose的好处是我们不需要担心如何连接服务,以及需要传递哪些环境变量,这些配置都存在于yaml中,无论何时我们想要添加新的微服务,只需要将其添加到yaml中,启动的命令保持不变。
接下来我们希望在detached模式下运行,输入如下命令:
docker-compose up -d
docker-compose images
这个命令会查看compose正在使用的image列表,
docker-compose ps # 查看所有container
docker-compose top
docker-compose pause docker-compose unpause
docker-compose stop
docker-compose kill