swarm mode: 명령어를 사용하여 클러스터 환경에 컨테이너, 볼륨, 네트워크를 배포할 수 있다. 단, 위의 방법을 사용할 경우 서비스 환경을 조정해야하는 경우에는 명령을 다시 처음부터 작성해야 하는 등의 불편함이 있다.
docker-compose: 명령어 사용의 불편함을 해결하기 위하여 yml 형태로 환경을 구성하고 이를 도커가 명령으로 변환하여 서비스를 제공하는 기능
swarm mode + docker-compose => docker stack
docker swarm stack: 클러스터 환경에 여러 서비스를 묶어서 하나의 스택 공간을 생성하는 것. 도커 스택은 분산애플리케이션의 최상위 계층이다.
일반적으로 상호 연관성 및 의존성이 있는 서비스를 하나의 스택으로 그룹화하여 함께 오케스트레이션 할 수 있도록 구성한다.
rapa@manager:~$ mkdir 0825 ; cd 0825 rapa@manager:~/0825$ touch web.yml rapa@manager:~/0825$ docker network create --driver=overlay --attachable web vi web.yml
version: '3.7' services: nginx: image: nginx deploy: replicas: 3 placement: constraints: [node.role == worker] restart_policy: condition: on-failure max_attempts: 2 environment: SERVICE_PORTS: 80 networks: - web proxy: image: dockercloud/haproxy depends_on: - nginx volumes: - /var/run/docker.sock:/var/run/docker.sock ports: # -p option, attached to ingress network - "80:80" networks: # backend network -> nginx containers - web deploy: mode: global placement: constraints: [node.role==manager] networks: web: external: true
docker stack deploy -c web.yml web
: 스택 배포. 주의, haproxy이미지가 다운로드 안되므로 따로 pull 하고 실행한다.
docker stack ls
docker stack ps web
HAPROXY: manager에 배치
- 라벨 부착
worker1: zone=seoul
worker2: zone=seoul
worker3: zone=busan- 새로운 overlay network: myovlnet
- subnet: 10.10.123.0/24
- haproxy는 자신의 80번 포트를 호스트의 8001과 연결하고 해당 연결은 myovlnet 을 통해 zone=seoul 에 배포된, wordpress로 연결된다. 최종적으로 worker3에는 portainer가 연결. worker3은 서비스가 아닌 container run으로 배포. 즉, portainer가 ingress와 연결되는게 아닌 overlay로 클러스터에 연결되어야 한다.
- 라벨부착
docker node update -–label-add 라벨key=라벨value 호스트명
docker node update --label-add zone=seoul worker1
docker node update --label-add zone=seoul worker2
docker node update --label-add zone=busan worker3
- overlay network 생성 하며 attachable
docker network create --driver=overlay --subnet 10.10.123.0/24 --attachable myovlnet
- 새 폴더 생성 및 yml 파일 생성. 도커파일에 haproxy와 wordpress 서비스.
version: '3.7' services: wordpress: image: wordpress deploy: replicas: 3 placement: constraints: [node.labels.zone == seoul] restart_policy: condition: on-failure max_attempts: 2 environment: SERVICE_PORTS: 80 networks: - myovlnet proxy: image: dockercloud/haproxy depends_on: - wordpress volumes: - /var/run/docker.sock:/var/run/docker.sock ports: # -p option, attached to ingress network - "8001:80" networks: # backend network -> wordpress containers - myovlnet deploy: mode: global placement: constraints: [node.role==manager] networks: myovlnet: external: true
docker stack deploy -c web.yml myovlnet
4. worker3에 portainer가 생성 및 myovlnet에 연결.
docker container run -d --restart always -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock --network myovlnet --name portainer portainer/portainer