7.13

w0nyyy·2022년 7월 13일
0

도커 스웜 Cluster

centOS ova로 vm 생성

연결된 복제로 worker 생성

도커 컴포즈 : 컨테이너를 여러개 실행시킬 수 있는 기술

onbuild 복습

볼륨 생성


// 볼륨 생성
[root@localhost ~]# docker volume create my-vol01

// 볼륨 경로 확인 가능-> 도커 호스트 경로 -v를 통해서 컨테이너에 연결됨, 사용방법은 bind mount랑 같지만 관리가 용이하다는 차이점이 있다
[root@localhost ~]# docker inspect my-vol01
[
    {
        "CreatedAt": "2022-07-13T09:46:31+09:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-vol01/_data",
        "Name": "my-vol01",
        "Options": {},
        "Scope": "local"
    }
]

네트워크 생성

[root@localhost ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
422d12cc798c   bridge    bridge    local
da18457e1680   host      host      local
a3bcab641021   none      null      local
-> bridge 는 docker0임

[root@localhost ~]# ip a
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:27:10:2e:36 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
스위치의 역할. ip 공유기와 유사하다.

// 네트워크 생성
[root@localhost ~]# docker network create new-net --subnet 10.19.0.0/16 --ip-range 10.19.0.0/20 --gateway 10.19.0.1
[root@localhost ~]# docker inspect new-net

onbuild

운영자

[root@localhost ~]# mkdir onbuild && cd $_
# vi Dockerfile.base
FROM ubuntu:18.04
RUN sed -i 's/archive.ubuntu.com/ftp.daumkakao.com/g' /etc/apt/sources.list
RUN apt-get -y update
RUN apt-get -y install nginx
EXPOSE 80
ONBUILD ADD website*.tar /var/www/html/
CMD ["nginx", "-g", "daemon off;"]

[root@localhost onbuild]# docker build -t sechim052339/web-base:v2.0 -f Dockerfile.base .

build > push > run

컴포즈 compose

플레이북을 꾸미듯이 yaml파일을 사용해서 실행시켜서 재사용
다중 컨테이너 docker 애플리케이션을 정의하고 실행시킬 수 있다.

3단계 프로세스
1. dockerfile을 어디서나 재현할 수 있도록 앱 환경 정의
2. 앱을 구성하는 서비스 정의는 docker-compose.yml 형식의 스크립트로 격리된 환경에서 실행
3. 실행 docker-compose up을 하면 docker-compose.yml 스크립트를 읽어서 실행함.

/usr/local/bin 에 경로지정하면 어디서든 실행가능

--- 도커 컴포즈

# curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
# mkdir my_wordpress && cd $_
# vi docker-compose.yml
version: "3.3"    
services:	
  dbserver:					# 서비스 이름, 이 안에는 컨테이너가 있음
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql		# 도커 명령을 통해 관리하게 되는 볼륨 /var/lib/mysql -> DB 소스,설정 등 중요한 파일들의 경로 
    restart: always
    environment: 				# -e
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: wppass
  wordpress:					# 워드프레스 컨테이너
    depends_on:					# 우선순위, dbserver가 먼저 생성된 뒤에 생겨야함		
      - dbserver
    image: wordpress:latest
    volumes:
      - wordpress_data:/var/www/html		# 데이터 복원이 쉬워짐
    ports:
      - "8810:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: dbserver:3306
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: wppass
      WORDPRESS_DB_NAME: wordpress
volumes:						# 볼륨 사용 선언
  db_data: {}
  wordpress_data: {}

# docker-compose up -d
# docker-compose ps


// 워드프레스 볼륨 중요 데이터 저장 위치
[root@localhost my_wordpress]# docker volume ls
DRIVER    VOLUME NAME
local     my-vol01
local     my_wordpress_db_data
local     my_wordpress_wordpress_data

[root@localhost my_wordpress]# docker inspect my_wordpress_db_data
[
    {
        "CreatedAt": "2022-07-13T12:07:51+09:00",
        "Driver": "local",
        "Labels": {
            "com.docker.compose.project": "my_wordpress",
            "com.docker.compose.version": "1.26.2",
            "com.docker.compose.volume": "db_data"
        },
        "Mountpoint": "/var/lib/docker/volumes/my_wordpress_db_data/_data",
        "Name": "my_wordpress_db_data",
        "Options": null,
        "Scope": "local"
    }
]

[root@localhost my_wordpress]# cd /var/lib/docker/volumes/my_wordpress_db_data/_data
[root@localhost _data]# ls
auto.cnf    client-cert.pem  ibdata1      ibtmp1      performance_schema  server-cert.pem  wordpress
ca-key.pem  client-key.pem   ib_logfile0  mysql       private_key.pem     server-key.pem
ca.pem      ib_buffer_pool   ib_logfile1  mysql.sock  public_key.pem      sys



// 워드프레스 컨피그 파일 위치
[root@localhost _data]# docker inspect my_wordpress_wordpress_data
[
    {
        "CreatedAt": "2022-07-13T12:10:51+09:00",
        "Driver": "local",
        "Labels": {
            "com.docker.compose.project": "my_wordpress",
            "com.docker.compose.version": "1.26.2",
            "com.docker.compose.volume": "wordpress_data"
        },
        "Mountpoint": "/var/lib/docker/volumes/my_wordpress_wordpress_data/_data",
        "Name": "my_wordpress_wordpress_data",
        "Options": null,
        "Scope": "local"
    }
]
[root@localhost _data]# cd /var/lib/docker/volumes/my_wordpress_wordpress_data/_data
[root@localhost _data]# ls
index.php    wp-activate.php     wp-comments-post.php  wp-config-sample.php  wp-includes        wp-login.php     wp-signup.php
license.txt  wp-admin            wp-config-docker.php  wp-content            wp-links-opml.php  wp-mail.php      wp-trackback.php
readme.html  wp-blog-header.php  wp-config.php         wp-cron.php           wp-load.php        wp-settings.php  xmlrpc.php

# docker-compose pause			# 일시정지
# docker-compose unpause
# docker-compose port wordpress 80		# 호스트 포트 
# docker-compose config
# docker-compose stop wordpress			# 아예 멈춤
# docker-compose rm wordpress			# 컨테이너 지우기
# docker-compose down					# 전부 다 멈추면서 지우기
# docker-compose down --rmi all			# 이미지 모두 지우는 명령어


[root@localhost my_wordpress]# docker-compose down -v		# 볼륨,컨테이너 지우는 명령어

볼륨이 있어서 down 했다가 다시 실행해도 그대로 데이터 남아있다.
persistent 볼륨 특징임

모니터링

운영되고 있는 컨테이너 관리차원에서 모니터링

--- 도커 컨테이너 모니터링
VERSION=v0.44.0 # use the latest release version from https://github.com/google/cadvisor/releases
docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --volume=/dev/disk/:/dev/disk:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  --privileged \
  --device=/dev/kmsg \
  gcr.io/cadvisor/cadvisor:$VERSION

위 명령어 실행 후 브라우저에서 접속해보면

클러스터 cluster

단일 장애 지점 막기

도커 스웜 docker swarm

스웜 + compose = 쿠버네티스

[root@manager1 ~]# docker swarm init --advertise-addr 192.168.1.104

[root@worker1 ~]# docker swarm join --token SWMTKN-1-19nopdy956x0vo1xn1umov8k7kshnsfz2j918md6fnasmwmdl4-crdnddmtatlw2kn72ev24p3bo 192.168.1.104:2377
This node joined a swarm as a worker.

[root@worker2 ~]# docker swarm join --token SWMTKN-1-19nopdy956x0vo1xn1umov8k7kshnsfz2j918md6fnasmwmdl4-crdnddmtatlw2kn72ev24p3bo 192.168.1.104:2377
This node joined a swarm as a worker.

[root@manager1 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
bvnfp11rpb9rqkbo7dqtvww1t *   manager1   Ready     Active         Leader           20.10.17
ykonuusr8wzwo741tnn55tiws     worker1    Ready     Active                          20.10.17
fkrow9q53xlgxg043zw9gh52v     worker2    Ready     Active                          20.10.17

// 배포 명령어 * desired state 태스크 생성
[root@manager1 ~]# docker service create --name my_web --replicas 3 --publish published=8080,target=80 nginx

// 컨테이너에 manager1 웹페이지 표시
[root@manager1 ~]# docker exec 745e1fc0472b sh -c "echo "manager1" >> /usr/share/nginx/html/index.html"


// worker1,2에도 진행
[root@worker2 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
aa921d0bf654   nginx:latest   "/docker-entrypoint.…"   11 minutes ago   Up 11 minutes   80/tcp    my_web.2.jkxxjiofb269j52nq9krbabjo
[root@worker2 ~]# docker exec aa921d0bf654 sh -c "echo "worker2" >> /usr/share/nginx/html/index.html"

브라우저별로 접속하면 로드밸런싱 확인가능

// 로그 확인
[root@manager1 ~]# docker service logs my_web


[root@manager1 ~]# docker service inspect --pretty my_web
ID:             tkog6ac7zh1xeiynj7lwu4zl9
Name:           my_web
Service Mode:   Replicated
 Replicas:      3
Placement:
UpdateConfig:
 Parallelism:   1
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Update order:      stop-first
RollbackConfig:
 Parallelism:   1
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Rollback order:    stop-first
ContainerSpec:
 Image:         nginx:latest@sha256:dbe677093f569cc0afe2a149c529645f255aac959490ef11fb19ac6418b815d3
 Init:          false
Resources:
Endpoint Mode:  vip
Ports:
 PublishedPort = 8080
  Protocol = tcp
  TargetPort = 80
  PublishMode = ingress		# manager, worker 어느 곳에 접속하든 똑같은 결과가 나오는 것이 ingress 모드이기 때문임

// 5개를 스케일 아웃 하겠다. 기존 3개에서 2개를 더해서
[root@manager1 ~]# docker service scale my_web=5



--- 롤링 업데이트

# docker service ps my_web
# docker service inspect --pretty my_web
# docker service update --image sechim052339/web-site:v2.0 my_web
# docker service ps my_web

--- 롤백
// 업데이트 전으로 돌린다. 직전으로 밖에 못감
쿠버네티스는 원하는 버전으로 돌리기 가능
[root@manager1 ~]# docker service rollback my_web

// 이전 버전 셧다운 되어있음
[root@manager1 ~]# docker service ps my_web
ID             NAME           IMAGE                        NODE       DESIRED STATE   CURRENT STATE            ERROR     PORTS
qlbthbfp2any   my_web.1       sechim052339/web-site:v1.0   worker1    Running         Running 3 minutes ago
lx0tlhu5wyie    \_ my_web.1   nginx:latest                 worker1    Shutdown        Shutdown 3 minutes ago
k5e0zyqdbb6u   my_web.2       sechim052339/web-site:v1.0   worker2    Running         Running 4 minutes ago
jkxxjiofb269    \_ my_web.2   nginx:latest                 worker2    Shutdown        Shutdown 4 minutes ago
jfmje6zu2p9g   my_web.3       sechim052339/web-site:v1.0   manager1   Running         Running 4 minutes ago
4c0ill6xwsel    \_ my_web.3   nginx:latest                 manager1   Shutdown        Shutdown 5 minutes ago



--- 클러스터에서 특정 노드 드레인하기

# docker node ls
# docker service ps my_web
# docker node update --availability drain worker1
# docker node inspect --pretty worker1
# docker service ps my_web			// manager 가 사양이 더 좋기 때문에 manager가 프로세스를 가져갈 확률이 큼
# docker node update --availability active worker1
# docker node inspect --pretty worker1
# docker node ls

드레인 후 worker1을 active하기 위해선  scale in 후에 scale out 해주면 worker1이 구동된 것을 확인할 수 있다.

// scale in, out
[root@manager1 ~]# docker service scale my_web=2
[root@manager1 ~]# docker service scale my_web=3
// 구동 확인
[root@manager1 ~]# docker service ps my_web
ID             NAME           IMAGE                        NODE       DESIRED STATE   CURRENT STATE             ERROR                         PORTS
1dlc6pb0pb7z   my_web.1       sechim052339/web-site:v1.0   worker2    Running         Running 14 minutes ago                               
q1zfvb8aevsb   my_web.2       sechim052339/web-site:v1.0   manager1   Running         Running 14 minutes ago                               
xar3c75qwdsi   my_web.3       sechim052339/web-site:v1.0   worker1    Running         Running 7 seconds ago                                
25w8pohaxdp7    \_ my_web.3   sechim052339/web-site:v1.0   manager1   Shutdown        Failed 7 minutes ago      "task: non-zero exit (137)"
stech601cy58    \_ my_web.3   sechim052339/web-site:v1.0   worker1    Shutdown        Shutdown 12 minutes ago           


[root@manager1 ~]# docker node update --availability  pause worker1
[root@manager1 ~]# docker service scale my_web=5
[root@manager1 ~]# docker node inspect --pretty worker1
[root@manager1 ~]# docker node ls

pod : 컨테이너를 담고 있음 task와 비슷
쿠버네티스에선 pod, 도커에선 task

쿠버네티스 kubernetes 이론

선언적 구성 : yaml 파일, ex) desired state, replicas
자동화가 모두 용이함

etcd : 데이터베이스역할 서버 있음 NoSQL 로 KVS 이다.

0개의 댓글