Docker Compose - services 서비스 배포
version: '2.23.1' services: web: image: nginx:latest # ports:- "8080:80" 과 동일 ports: - target: 80 published: 8080 protocol: tcp mode: HOST # 개발되는 서비스를 스케일링 하기 위한 옵션 deploy: mode: replicated replicas: 3 # 확장 시키고자 하는 노드의 개수 resources: # 지정하고자 하는 리소스 구성 수펙 limits: # cpu와 메모리 제한 cpus: "0.5" # cpu를 전체 비율로 할당 memory: 50M # memory를 50메가바이트로 설정 restart_policy: # 재시작 정책 condition: on-failure # 실행이 실패했을 시 재시작
출처 : [🐋Docker] 도커 컴포즈(Docker Compose)
Deployments
애플리케이션 모델의 배포를 지원하는 Compose 구현에는 Compose 애플리케이션 모델이 서비스당 실제 인프라 요구 사항 또는 수명 주기 제약 조건을 반영하기에는 너무 추상적이기 때문에 일부 추가 메타데이터가 필요할 수 있습니다(MAY).
Compose 사양 배포를 통해 사용자는 서비스에 대한 추가 메타데이터를 선언할 수 있으므로 Compose 구현은 관련 데이터를 가져와 플랫폼에 적절한 리소스를 할당하고 사용자의 요구에 맞게 구성할 수 있습니다.
- replicas: 서비스 인스턴스의 수를 지정합니다.
- placement: 서비스 인스턴스를 배치할 노드를 선택하는 규칙을 지정합니다.
- update_config: 서비스 업데이트를 제어하는 옵션을 지정합니다.
- resources: 서비스 인스턴스가 사용할 CPU 및 메모리 등의 자원을 지정합니다.
- networks: 서비스가 연결할 네트워크를 지정합니다.
version: '3.7' services: web: image: nginx:latest deploy: replicas: 3 placement: constraints: - node.role == manager update_config: parallelism: 2 delay: 10s resources: limits: cpus: '0.5' memory: 512M networks: - frontend - backend networks: frontend: backend:
위의 예시는 다음과 같다고 한다.
위의 예시에서는 "web" 서비스를 배포할 때, "deploy" 옵션을 사용하여 다양한 설정을 지정하고 있습니다.
예를 들어, "replicas" 옵션을 사용하여 3개의 서비스 인스턴스를 생성하고, "placement" 옵션을 사용하여 매니저 노드에서만 서비스 인스턴스를 배치하도록 지정하고 있습니다.
또한 "update_config" 옵션을 사용하여 서비스 업데이트를 제어하고, "resources" 옵션을 사용하여 서비스 인스턴스가 사용할 자원을 제한하고 있습니다. 마지막으로 "networks" 옵션을 사용하여 서비스가 연결할 네트워크를 지정하고 있습니다.
출처 : Docker) Docker Compose에 대해서 간단하게 알아보기
- 리소스 사용 확인
제한을 설정한 후 docker stats 명령을 사용하여 제한을 확인할 수 있다.$ docker stats CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 8ad2f2c17078 bael_stack_service.1.jz2ks49finy61kiq1r12da73k 0.00% 2.578MiB / 512MiB 0.50% 936B / 0B 0B / 0B 2
NGINX는 기본적으로 하나의 Worker Process당 1024개의 커넥션을 처리합니다. 예를 들어, Worker Process가 2면 2048개의 커넥션을 처리할 수 있고, 3이면 3072개, 4이면 4096개를 처리합니다. 즉, 커넥션이 부족한 상황이라면 worker connections 또는 worker Process를 늘려줘야 합니다.
- nginx.conf
NGINX의 기본 설정 파일입니다.[user@server /]# cat /etc/nginx/nginx.conf user nginx; worker_processes auto; <= cpu cores 에 따라 설정 error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; <= worker_Porcesses 하나가 한 번에 처리할 수 있는 연결 수 } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; }
출처 : NGINX Worker Connection, Worker Process 개념
출처 : NGINX 성능을 위해 최적화하기
출처 : [감정일기] 1. Docker-Compose로 Django, Nginx, Gunicorn 연결후 AWS에 배포하기
출처 : Python 성능 극대화, 2부: NGINX Load Balancing 및 모니터링
출처 : gunicorn - 실행하기