Docker

零停機時間部署 Node.js Docker

  • March 15, 2018

我有一個使用 docker-compose 在單個伺服器上執行的 React/Node.js 應用程序。我正在嘗試為我的反應應用程序實現 0 停機時間部署。現在的過程是進行 webpack 建構(替換我的 dist 文件夾中的文件),然後 docker down 和 docker up。整個過程大約需要 2-3 分鐘。我意識到使用 docker-compose 我可以向上/向下擴展我的容器,但我不確定如何只將我的程式碼推送到其中 1 個並重建 webpack。我真的不想使用 Kubernetes/Swarm 或 Openshift,因為它有點矯枉過正。我想知道是否還有其他人取得了類似的成就。

我的 docker-compose 看起來像這樣:

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;
}
}

我認為更好的方法是使用任何編排器,它們都支持滾動更新,您可以使用任何標準更新流程。

但是,如果你想要你寫的東西(但這根本不是真正的方式),你可以,例如在容器中執行一個腳本,它將檢查你的應用程序的新版本,建構它並從舊版本切換符號連結版本為新的,您可以像這樣進行原子操作: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 使用的應用程序的目前版本。

引用自:https://serverfault.com/questions/901446