零停機時間部署 Node.js Docker
我有一個使用 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 使用的應用程序的目前版本。