在过去,我从不同的角度介绍了Docker,包括创建小型docker镜像、用GitlabCI构建私有Go包以及使用它进行集成测试。
这次我将简要讨论几个支持Docker镜像的云提供商(及其服务),Docker几年前为实现多阶段构建小型镜像而添加的最新变化,以及如何使用docker-compose进行本地开发。
什么是Docker?
...是一种工具,旨在通过使用容器使创建、部署和运行应用程序变得更容易。容器允许开发人员将一个应用程序与它所需要的所有部分打包,如库和其他依赖,并作为一个包进行部署。
这些容器是在实例化Docker镜像后创建的,这些镜像需要Docker注册处来向不同的用户分发这些相同的镜像,目前最流行的用于托管Docker镜像的Docker注册处包括。
如果需要的话,你仍然可以选择在内部运行一个注册中心。对于协调这些Docker容器,目前最流行的一些基于云的供应商服务有:
如何使用多阶段构建?
使用多阶段构建的关键部分是命名要使用的一个或多个镜像,然后在后续调用中调用这些镜像。
比如说。
FROM golang:1.16.2-alpine3.13 AS builder
# ... commands are called here ...
FROM alpine:3.13 AS certificates
# ... more commands are called here ...
FROM scratch
# We refer to the previous stages, to copy the artifacts we created in previous stages.
COPY --from=certificates /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
COPY --from=builder /build/rest-server ./bin/rest-server
在这种情况下,我们在三个步骤中使用两个镜像。
builder:它用于构建二进制文件。certificates:用于安装所需的证书,和- 最后一个,我们要从另外两个中复制我们需要的文件,最终创建镜像。
这样我们就可以为我们的用例生成最小的docker镜像了。
使用Docker Compose进行本地开发
在本地开发时,我们可以手动运行所需的服务,或者使用像docker-compose ,这真的取决于你的个人偏好,我喜欢手动运行docker容器,而不是依赖docker-compose,原因是,到目前为止,没有办法真正依赖一个服务,并等待该服务完全初始化,而不添加一个第三方程序来处理。
换句话说,有些容器需要更长的时间来初始化,如果有一个服务依赖于它们,那么它就会先启动,而它会失败,因为它所依赖的那些服务还没有准备好。
在使用docker-compose 时,为了处理这一限制,我们可以在失败后重新运行这些容器,以我们的To-Do Microservicedocker-compose.yml文件为例,我们可以这样做。
- 执行
docker-compose up,这一步将启动所有需要的服务和它们相应的容器,我们预计api服务会失败,因为postgres服务需要更长的时间来启动。 - 如果我们只运行
docker-compose up api,那么api服务将成功启动,但我们将无法与之交互,因为数据库模式不是最新的,为此我们需要运行数据库迁移。 - 运行
docker-compose run api migrate -path /api/migrations/ -database postgres://user:password@postgres:5432/dbname?sslmode=disable up将完成将数据库迁移到新版本的步骤,这样我们终于可以正常工作了。
总结
使用容器并不是什么新鲜事,但Docker使每个人都能更容易地创建和使用这些容器,多年来,云服务提供商,如亚马逊和谷歌云,开始支持这些工件,并将它们集成到他们的服务中,他们甚至实现了自己版本的流行的容器协调工具,如亚马逊弹性容器服务(ECS)和谷歌Kubernetes引擎(GKE)。
使用Docker和容器并不是微服务的必要条件,但将其与协调工具一起使用,可以很好地利用基础设施资源,使上述微服务得以生存。