Swarm + Portainer + Docker compose 예제 실행

반응형

3대의 CentOS 서버를 이용해 도커 스웜 클러스터 구축하고 도커 컴포즈로 Wordpress예제를 배포하는 예제를 진행해보자.

 

해당 글은 아래 내용에 대해서 간단하게 학습할 수 있다.

  • 도커 및 도커 컴포즈 설치하기
  • 도커 스웜 클러스터 구축하기
  • 도커 스웜에 portainer 설치하고 실행하기
  • 도커 컴포즈로 스웜 클러스터에 배포하기

출처: https://hub.docker.com/_/swarm


환경 구성

CentOS 7의 서버 3대로 진행하겠다.

서버 구성은 다음과 같다.

  • manager1
  • worker1
  • worker2

 

 

 

도커 및 도커 컴포즈설치

3대의 서버 모두에 도커와 도커 컴포즈를 설치해준다.

Docker CE 설치

저장소 설정

# 도커 설치에 필요한 패키지 설치
$ sudo yum install -y yum-utils

# stable 저장소 설정
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

 

Docker CE 설치

# 도커 설치
$ sudo yum install docker-ce

# 도커 실행
$ sudo systemctl start docker 

# 도커 설치 확인
$ docker -v
Docker version 20.10.9, build c2ea9bc

 

 

 

도커 컴포즈 설치

Docker compose github 저장소 에서 Docker Compose binary를 다운로드한다.

# Docker Compose stable 버전을 다운로드
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 바이너리 실행 권한 적용
$ sudo chmod +x /usr/local/bin/docker-compose

# 도커 컴포즈 설치 확인
$ docker-compose -v
docker-compose version 1.29.2, build 5becea4c

 

 

 

 

 

도커 스웜 모드 클러스터 구축

스웜 생성

manager1 서버에서 아래 명령어를 실행해 스웜 클러스터를 시작하자.

$ docker swarm init

 

만약 다른 서버(worker1, worker2)에서 실행하려면 -advertise-addr 옵션으로 manager1 서버의 IP를 값으로 넣고 실행하면 된다.

$ docker swarm init --advertise-addr <매니저_서버_IP>

 

 

docker swarm init 명령어를 실행하면 아래와 같은 결과가 출력된다.

$ docker swarm init
Swarm initialized: current node (nc6nctkgdta8dq56066nctq84) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-2mano6rh1kvio3c9xigrdg9je1us5lzwyhdwdpmph1vu4j0y22-6rh1kav6rh1krchp1xezl6rhj \
    10.192.113.100:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

출력 결과 중에 docker swarm join 명령어는 새로운 워커 노드를 추가하는 명령어이다.

해당 명령어를 복사해서 워커 서버에서 실행하면 해당 스웜 클러스터에 노드를 추가할 수 있다.

 

 

 

 

스웜 클러스터에 노드 추가

worker1 서버에 docker swarm init 명령어를 실행해서 나온 출력 결과 중 아래 명령어를 복사해 실행한다.

$ docker swarm join \
--token SWMTKN-1-2mano6rh1kvio3c9xigrdg9je1us5lzwyhdwdpmph1vu4j0y22-6rh1kav6rh1krchp1xezl6rhj \
10.192.113.100:2377

 

 

만약 토큰을 까먹었으면 아래 명령어를 매니저 노드(manager1)에서 실행해서 다시 확인할 수 있다.

$ docker swarm join-token worker

 

worker2에도 동일한 명령어를 실행해주자.

$ docker swarm join \
--token SWMTKN-1-2mano6rh1kvio3c9xigrdg9je1us5lzwyhdwdpmph1vu4j0y22-6rh1kav6rh1krchp1xezl6rhj \
10.192.113.100:2377

 

manager1 서버에서 아래 명령어를 실행해 정상적으로 스웜 클러스터가 구축되었는지 확인할 수 있다.

$ docker node ls
ID                            HOSTNAME    STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
mggi1bppywc7czml8j7x78nd4 *   manager1    Ready     Active         Leader           20.10.9
cm73640uqdyveaqrw0ea07fx1     worker1     Ready     Active                          20.10.9
tdy9fhwhkpw5bdfxgp7lzh7jy     worker2     Ready     Active                          20.10.9

 

 

 

Portainer

Portainer는 Docker Container를 효율적으로 관리할 수 있는 GUI 툴이다.

설치

stack YML를 다운로드한다.

curl -L https://downloads.portainer.io/portainer-agent-stack.yml \
    -o portainer-agent-stack.yml

 

portainer-agent-stack.yml은 아래와 같이 구성되어 있다.

version: '3.2'

services:
  agent:
    image: portainer/agent:2.9.1
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/lib/docker/volumes:/var/lib/docker/volumes
    networks:
      - agent_network
    deploy:
      mode: global
      placement:
        constraints: [node.platform.os == linux]

  portainer:
    image: portainer/portainer-ce:2.9.1
    command: -H tcp://tasks.agent:9001 --tlsskipverify
    ports:
      - "9443:9443"
      - "9000:9000"
      - "8000:8000"
    volumes:
      - portainer_data:/data
    networks:
      - agent_network
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints: [node.role == manager]

networks:
  agent_network:
    driver: overlay
    attachable: true

volumes:
  portainer_data:

 

 

다운로드한 파일을 스택에 배포한다.

$ docker stack deploy -c portainer-agent-stack.yml portainer

 

제대로 배포되었는지 확인하자.

$ docker service ls
ID             NAME                  MODE         REPLICAS   IMAGE                          PORTS
gfv6eufu5or6   portainer_agent       global       3/3        portainer/agent:2.9.1
rkaa2ryon7lh   portainer_portainer   replicated   1/1        portainer/portainer-ce:2.9.1   *:8000->8000/tcp, *:9000->9000/tcp, *:9443->9443/tcp

 

 

접속

도커 스웜은 ingress로 구성되었으므로 어느 노드로 접속해도 된다.

https://IP:9000

 

사용자를 생성하자.

 

사용자도 생성했으니 접속해보자.

 

 

 

도커 컴포즈로 스웜 클러스터에 배포하기

도커 컴포즈 파일을 이용해서 스웜 클러스터에 서비스를 배포할 수 있다.

docker stack deploy 명령어를 이용하면 된다.

$ docker stack deploy -c ${YAML_파일_위치} ${생성할_스택_이름}

 

위에서 Portainer 배포할 때도 해당 명령어를 통해서 배포했었다. 

스택은 YAML 파일에서 생성된 컨테이너의 묶음이다. 해당 명령어를 이용하면 파일에 정의된 서비스가 스웜 클러스터에 배포된다.

 

 

WordPress yaml 파일 생성

아래와 같은 docker-compose.yml 파일 생성하기

version: "3.9"

services:
  db:
    image: mdock.daumkakao.io/mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    deploy:
      replicas: 1 
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  wordpress:
    depends_on:
      - db
    image: mdock.daumkakao.io/wordpress:latest
    volumes:
      - wordpress_data:/var/www/html
    deploy:
      replicas: 1
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
volumes:
  db_data: {}
  wordpress_data: {}

 

 

 

스웜에 스택 배포하기

$ docker stack deploy -c docker-compose.yml wordpress
Creating network wordpress_default
Creating service wordpress_db
Creating service wordpress_wordpress

 

 

서비스가 잘 배포되었는지 확인해보자.

아래 URL를 입력해보자.

https://IP:8080

 

 

WordPress가 잘 실행되는 것을 확인할 수 있다.

 


참고