最简单的 Docker 生产网站部署工具

Simplest Docker deployment tools for production website

我对 Docker Hub、Cloud、Swarm、Swarm 模式、docker 部署、docker-compose 部署、...

感到非常困惑

生产网站最简单的 docker 部署实践是什么,可以很好地适应单个物理服务器的能力?

该网站有一个全面的 docker-compose.yml,它启动了大约 12 项服务,涵盖各种网络服务器、webpack 构建器和数据库。环境变量用于控制开发或生产。

命令行工具用于将 Webpack 包上传到 S3 存储桶,并将源映射上传到 Sentry。 bundle hash 用作发布 ID,存储在环境变量中(即 HTML 写成 <script src="https://s3.site.com/c578f7cbbf76c117ca56/bundle.js">,其中 hash c57... 写到指向的环境变量文件中docker-compose.yml 中的每个服务)。

我不需要一台以上的服务器,也不需要全面的故障转移策略。我只是想在部署代码更新时避免停机。我是单身开发者,所以我不需要 CI 或 CD。

我了解 docker-machine 已弃用。 Docker Hub 单独处理图像,所以我知道我需要处理 "stack" 或一组相关服务概念的东西。我知道 Docker Cloud 的 stack.yml 文件不支持 buildenv_file 键,所以我的 docker-compose.yml 不能直接使用

(在我的 docker-compose.yml 中,我多次出现以下模式:

build:
  context: .
  dockerfile: platforms/frontend/server/Dockerfile

和Docker文件中,例如:

COPY platforms/frontend/server /app/platforms/frontend/server

没有构建上下文和Docker文件位置的分离,撰写文件似乎无法转换为堆栈文件)。

此外,我认为Docker Cloud / Swarm 用于管理多个故障转移服务器和循环路由等?我认为我不需要这些。

终于我开始意识到 docker-compose deploy 存在...这就是我想要的 tool/strategy 吗?

让我先纠正一些问题,然后我将进入预期的 Docker 策略,在这种情况下你说你 "don't need CI/CD",我认为这意味着你将手动部署更新自己到服务器。此工作流不是我建议的团队使用方式,但对于 "solo dev" 来说非常简单。

"I understand docker-machine is deprecated."

不正确。它获得 constant updates,包括上个月的一个版本。它不是为 deploying/managing 很多服务器设计的,但如果您真的只需要一个服务器供一个管理员使用,它可以完美地用于远程创建实例、安装 docker,以及为远程设置 TLS 证书通过 docker CLI 访问:docker-machine env <nodename>

Finally I started to realise docker-compose deploy exists

这不是命令。也许您正在考虑 Swarm 中的 docker stack deploy?我也不推荐 docker-compose 用于服务器。它没有生产工具和功能。看我的 AMA post on all the reasons to use a single node Swarm.

请注意,docker-compose dev 和 CI/CD 的 CLI 工具与 docker-compose.yml 文件不同,我将在有点。

Furthermore, I think that Docker Cloud / Swarm are for managing multiple fail-over servers and round-robin routing and so on? I don't think I need any of this.

Docker Cloud is shutting down in May 2018,所以我不会用它来部署堆栈,但如果您不需要节点高可用性,Swarm 在单个节点中非常有用。

好的,对于从本地开发人员到此生产服务器的工作流程:

  1. 在本地手动构建镜像并推送到 Docker Hub(或其他注册中心)或我的首选,将代码存储在 GitHub/Bitbucket 中并让镜像由 Docker 每次提交到特定分支的集线器(假设 master)。

  2. 你的docker-compose文件也是一个堆栈文件。 compose documentation has specific sections 用于 "build"(用于 CI/CD 服务器或您的本地机器工作流程)和 "deploy"(Swarm 上的功能)。您应该在本地或通过 Docker 集线器或自定义 CI 服务器构建,而不是在 Swarm 本身中构建。生产工具通常不用于图像构建。

  3. 一旦你的服务器建立起来(使用docker-machine),你可以使用本地docker CLI来管理远程docker引擎docker-machine env <name>。您将使用 docker swarm init 创建一个单节点 Swarm,瞧,它会接受组合文件(又名堆栈文件)。这些文件与旧的 Docker 云堆栈相似但格式不同。

  4. 现在您可以docker stack deploy -c compose.yml <stackname>,它会使用您设置的环境变量、数据量等启动您的服务

  5. 对于更新,如果您使用 17.12 或更高版本 docker(最新的 18.03 甚至更好),您可以获得零停机时间,您设置 update-order: start-first,并确保所有服务定义了健康检查,因此 docker 真正知道它们何时准备好连接。

  6. 您可以使用覆盖 yaml 文件,并且 docker-compose config 将许多组合文件分层到单个堆栈部署中。

  7. 对于服务更新,您只需更新撰写文件并重新执行 docker stack deploy,它就会检测到更改。

  8. 确保每次都使用唯一的图像标签,以便 Docker 知道要部署哪个特定的 SHA。不要继续使用 <imagename>:latest 期望它确切地知道那是哪个图像。

我希望这对您有所帮助,并在评论中提出更多问题,我可以根据需要更新此答案。