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

도커개념

 

메모리에 맞춰 실행

 docker run -d -m 128m --name web nginx:1.14

cpu 개수 0.5개

docker run -d --cpus=".5" --name web1 nginx:1.14
docker run -it --rm --device-write-iops /dev/xvda:100 -m 500 --name c1 ubuntu:latest /bin/bash

- 변수를 이용해 전체 삭제

docker rm -f $(docker ps -a -q)

 

- MySQL 이미지 다운

docker run -d --name db -v /dbdata:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=pass mysql:latest

- Mysql 접속

docker exec -it db /bin/bash

- MariaDB 다운

docker run -d --name db -v /dbdata:/var/lib/mariadb \
-e MARIADB_ALLOW_EMPTY_PASSWORD=pass mariadb:latest

 

- web 다운 (80 => 80)

docker run -d --name web -v /homepage:/usr/local/apache2/htdocs -p 80:80 httpd:latest

echo "hellow world " >> index.html
curl http://localhost

 

 

<Docker Network 구성>

- 도커 네트워크 환경 확인

iptables -t nat -L -n -v
brctl show
  • 기존 이미지 삭제 : docker rmi [IMAGE_ID]

1. Mysql과 wordpress 다운

docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=wordpress -e MYSQL_DATABASE=wordpress mysql:5.7

docker run -d --name wordpress --link mysql:mysql -e WORDPRESS_DB_PASSWORD=wordpress 
-p 80:80 wordpress:4

2. run

docker start wordpress
docker start mysql

 

3. 방화벽

systemctl disable --now firewalld

 

4. Mysql과 wordpress의 ip

docker inspect mysql | grep -i ipaddress
docker inspect wordpress | grep -i ipaddress

 

5. 접속, 웹서버에서 접속 가능

docker exec -it wordpress /bin/bash

 


사용자 지정 네트워크

 

docker network create \
--driver bridge \
--subnet 10.0.0.0/24 \
--gateway 10.0.0.254 \
bridge-cus1

docker network inspect bridge-cus1

 

- ip 부여

docker run -d --name wordpress1 --network bridge-cus1 \wordpress:4

brctl show

docker inspect wordpress1 | grep -i ipaddress

- ip 지정 가능

docker run -d --name wordpress3 --network bridge-cus1 --ip 10.0.0.10 \wordpress:4

docker run -d --name wordpress4 --link mysql:mysql \
--network bridge-cus1 \
--ip 10.0.0.11 \
-e MYSQL_ROOT_PASSWORD=wordpress \
-e MYSQL_DATABASE=wordpress \
-p 8080:80 \
wordpress:4

728x90

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

No.80 - Docker4 : Docker Swarm  (0) 2022.09.16
No.78 - Docker2 : 도커개념  (0) 2022.09.14
No.77 - Docker1 : 개요 및 설치  (0) 2022.09.13

도커개념

  • Nginx : 웹서버

- 도커 설치

yum install -y yum-utils

yum-config-manager  --add-repo https://download.docker.com/linux/centos/docker-ce.repo

yum install docker-ce docker-ce-cli containerd.io

systemctl enable --now docker

- dit, it와 다르게 create로 생성하면 start가 되지 않는다

docker create --name webserver nginx:latest # 컨테이너를 생성하면서 백그라운드에 생성 생성 + dit느낌
docker ps -a # 실행됐는지 확인
docker search --filter=is-official=True nginx
  • create를 하면 start가 되지 않기 때문에 docker attach webserver를 하면 실행이 되지 않는다
  • docker start webserver를 해줘야한다

- 상태정보 확인

docker inspect webserver

- 섹션 파트만 꺼내서 상태확인

docker inspect --format "{{.NetworkSettings}}" webserver
docker inspect --format "{{.NetworkSettings.IPAddress}}" webserver

- ip를 별칭으로 저장하고 웹서버 실행

alias cip='docker inspect --format "{{.NetworkSettings.IPAddress}}" webserver'

curl http://172.17.0.2

- 로그확인

  • docker logs webserver

- 새로운 세션에서 실행

  • docker logs -f webserver

- GET, POST

  • uri를 따라가면 GET
  • 내부적으로 form태그로 전달하고 싶을 땐 POST

 

<백그라운드에서 실행되고 있는 컨테이너를 실행 연결 => exec>

[root@client ~]# docker start webserver
webserver
[root@client ~]# docker exec -it webserver /bin/bash
root@9b61429d4f9b:/#

- html은 해당 경로에 있다

cd /usr/share/nginx/html
  • 유지하고 빠져나오기 = ctrl + p + q
  • 컨테이너를 끄고 빠져나오기 = ctrl + d, exit

- 컨테이너 종료

docker stop webserver

- webserver 강제로 지우기

docker rm -f webserver

 

<Docker에 로그인해서 이미지 pull하고 본인만의 이미지 저장>

docker login
  175  docker search httpd
  176  docker pull httpd
  177  docker images

- 이미지 클론

docker tag httpd:latest rbfpffldk56/httpd:latest

 

<private 레지스트리를 만들어 가져오고 push>

docker run -d -p 5000:5000 --restart always --name registry registry:2

로컬에 없다는 문구가 나온다
5000번으로 들어오면 5000번으로 나간다

- 오피셜에 태그를 붙혀 Private 로컬에 저장

docker tag httpd:latest localhost:5000/httpd:latest

- Push

docker push localhost:5000/httpd:latest
  • 로컬에서 자주 사용할 때 유용하다

- 저장소 위치

/var/lib/docker/volumes/생성된디렉터리/_data/docker/registry/v2/repositories/httpd

- pull

docker pull localhost:5000/httpd:latest

- 실행

  • 8080으로 접근하면 80으로 매핑해준다

- 실행 상태 확인

728x90

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

No.80 - Docker4 : Docker Swarm  (0) 2022.09.16
No.79 - Docker3 : 도커개념  (0) 2022.09.15
No.77 - Docker1 : 개요 및 설치  (0) 2022.09.13

Docker 개요 및 설치

 

  • 도커끼리 통신할 수 있는 가상 랜카드가 존재한다.
  • 별도로 저장소 개념이 있다.
yum -y install lxc lxc-templates libcap-devel libcgroup busybox wget bridge-utils lxc-extra
yum -y install net-tools
yum -y install libvirt-daemon-driver-lxc.x86_64
cat << EOF > /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
NAME=ens33
DEVICE=ens33
ONBOOT=yes
NM_CONTROLLED=no
BRIDGE=virbr0
EOF
cat << EOF  > /etc/sysconfig/network-scripts/ifcfg-virbr0
BOOTPROTO=none
NAME=virbr0
DEVICE=virbr0
ONBOOT=yes
TYPE=Bridge
NM_CONTROLLED=no
IPADDR=192.168.108.3
PREFIX=24
GATEWAY=192.168.108.2
DNS1=192.168.108.2
EOF

 

- 설치 확인

lxc-checkconfig
systemctl status libvirtd
ls /usr/share/lxc/templates/

- 리눅스 기반 컨테이너 생성

lxc-create -n centos_lxc -t centos
lxc-start -n centos_lxc -d
lxc-console -n centos_lxc -t 0 # 컨테이너 접속

- 컨테이너 환경 확인 가능 (컨테이너 밖에서 실행)

cd /var/lib/lxc/centos_lxc/
cd config

- 컨테이너 목록 (컨테이너 밖에서 실행)

lxc-ls

- stop : 재접속해도 접속이 안된다

lxc-stop -n centos_lxc

- 재접속을 위해선 start를 해야한다

lxc-start -n centos_lxc

 


 

 sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

시간 동기화

yum -y install chrony
[root@client ~]# firewall-cmd --permanent --add-service=ntp
success
[root@client ~]# firewall-cmd --reload
success
[root@client ~]# systemctl enable --now chronyd

설치

sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo systemctl start docker
sudo systemctl enable docker
cat /etc/group
ps -aux | egrep docker
id centos
passwd centos
gpasswd -a centos docker
id centos
docker search centos

- 이미지 다운

docker pull worldvit/centos7:latest

 

[root@client ~]# docker run -it --name cnt worldvit/centos7:latest
[root@bf564e061d73 ansible]# exit

-  백그라운드

[root@client ~]# docker run -dit --name cnt1 worldvit/centos7:latest /bin/bash
43c99eded2e7e88a6dac2a810b0712b3b750e350cbe07fa6b5731e9c32d8a605
[root@client ~]#

접근

 docker attach cnt1

 

  • 유지하고 빠져나오기 = ctrl + p + q
  • 컨테이너를 끄고 빠져나오기 = ctrl + d, exit

 

<순서>

  1. 설치
  2. 사용자 도커그룹 넣기
  3. 필요한 이미지 다운로드
  4. 도커 실행 (바로 실행해서 쉘접속, dettach실행하고 attach로 연결)

- hub.com에 로그인해서 이미지 올리기

docker login
docker tag centos7 rbfpffldk56/centos7:latest
docker push rbfpffldk56/centos7:latest

- 이후 pull해서 사용하면된다.

docker pull rbfpffldk56/centos7:latest

 

 

728x90

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

No.80 - Docker4 : Docker Swarm  (0) 2022.09.16
No.79 - Docker3 : 도커개념  (0) 2022.09.15
No.78 - Docker2 : 도커개념  (0) 2022.09.14

+ Recent posts