3대의 CentOS 서버를 이용해 도커 스웜 클러스터 구축하고 도커 컴포즈로 Wordpress예제를 배포하는 예제를 진행해보자.
해당 글은 아래 내용에 대해서 간단하게 학습할 수 있다.
- 도커 및 도커 컴포즈 설치하기
- 도커 스웜 클러스터 구축하기
- 도커 스웜에 portainer 설치하고 실행하기
- 도커 컴포즈로 스웜 클러스터에 배포하기
환경 구성
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가 잘 실행되는 것을 확인할 수 있다.
참고
- 도커 설치 : https://docs.docker.com/engine/install/centos/
- 도커 컴포즈 설치 : https://docs.docker.com/compose/install/
- 도커 스웜 스택 : https://docs.docker.com/engine/swarm/stack-deploy/
- 도커 스웜 튜토리얼 : https://docs.docker.com/engine/swarm/swarm-tutorial/
- 포테이너 설치 : https://docs.portainer.io/v/ce-2.9/start/install/server/swarm/linux
- 워드프레스 샘플(도커 컴포즈) : https://docs.docker.com/samples/wordpress/