首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >零停机部署Node.js码头

零停机部署Node.js码头
EN

Server Fault用户
提问于 2018-03-13 15:37:52
回答 2查看 1.2K关注 0票数 0

我有一个React/Node.js应用程序运行在一个服务器上,使用的是docker-组合。我试图实现我的反应应用程序的0停机时间部署。现在处理,做webpack构建(替换我的dist文件夹中的文件),然后停靠和对接。整个过程大约需要2-3分钟。我意识到,有了对接组合,我可以向上/向下扩展我的容器,但我不知道如何将我的代码推送到其中的一个,并重建webpack。我真的不想使用Kubernetes/群或Openshift,因为这有点过分。我想知道是否还有其他人取得了类似的成就。

我的船坞组合看起来是这样的:

代码语言:javascript
复制
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是这样的:

代码语言:javascript
复制
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;
}
}
EN

回答 2

Server Fault用户

回答已采纳

发布于 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使用的当前版本的应用程序。

票数 0
EN

Server Fault用户

发布于 2018-03-15 04:24:52

为此,我强烈推荐一个简单的单节点群。对于在更新过程中需要零停机时间但不能或不需要多节点高可用性的情况,这是一个完美的解决方案。它实际上不会增加开销或更多的管理负担,并且使用相同的复合文件。

是的,您应该构建一个新版本的映像,在您计划发送到此服务器的每一个提交中都包含您的代码。这些工具期待这种类型的工作流,所以如果您采用该工作流,您将有一个更轻松的时间。Docker支持在每次提交到GitHub和BitBucket的分支(如果是开放源代码的话是免费的,对于单个私有回购仍然是免费的)时为您这样做。假设每次在码头集线器上构建新的映像,它将如何在单节点群中工作:

  1. 假设您使用最近稳定的对接版本(截至本文17.12)
  2. docker swarm init和您现在有一个单节点群。就这样。(如果我只能有一台服务器在我总是使用单节点群,而不是停靠组合,因为有很好的理由。上部署对接设备的话)。
  3. 只需进行一些更改,就可以将撰写文件用作docker stack deploy -c compose-file.yml stackname的堆栈文件。
  4. 为了确保零停机部署,您需要增加健康检查到您的节点/nginx容器,以便他们知道应用程序何时真正“为连接做好准备”。so在更新服务时也使用这个,所以它是关键。
  5. 如果您想要先添加一个新容器,在删除旧容器之前,将order: start-first添加到https://docs.docker.com/compose/compose-file/#update_配置中。
  6. 然后,只需将撰写文件中的图像标记更改为myuser/myrepo:1.0,然后再次运行相同的堆栈部署命令,Swarm将检测差异并使用新的映像更新序列化(通过替换容器)。

要测试这一点,请使用httping验证它在更新过程中仍然是远程可用的。

票数 2
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/901446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档