Docker部署-一台机器-无停机时间

时间:2018-11-03 13:25:31

标签: docker docker-compose docker-swarm

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

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

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

2 个答案:

答案 0 :(得分:1)

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

显然,您没有硬件或操作系统级别的容错功能,但是与docker-compose cli相比,Swarm是一种更好的生产解决方案。

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

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

答案 1 :(得分:1)

这是我们在生产中使用的一种简单方法,只有 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  
}