【问题标题】:Docker deployment - one machine - no downtimeDocker 部署 - 一台机器 - 无需停机
【发布时间】:2018-11-03 13:25:31
【问题描述】:

我只有一个要通过 Docker 运行的小型 Web 项目,只有一台不能使用虚拟化的机器,而且我也不需要它。我想知道如何在不停机的情况下使用 Docker 将我的应用程序部署到 VPS。

目前,我只是使用存储库并使用 docker-compose 创建 docker 容器(包括通过特定 .yaml 文件进行的一些生产配置)。

我想最好的办法是使用 Swarm,但我认为这是不可能的,因为我只能使用一台机器。

【问题讨论】:

  • 你仍然可以使用 swarm,一个只有一个(管理器)节点的 swarm。

标签: docker docker-compose docker-swarm


【解决方案1】:

单机部署是 Swarm 的一个很好的用例。如果您的服务可以实现零停机服务更新(假设您运行 2 个服务容器),您可以进行“滚动更新”。

显然,您不会有硬件或操作系统级别的容错,但 Swarm 是比 docker-compose cli 更好的生产解决方案。

在我的 GitHub AMA 中查看我在这种情况下使用 Swarm 的所有原因:Only one host for production environment. What to use: docker-compose or single node swarm?

example of rolling updates 上观看我的 YouTube 视频。

【讨论】:

  • 对于像我这样的 Docker 初学者来说,与 docker-compose 相比,我缺少的是 docker swarm 上的工具。例如,在服务实例中exec 的命令并不像docker exec -it container_name bash 那样容易 AFAIK。我不知道 swarm 上的等效命令是什么。到目前为止我所看到的是非常不友好的黑客来完成它stackoverflow.com/questions/39362363/…
  • 如果您需要直接执行到容器中,可以使用 Docker Enterprise 或 Portainer 之类的 GUI,或者在执行之前 ssh/remote 到容器所在的特定服务器。 Swarm 没有“执行功能”,它将通过管理器将您的执行连接传递到服务任务所在的节点,因此您必须使用上述其他方法。
  • 感谢补充信息。我将研究一下 Portainer 以及如何使用它。使用起来似乎很舒服。
【解决方案2】:

这是我们在生产中使用的一种简单方法,只有 nginxdocker-composehttps://engineering.tines.com/blog/simple-zero-downtime-deploys

基本上就是这个 bash 脚本:

reload_nginx() {  
  docker exec nginx /usr/sbin/nginx -s reload  
}

zero_downtime_deploy() {  
  service_name=tines-app  
  old_container_id=$(docker ps -f name=$service_name -q | tail -n1)

  # bring a new container online, running new code  
  # (nginx continues routing to the old container only)  
  docker-compose up -d --no-deps --scale $service_name=2 --no-recreate $service_name

  # wait for new container to be available  
  new_container_id=$(docker ps -f name=$service_name -q | head -n1)
  new_container_ip=$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $new_container_id)
  curl --silent --include --retry-connrefused --retry 30 --retry-delay 1 --fail http://$new_container_ip:3000/ || exit 1

  # start routing requests to the new container (as well as the old)  
  reload_nginx

  # take the old container offline  
  docker stop $old_container_id
  docker rm $old_container_id

  docker-compose up -d --no-deps --scale $service_name=1 --no-recreate $service_name

  # stop routing requests to the old container  
  reload_nginx  
}

【讨论】:

  • 如果您的服务在多个网络上,new_container_ip 将是一个串联的 IP 列表(下一步将失败)。将{{range ... end}} 参数替换为{{(index .NetworkSettings.Networks "my-network-name").IPAddress}},而不是只选择一个。
猜你喜欢
  • 2017-01-05
  • 2015-08-19
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多