본문 바로가기
카테고리 없음

Docker Swarm 을 활용한 컨테이너의 고가용성 확보방법

by nothing-error 2023. 5. 15.

Docker Swarm 을 활용한 컨테이너의 고가용성 확보방법

 

1. 환경 구성

- gcp vm인스턴스를 이용하여 총 3개의 서버 생성

- 서버1 : manager node(서버1과 서버2 관리하는 서버)

- 서버2: worker node(서버1의 특정 컨테이너가 죽을 경우 서버1 혹은 서버2에서 컨테이너 실행됨. 만약 서버1 자체가 죽을 경우 서버2가 manager node 로 설정 가능)

- 서버3: database 서버(mysql)

 

 

2. 설치 방법

1) 도커설치

2023.05.15 - [분류 전체보기] - ubuntu에 docker 설치하기

 

 

3. 코드 작성

1) Tree 구조

.
├── Dockerfile
├── app
│   ├── main.py
│   ├── main2.py
│   └── main3.py
└── requirements.txt

 

 

2) 테스트 코드 작성

- 테스트 코드는 fastapi를 이용해서 서버3의 데이터베이스에서 데이터를 읽고 화면에 표시하는 간단한 api 작성

DATABASE_URL = "mysql+pymysql://newuser:newpassword@123.123.123.123:1234/test_db"
from fastapi import FastAPI
from sqlalchemy import create_engine, MetaData, Table, select
from databases import Database


database = Database(DATABASE_URL)
metadata = MetaData()

engine = create_engine(DATABASE_URL)
metadata.create_all(engine)

employee = Table("a", metadata, autoload_with=engine)

app = FastAPI()

@app.on_event("startup")
async def startup():
    await database.connect()

@app.on_event("shutdown")
async def shutdown():
    await database.disconnect()

@app.get("/a")
async def read_employees():
    query = select([employee])
    return await database.fetch_all(query)

 

3) dockerfile 작성

FROM python:3.8-slim

WORKDIR /app

RUN apt-get update && apt-get install -y python3-pip

COPY requirements.txt ./requirements.txt

RUN pip install -r requirements.txt

COPY ./app .

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]

FROM : 프로그램을 돌릴 환경 구성

WORKDIR : /app 의 의미는 컨테이너의 /app 경로에서 아래 명령어들을 실행하게 됨

COPY :  가운데 화이트스페이스를 기준으로 왼쪽이 로컬이고 오른쪽이 컨테이로 복사된다. 즉 workdir 에서 /app 으로 설정했기 때문에 app/requrements.txt 로 복사된다.

RUN : 도커 이미지를 만들 때 실행됨. 여기서는 requirements.txt 파일을 설치함

COPY : ./app 경로의 파일을 /app 에 모두 복사함

CMD :  컨테이너가 실행될 때 작동하는 명령어.

 

 

4) requirements.txt 작성

코드 실행에 필요한 라이브러리 다운로드 할 수 이도록 미리 설정해 놓아야함.

fastapi
uvicorn
sqlalchemy
databases[mysql]
pymysql

 

4. DB 서버 설정

1) 설치

2023.01.31 - [Database/mysql] - 빠른 MySQL 기본 설치방법 및 세팅

 

빠른 MySQL 기본 설치방법 및 세팅

1. apt-get 업데이트 및 서버 설치 및 세팅 $ sudo apt-get update $ sudo apt-get install -y mysql-server $ sudo systemctl start mysql $ sudo systemctl status mysql $ sudo systemctl enable mysql $ mysql --version 2. IP 대역 변경 $ sudo vi /etc/

nothing-error.pysyntax.com

 

2) 새 사용자 추가

CREATE USER 'newuser'@'%' IDENTIFIED BY 'newpassword';

GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'%';

FLUSH PRIVILEGES;

3) 테스트 테이블 생성 및 샘플데이터 추가

CREATE TABLE test_table (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL
);
INSERT INTO test_table (name) VALUES ('Test 1'), ('Test 2');

 

5. Docker 이미지 build

 

sudo docker build -t pysyntax949/a:1.0 .
sudo docker build -t pysyntax949/b:1.0 .
sudo docker build -t pysyntax949/c:1.0 .

6. Docker Swarm 설정

- 서버1 $ docker swarm init --advertise-addr [Manager1_IP]
- 서버2 $ docker swarm init 했을 때 나온 docker swarm join ~~ 명령어

--advertise-addr 옵션을 추가하여 서버1이 죽을 경우에 서버2가 manager node 로 설정됨

 

 

7. 서비스 생성

docker service create --name a --replicas 1 -p 8001:80 pysyntax949/a:1.0

docker service create --name b --replicas 1 -p 8002:80 pysyntax949/b:1.0

docker service create --name c --replicas 1 -p 8003:80 pysyntax949/c:1.0

 

Docker & Docker Swarm 관련 명령어 

 

1. docker node 관련

- 도커 노드 내리는 방법 

docker swarm leave --force

- 노드 조회 

docker node ls

 

 

 

2. docker service 관련

 

- docker service create: 새로운 서비스를 생성합니다. 이 명령은 이미지 이름, 실행할 명령, 서비스 이름 등의 매개변수를 받습니다.

docker service create --name [service_name] --replicas [number_of_replicas] [image_name]

 

- docker service ls: 실행 중인 모든 서비스의 목록을 출력합니다.

docker service ls

 

- docker service ps: 특정 서비스에 대한 작업 목록을 출력합니다. 이 명령은 서비스 이름을 매개변수로 받습니다.

docker service ps [service_name]

 

- docker service scale: 서비스의 복제본 수를 조정합니다. 이 명령은 서비스 이름과 새 복제본 수를 매개변수로 받습니다.

docker service scale [service_name]=[number_of_replicas]

 

- docker service update: 서비스를 업데이트합니다. 이 명령은 서비스 이름과 업데이트할 설정을 매개변수로 받습니다.

docker service update --image [new_image_name] [service_name]

 

- docker service rm: 서비스를 제거합니다. 이 명령은 제거할 서비스의 이름을 매개변수로 받습니다.

docker service rm [service_name]

 


Dockerfile 작성법

지시어 설명 사용예시
FROM 베이스 이미지를 지정합니다. FROM ubuntu:latest
MAINTAINER (Deprecated) 이미지를 유지 관리하는 사람의 정보를 지정합니다. MAINTAINER John Smith <john@example.com>
LABEL 이미지에 메타데이터 레이블을 추가합니다. LABEL maintainer="John Smith <john@example.com>"
RUN 쉘 명령어나 스크립트를 실행합니다. RUN apt-get update && apt-get install -y curl
CMD 컨테이너가 시작될 때 실행할 명령을 지정합니다. CMD ["python", "app.py"]
EXPOSE 컨테이너가 외부에 노출할 포트 번호를 지정합니다. EXPOSE 8080
ENV 환경 변수를 설정합니다. ENV MY_VAR=myvalue
ADD 파일이나 디렉토리를 이미지에 추가합니다. ADD app.jar /opt/app/
COPY 로컬 파일이나 디렉토리를 이미지에 복사합니다. COPY app.py /app/
ENTRYPOINT 컨테이너가 시작될 때 실행할 프로세스를 지정합니다. ENTRYPOINT ["java", "-jar", "app.jar"]
VOLUME 호스트와 컨테이너 사이에 데이터를 공유할 볼륨을 마운트합니다. VOLUME /data
USER 이미지에서 실행할 사용자를 지정합니다. USER appuser
WORKDIR 작업 디렉토리를 설정합니다. WORKDIR /app
ARG Docker 빌드 중에 사용할 빌드 타임 변수를 정의합니다. ARG VERSION=latest
ONBUILD 다른 이미지를 기반으로 새로운 이미지를 빌드할 때 실행할 지시어를 지정합니다. ONBUILD COPY . /app
STOPSIGNAL 컨테이너를 중지시키기 위해 사용할 시그널을 설정합니다. STOPSIGNAL SIGTERM
HEALTHCHECK 컨테이너의 상태를 확인하는 방법을 정의합니다. `HEALTHCHECK --interval=5m CMD curl -f http://localhost/

댓글