我是DevOps的新手,专门使用golang和微服务架构。
我想知道应该或不应该在容器中部署应用程序(Docker)。在这种情况下,我有一个使用微服务架构构建的系统。例如,我有2个Web服务,A和B.此外,我还有另一个Web服务器充当这两个服务器之前的网关。
A和B都需要访问数据库,例如MySQL。句柄表A和B处理表B.
我知道在Go中,源代码被编译成单个可执行二进制文件。因为我在这里有3个服务,所以我有3个二进制文件。这三个都作为Web服务器运行,公开JSON REST API。
我的问题是这些:
我可以将这些服务器一起部署在一个运行在不同端口上的主机上吗? 例如,如果我的主机获得IP x.x.x.x,我的网关可以在x.x.x.x:80中运行,A在端口81中运行,B在端口82中运行。 A和B将在外部某处或可能在同一主机内部与MySQL服务器通信。这是一个好习惯吗?持续部署可以使用这种做法吗?
为什么要在像Docker这样的容器中部署和运行这些二进制文件? 我知道自从几年前发布以来,Docker已经找到了轻松集成到开发工作流程中的方法。但是当然使用Docker并不像将代码编译成二进制文件然后将其移动到部署服务器那么简单。使用Docker,我们必须将可执行文件放在容器中,然后将容器移动到部署服务器。
如果不使用Docker,可扩展性和高可用性呢? 我可以使用负载均衡器复制我的服务并在不同的主机中同时运行它们吗?这样我应该在一个主机中部署A,B和网关,在另一个主机中部署另一个A,B和网关,然后在它们前面设置负载均衡器。 A,B和网关分别在端口80,81和82中运行。通过这种方式,我可以在VM或LXD容器中拥有数千个节点,可以分布在数百种裸机上,使用简单的bash脚本和ssh进行部署,或者如果事情变得复杂则使用Ansible。是或否?
那么使用Docker的可扩展性和可用性呢? 我应该将所有服务放在容器中并使用Kubernetes之类的东西来管理它们以实现高可用性吗?这样做会增加开销,对吧?因为团队必须学习像Kubernetes这样的新技术,如果他们还不知道的话。
您能举例说明部署golang服务的一些最佳做法吗?
答案 0 :(得分:4)
我想知道应该或不应该将应用程序部署在容器中(Docker) 为什么我应该在像Docker这样的容器中部署和运行这些二进制文件?
当然,前提是您将构建与实际最终图像分开(为了不包含在所述最终图像构建依赖项中)
请参阅 Golang, Docker and multistage build 中的“Matteo Madeddu”。
我可以将这些服务器一起部署在一个运行在不同端口上的主机上吗?
实际上,即使该端口相同,它们也可以在自己的端口上运行 使用 EXPOSEd port 进行容器内通信。 但是,如果从外部访问它们,那么它们的published port确实需要不同。
如果不使用Docker,可扩展性和高可用性怎么样? 那么使用Docker的可扩展性和可用性呢?
只要您谈论动态状态,就会涉及某种业务流程:请参阅Docker Swarm或Kubernetes以进行有效的群集管理。
Both are available with the latest docker
示例:
答案 1 :(得分:1)
VonCs答案很棒。我只想补充一点:Golang非常适合容器,因为它支持自我维护的二进制文件。这意味着您可以构建大小仅为几MB的容器,而不是典型的高山等容器,通常为数百MB。
查看此read。