Docker Scale Out

1. 도커 설치

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin
systemctl enable --now docker
cat << EOF > app.py
import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)

@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)
EOF
cat << EOF > requirements.txt
flask
redis
EOF
cat << EOF > Dockerfile
# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
EOF
cat << EOF > docker-compose.yml
version: "3.3"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"
EOF
docker compose up

- 백그라운드 실행

docker compose up -d

- 다음 실습을 위해 down

docker compose down

 

2. 도커 스케일 아웃

curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose up
docker-compose scale redis=3
docker-compose ps


# docker compose -d --scale redis=3

- 중지

docker-compose stop

- 시작

docker-compose start

- 잠깐 중지, 재실행

docker-compose pause
docker-compose unpause

 

3. DB 올리기> - yml 파일 등록

cat << EOF > docker-compose.yml
version: "3.9"

services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - wordpress_data:/var/www/html
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
volumes:
  db_data: {}
  wordpress_data: {}
EOF

 


Docker Swarm

  • 도커 + 클러스터링

1. 5개의 클라이언트에 도커 설치

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin
systemctl enable --now docker
  • 3번은 매니저 노드
  • 4,5,6,7 워크노드

 

2. 도커 swarm 초기화

docker swarm init --advertise-addr 192.168.108.3

3. 방화벽 오픈

firewall-cmd --permanent --add-port=2377/tcp
firewall-cmd --permanent --add-port=7946/tcp
firewall-cmd --permanent --add-port=7946/udp
firewall-cmd --permanent --add-port=4789/udp
firewall-cmd --reload

4. 각 4,5,6,7 클라이언트에 토큰 입력 (토큰 명령어는 swarm 초기화 시 나온다)

docker swarm join --token SWMTKN-1-4a13944wyg2ruzu8bagztfizba4pvcxsqieb33fjng516pgrsg-4xg4wsr5hd9c67o74o6q47xls 192.168.108.3:2377

- 토큰 입력 전

- 토큰 입력 후

 

5. 이미지 다운 : 3번에서 진행 

docker service create --name lb_test --replicas 4 -p 80:80 \
worldvit/swarmlbc:latest

- Manager Node

docker service ls
docker service ps lb_test
docker service scale lb_test=8  # 스케일 업

- 각 4,5,6,7 클라이언트에서 접근

firewall-cmd --list-service
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https


curl http://192.168.108.3:80

- 삭제

docker service rm lb_test

 

<Rolling Update>

  • 컨테이너가 실행되어있는 상태에서 버전업데이트, 이름, 이미지 변경이 중단없이 가능하다
docker service create --replicas 2 --name web --update-delay 10s nginx:1.14
docker service ps web
docker service update --image nginx:1.15 web

 

728x90

'클라우드 > Docker' 카테고리의 다른 글

No.79 - Docker3 : 도커개념  (0) 2022.09.15
No.78 - Docker2 : 도커개념  (0) 2022.09.14
No.77 - Docker1 : 개요 및 설치  (0) 2022.09.13

+ Recent posts