在容器中或不在容器中部署具有微服务架构的 Go 应用程序?
Deploying Go apps with micro-service architecture in containers or not in containers?
我是 DevOps 的新手,特别是使用 golang 和微服务架构。
我想知道 go 应用程序是否应该部署在容器中 (Docker)。在这种情况下,我有一个使用微服务架构构建的系统。例如这里,我有 2 个 Web 服务,A 和 B。我还有另一个 Web 服务器充当这两个服务前面的网关。
A 和 B 都需要访问数据库,例如 MySQL。 A处理tableA,B处理tableB.
我知道在 Go 中,源代码被编译成一个 executable 二进制文件。因为我这里有 3 个服务,所以我有 3 个二进制文件。所有三个 运行 作为 Web 服务器公开 JSON REST API.
我的问题是:
我可以在一台主机 运行ning 的不同端口上一起部署这些服务器吗?
例如,如果我的主机获得 IP x.x.x.x,我的网关可以在 x.x.x.x:80 中 运行,例如端口 81 中的 A 和端口 82 中的 B。 A 和 B 将与位于同一主机外部或内部某处的 MySQL 服务器通信。这是一个好习惯吗?持续部署可以适用于这种做法吗?
为什么我应该部署和 运行 容器中的那些二进制文件,例如 Docker?
我知道自几年前发布以来,Docker 已经找到了轻松集成到开发工作流程中的方法。但是当然使用 Docker 并不像将代码编译成二进制文件然后将其移动到部署服务器那么简单。使用 Docker 我们必须将 executable 放入容器中,然后将容器也移动到部署服务器。
不使用Docker,可扩展性和高可用性怎么样?
我可以使用负载均衡器在不同的主机上同时复制我的服务和 运行 它们吗?这样我应该在一台主机上部署 A、B 和网关,在另一台主机上部署另一个 A、B 和网关,然后在它们前面设置负载均衡器。 A、B、网关运行分别在80、81、82端口。通过这种方式,我可以以 VM 或 LXD 容器的形式拥有数千个节点,分布在数百个裸机上,使用简单的 bash 脚本和 ssh 部署,如果事情变得复杂,则使用 Ansible。是还是不是?
使用 Docker 的可扩展性和可用性如何?
我是否应该将所有服务放在容器中并使用 Kubernetes 之类的东西来管理它们以实现高可用性?这样做确实会增加开销,对吗?因为如果他们还不知道,团队将不得不学习像 Kubernetes 这样的新技术。
你能给我一个部署 golang 服务的最佳实践的例子吗?
I'm wondering if go applications should or should not be deployed in containers (Docker)
Why should I deploy and run those binaries inside containers like Docker?
当然,前提是您将构建与实际的最终图像分开(以便不包含在所说的最终图像构建依赖项中)
参见“Golang, Docker and multistage build" from Matteo Madeddu.
Can I deploy these servers together in one host running on different ports?
实际上,他们都可以 运行 在他们自己的容器中,在他们自己的端口上,即使那个端口是相同的。
使用 EXPOSEd port,容器内通信将起作用。
但是,如果它们是从外部访问的,那么它们的 published port 确实需要不同。
What about scalibility and high availability without using Docker?
And what about the scalability and availability of using Docker?
一旦谈到动态状态,就会涉及某种编排:请参阅 Docker Swarm or Kubernetes 以了解高效的集群管理。
Both are available with the latest docker.
示例:
- "Building and testing Go apps + monorepo + speed": Or, how we test and build go code in a monorepo, with TravisCI, and deploy to Docker, quickly and easily. From Jonathan Harlap,Wattpad 首席工程师
- "Introducing Functions as a Service (OpenFaaS)", from Alex Ellis
VonC 的回答很棒。我只想补充一件事:Golang 非常适合容器,因为它内置了对自我维持二进制文件的支持。这意味着您可以构建只有几 MB 大小的容器,而不是通常有数百 MB 的带有 alpine 等的典型容器。
看看这个 read。
我是 DevOps 的新手,特别是使用 golang 和微服务架构。
我想知道 go 应用程序是否应该部署在容器中 (Docker)。在这种情况下,我有一个使用微服务架构构建的系统。例如这里,我有 2 个 Web 服务,A 和 B。我还有另一个 Web 服务器充当这两个服务前面的网关。
A 和 B 都需要访问数据库,例如 MySQL。 A处理tableA,B处理tableB.
我知道在 Go 中,源代码被编译成一个 executable 二进制文件。因为我这里有 3 个服务,所以我有 3 个二进制文件。所有三个 运行 作为 Web 服务器公开 JSON REST API.
我的问题是:
我可以在一台主机 运行ning 的不同端口上一起部署这些服务器吗? 例如,如果我的主机获得 IP x.x.x.x,我的网关可以在 x.x.x.x:80 中 运行,例如端口 81 中的 A 和端口 82 中的 B。 A 和 B 将与位于同一主机外部或内部某处的 MySQL 服务器通信。这是一个好习惯吗?持续部署可以适用于这种做法吗?
为什么我应该部署和 运行 容器中的那些二进制文件,例如 Docker? 我知道自几年前发布以来,Docker 已经找到了轻松集成到开发工作流程中的方法。但是当然使用 Docker 并不像将代码编译成二进制文件然后将其移动到部署服务器那么简单。使用 Docker 我们必须将 executable 放入容器中,然后将容器也移动到部署服务器。
不使用Docker,可扩展性和高可用性怎么样? 我可以使用负载均衡器在不同的主机上同时复制我的服务和 运行 它们吗?这样我应该在一台主机上部署 A、B 和网关,在另一台主机上部署另一个 A、B 和网关,然后在它们前面设置负载均衡器。 A、B、网关运行分别在80、81、82端口。通过这种方式,我可以以 VM 或 LXD 容器的形式拥有数千个节点,分布在数百个裸机上,使用简单的 bash 脚本和 ssh 部署,如果事情变得复杂,则使用 Ansible。是还是不是?
使用 Docker 的可扩展性和可用性如何? 我是否应该将所有服务放在容器中并使用 Kubernetes 之类的东西来管理它们以实现高可用性?这样做确实会增加开销,对吗?因为如果他们还不知道,团队将不得不学习像 Kubernetes 这样的新技术。
你能给我一个部署 golang 服务的最佳实践的例子吗?
I'm wondering if go applications should or should not be deployed in containers (Docker)
Why should I deploy and run those binaries inside containers like Docker?
当然,前提是您将构建与实际的最终图像分开(以便不包含在所说的最终图像构建依赖项中)
参见“Golang, Docker and multistage build" from Matteo Madeddu.
Can I deploy these servers together in one host running on different ports?
实际上,他们都可以 运行 在他们自己的容器中,在他们自己的端口上,即使那个端口是相同的。
使用 EXPOSEd port,容器内通信将起作用。
但是,如果它们是从外部访问的,那么它们的 published port 确实需要不同。
What about scalibility and high availability without using Docker?
And what about the scalability and availability of using Docker?
一旦谈到动态状态,就会涉及某种编排:请参阅 Docker Swarm or Kubernetes 以了解高效的集群管理。
Both are available with the latest docker.
示例:
- "Building and testing Go apps + monorepo + speed": Or, how we test and build go code in a monorepo, with TravisCI, and deploy to Docker, quickly and easily. From Jonathan Harlap,Wattpad 首席工程师
- "Introducing Functions as a Service (OpenFaaS)", from Alex Ellis
VonC 的回答很棒。我只想补充一件事:Golang 非常适合容器,因为它内置了对自我维持二进制文件的支持。这意味着您可以构建只有几 MB 大小的容器,而不是通常有数百 MB 的带有 alpine 等的典型容器。
看看这个 read。