我有一个React/Node.js应用程序运行在一个服务器上,使用的是docker-组合。我试图实现我的反应应用程序的0停机时间部署。现在处理,做webpack构建(替换我的dist文件夹中的文件),然后停靠和对接。整个过程大约需要2-3分钟。我意识到,有了对接组合,我可以向上/向下扩展我的容器,但我不知道如何将我的代码推送到其中的一个,并重建webpack。我真的不想使用Kubernetes/群或Openshift,因为这有点过分。我想知道是否还有其他人取得了类似的成就。
我的船坞组合看起来是这样的:
node:
build:
context: ./env/docker/node
args:
- PROJECT_ROOT=/var/www/app
image: react_app:rapp_node
command: "npm run prod"
expose:
- "3333"
networks:
- react-net
volumes_from:
- volumes_source
tty: false
nginx:
env_file:
- ".env"
build:
context: ./env/docker/nginx
volumes_from:
- volumes_source
volumes:
- ./env/data/logs/nginx/:/var/log/nginx
- ./env/docker/nginx/sites/node.template:/etc/nginx/node.template
networks:
- react-net
- nginx-proxy
environment:
NGINX_HOST: ${NGINX_HOST}
VIRTUAL_HOST: ${NGINX_VIRTUAL_HOST}
LETSENCRYPT_HOST: ${NGINX_VIRTUAL_HOST}
ESC: $
links:
- node:node
command: /bin/sh -c "envsubst < /etc/nginx/node.template > /etc/nginx/sites-available/node.conf && nginx -g 'daemon off;'"
volumes_source:
image: tianon/true
volumes:
- ./app:/var/www/app我的nginx是这样的:
server {
server_name www.${NGINX_HOST};
return 301 ${ESC}scheme://${NGINX_HOST}${ESC}request_uri;
}
server {
listen 80;
server_name ${NGINX_HOST};
root /var/www/app;
location / {
proxy_pass http://node:3333;
proxy_http_version 1.1;
proxy_set_header Upgrade ${ESC}http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host ${ESC}host;
proxy_cache_bypass ${ESC}http_upgrade;
}
}发布于 2018-03-14 19:48:29
我认为更好的方法是使用任何编排器,它们都支持滚动更新,您可以使用任何标准的更新流程。
但是,如果您完全想要所写的内容(但这不是at all的真正方式),您可以在容器中运行一个脚本,它将签出应用程序的一个新版本,构建它并将符号链接从旧版本切换到新版本,您可以这样做:ln -s new current_tmp && mv -Tf current_tmp current。
因此,目录的结构将如下所示:/var/www/app - symlink to your current version /var/www/app_v1 - directory with current version, which symlinked to "/var/www/app" /var/www/app_v2 - directory with new version
现在,您可以运行命令ln -s /var/www/app_v2 /var/www/app_v2_sym && mv -Tf /var/www/app_v2_sym /var/www/app来切换Nginx使用的当前版本的应用程序。
发布于 2018-03-15 04:24:52
为此,我强烈推荐一个简单的单节点群。对于在更新过程中需要零停机时间但不能或不需要多节点高可用性的情况,这是一个完美的解决方案。它实际上不会增加开销或更多的管理负担,并且使用相同的复合文件。
是的,您应该构建一个新版本的映像,在您计划发送到此服务器的每一个提交中都包含您的代码。这些工具期待这种类型的工作流,所以如果您采用该工作流,您将有一个更轻松的时间。Docker支持在每次提交到GitHub和BitBucket的分支(如果是开放源代码的话是免费的,对于单个私有回购仍然是免费的)时为您这样做。假设每次在码头集线器上构建新的映像,它将如何在单节点群中工作:
docker swarm init和您现在有一个单节点群。就这样。(如果我只能有一台服务器在我总是使用单节点群,而不是停靠组合,因为有很好的理由。上部署对接设备的话)。docker stack deploy -c compose-file.yml stackname的堆栈文件。order: start-first添加到https://docs.docker.com/compose/compose-file/#update_配置中。myuser/myrepo:1.0,然后再次运行相同的堆栈部署命令,Swarm将检测差异并使用新的映像更新序列化(通过替换容器)。要测试这一点,请使用httping验证它在更新过程中仍然是远程可用的。
https://serverfault.com/questions/901446
复制相似问题