docker-compose를 사용하여 단일 서버에서 실행되는 React/Node.js 애플리케이션이 있습니다. 내 반응 앱에 대해 가동 중지 시간이 0인 배포를 달성하려고 합니다. 현재 프로세스는 webpack 빌드(내 dist 폴더의 파일 대체)를 수행한 다음 docker down 및 docker up을 수행합니다. 이 전체 과정은 약 2~3분 정도 소요됩니다. 나는 docker-compose를 사용하여 컨테이너를 확장/축소할 수 있다는 것을 깨달았지만 코드를 그중 하나에만 푸시하고 웹팩을 다시 빌드하는 방법을 잘 모르겠습니다. 나는 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;
}
}
답변1
더 좋은 방법은 이를 위해 오케스트레이터를 사용하는 것이라고 생각합니다. 모두 롤링 업데이트를 지원하며 표준 업데이트 흐름을 사용할 수 있습니다.
그러나 당신이 쓴 내용을 정확히 원한다면 (하지만 그것은 올바른 방법이 아니다조금도), 예를 들어 컨테이너에서 스크립트를 실행하면 애플리케이션의 새 버전을 체크아웃하고 이를 빌드한 후 이전 버전에서 새 버전으로 심볼릭 링크를 전환할 수 있습니다. 이 작업은 다음과 같이 원자적으로 수행할 수 있습니다 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가 사용하는 현재 버전의 애플리케이션을 전환하는 명령을 실행할 수 있습니다.
답변2
이를 위해 간단한 단일 노드 떼를 적극 권장합니다. 업데이트 중에 다운타임이 없어야 하지만 다중 노드 고가용성이 필요하지 않거나 필요하지 않은 경우에 완벽한 솔루션입니다. 실제로 오버헤드나 더 많은 관리 부담을 추가하지 않으며 동일한 작성 파일을 사용합니다.
네, 실제로 이 서버에 제공하려는 모든 커밋에서 코드를 사용하여 이미지의 새 버전을 구축해야 합니다. 도구는 이러한 유형의 워크플로를 기대하므로 해당 워크플로를 채택하면 더 쉽게 작업할 수 있습니다. Docker Hub는 GitHub 및 BitBucket의 분기(오픈 소스인 경우 무료, 단일 개인 저장소의 경우 무료)에 대한 모든 커밋에서 이 작업을 지원합니다. Docker Hub에서 매번 새 이미지를 빌드한다고 가정하면 단일 노드 떼에서 작동하는 방법은 다음과 같습니다.
- 최근 안정적인 도커 버전(이 게시물 현재 17.12)을 사용한다고 가정합니다.
docker swarm init
이제 단일 노드 떼가 생겼습니다. 그게 다야. (도커를 배포할 서버가 하나만 있을 수 있는 경우나는 항상 좋은 이유 목록 때문에 docker-compose가 아닌 단일 노드 스웜을 사용합니다..- 몇 가지 사항을 변경하면 Compose 파일을 스택 파일로 사용할 수 있습니다.
docker stack deploy -c compose-file.yml stackname
- 다운타임 없는 배포를 보장하려면 다음을 수행해야 합니다.상태 확인 추가노드/nginx 컨테이너에 연결하여 앱이 실제로 "연결 준비"가 된 시기를 알 수 있습니다. Swarm은 서비스 업데이트 중에도 이를 사용하므로 이것이 핵심입니다.
- Swarm이 먼저 새 컨테이너를 추가하도록 하려면 기존 컨테이너를 제거하기
order: start-first
전에https://docs.docker.com/compose/compose-file/#update_config. - 그런 다음 구성 파일에서 이미지 태그를 변경하고 동일한 스택 배포 명령을 다시 실행하면 Swarm이 차이점을 감지하고 (컨테이너를 교체하여) 서비스를 새 이미지로 업데이트합니다
myuser/myrepo:1.0
.myuser/myrepo:2.0
이를 테스트하려면 httping을 사용하여 업데이트 프로세스 중에 원격으로 계속 사용할 수 있는지 확인하세요.