2022-09-15

강아람·2022년 9월 15일
0

Kakao Cloud School

목록 보기
28/30
post-thumbnail

Docker Container 관리

  • docker 기본 네트워크 구성: bridge 모드(local)
  • bridge 모드: docker container만의 네트워크를 실 서버의 네트워크와 분리해 독립적으로 구성하는 네트워크 방식
  • scale out: 서버에 부하가 많이 걸리면 서버 수를 늘려 부하를 분산
  • autoscaling: 자동으로 scale out해주는 기능

Swarm

  • swarm(active)을 통해 overlay를 사용할 수 있다.
  • kubernetes와 같은 orchestration 기능 구현 가능
  • network cluster를 구축할 수 있도록 해준다.

overlay

  • 서로 다른 컨테이너 간 통신

bridge 실습

  • [창 1]
    add-net 컨테이너 생성
kevin@hostos1:~$ docker run -it --name=add-net ubuntu:14.04 bash
  • 컨테이너 확인
kevin@hostos1:~$ docker ps

  • [창 2] web-network 네트워크 생성
kevin@hostos1:~$ docker network create --driver=bridge web-network
  • web-network 네트워크에 add-net 컨테이너 연결하여 컨테이너 실행
kevin@hostos1:~$ docker network connect web-network add-net
kevin@hostos1:~$ docker exec add-net route

  • [원래 창] 컨테이너 정보 확인
root@10db94219c83:/# ifconfig

Docker Container Network

  • CNM(Container Networking Model)

자원 소비 제어

cgroup

컨테이너에 자원 할당 ▶ 기본값 unlimit으로 설정되어 있음

자원

  1. CPU

time scheduling(Round Robin 방식)

cpu 할당 전 cpu register에 작업을 등록한 후 프로세스에게 cpu 사용 시간을 할당
▶ cpu 자원 소비 시간 제한 가능

stress

부하 유발 기능 ▶ cpu 자원 소비 비율 제한 가능

cpu에 과부하 적용

kevin@hostos1:~$ stress -c 1 -t 10s

  1. memory
    사용량 제한: physical / swap 4M(page 4KB) ~
  1. disk
  • 성능 지표: MBPS, IOPS

    --device-read-bps, -device-write-bps
    --device-read-iops, -device-write-iops

Linux 5.15.0-46-generic (hostos1)       2022년 09월 15일        _x86_64_        (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.37    0.01    0.42    0.05    0.00   99.15

Device             tps    kB_read/s    kB_wrtn/s     kB_read    kB_wrtn 
loop0             0.00         0.00         0.00         362          0 
loop1             0.00         0.02         0.00        1153          0   
loop2             0.00         0.02         0.00        1375          0 
loop3             0.01         0.30         0.00       22764          0 
loop4             0.00         0.00         0.00          17          0 
loop5             0.00         0.00         0.00         359          0  
loop6             0.01         0.51         0.00       38467          0  
loop7             0.00         0.04         0.00        2732          0 
loop8             0.00         0.02         0.00        1341          0 
loop9             0.00         0.00         0.00          50          0  
sda               1.69        21.09        35.83     1575558    2677352 
sdb               1.06         8.79       132.72      656500    9916188 
scd0              0.00         0.00         0.00           2          0

자원 사용량 제한

cpu 제한

사용량 제한

kevin@hostos1:~$ docker run -d --name=cpuset1 --cpuset-cpus 2 leecloudo/stress:1.0 stress -c 1
kevin@hostos1:~$ docker run -d --name=cpuset2 --cpuset-cpus 0,3 leecloudo/stress:1.0 stress -c 2

비율 제한

  • cpu 1개
kevin@hostos1:~$ docker run -d --name=cpuset1 --cpuset-cpus 2 leecloudo/stress:1.0 stress --cpu 1
kevin@hostos1:~$ docker update --cpus=0.2 cpuset1

kevin@hostos1:~$ docker update --cpus=0.6 cpuset1

  • cpu 2개
kevin@hostos1:~$ docker run -d --name=cpuset2 --cpuset-cpus 0,3 leecloudo/stress:1.0 stress -c 2
kevin@hostos1:~$ docker update --cpus=0.2 cpuset2

▶ 합쳐서 20% 사용


memory 제한

memory

kevin@hostos1:~$ docker run -d --name=nginx200m --memory=200m nginx:1.23.1-alpine
kevin@hostos1:~$ docker inspect nginx200m | grep -i memory

kevin@hostos1:~$ bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
209715200/1024/1024
200
quit

swap memory

kevin@hostos1:~$ docker run -d --name=nginx200ms --memory=200m --memory-swap=200m nginx:1.23.1-alpine
kevin@hostos1:~$ docker inspect nginx200ms | grep -i memory

  • page 최소값인 4mb로 지정했으나 mysql의 최소 사용가능 크기가 6mb임을 알려줌
kevin@hostos1:~$ docker run -itd -m=4m --name=mydb mysql:5.7-debian
docker: Error response from daemon: Minimum memory limit allowed is 6MB.
See 'docker run --help'.
kevin@hostos1:~$ docker run -itd -m=6m --name=mydb mysql:5.7-debian

disk 제한

제한이 없을 경우

  • 최대 disk 사용: 479 MB/s
kevin@hostos1:~$ docker run  -it --rm ubuntu:14.04 bash
root@1c7e80a2e8fe:/# dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.0218984 s, 479 MB/s

1MB로 제한했을 경우

kevin@hostos1:~$  docker run -it --rm --device-write-bps /dev/sdb:1mb ubuntu:14.04 bash
root@782bb618fe66:/# dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct

10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 10.1129 s, 1.0 MB/s

10MB로 제한했을 경우

kevin@hostos1:~$ docker run -it --rm --device-write-bps /dev/sdb:10mb ubuntu:14.04 bash
root@3340c44c96c4:/# dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 1.13695 s, 9.2 MB/s

Docker volume

공유 설정 기능

  • host to container
  • container to container

1) bind mount
bind mount -v(--volume) 호스트절대경로:컨테이너절대경로
-v /data/test1:mount1

  • host와 container의 절대 경로를 사용자가 직접 지정(사용자 관리)
  • 경로가 없으면 자동으로 생성된다.

2) volume
docker volume create volume_name
-v volume_name:/mount2

  • volume은 자동으로 /var/lib/docker/volumes 라는 경로로 지정됨 (도커가 직접 경로 관리)

3) tmpfs mount
임시 경로 설정 (잘 사용하지 않는다.)

Host OS directory와 Container partition(bind mount)과 파일 공유

[실습]



Database 관리

Master-Standby DB

Role

  • Active-Active: DB 동기화가 즉시 일어남
  • Active-Standby: Master DB만 쓰기 진행, Master DB 에러 발생하면 Stadby DB가 Active로 Role switching 된다.

Backup

Migration

  • *.idb 파일을 옮겨야 함 (innovation database)

    *.idb

    데이터를 저장한 파일

[실습]

kevin@hostos1:~/hello1$ vi test1.txt
kevin@hostos1:~/hello1$ cat > test1.txt
test1 (ctrl + d)

kevin@hostos1:~$ docker run -it --name ubuntu_volume1 -v /home/kevin/hello1:/hello1 -v /home/kevin/hello2:/hello2 ubuntu:16.04 bash
root@e7bc5e35e16e:/# ls
bin   dev  hello1  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  hello2  lib   media  opt  root  sbin  sys  usr
root@e7bc5e35e16e:/# cd hello1
root@e7bc5e35e16e:/hello1# ls
test1.txt
root@e7bc5e35e16e:/hello1# cd ../hello2
root@e7bc5e35e16e:/hello2# ls
test2.txt
root@e7bc5e35e16e:/hello2# mount

root@e7bc5e35e16e:/hello2# cd ../hello1
root@e7bc5e35e16e:/hello1# echo "hi~" >> test1.txt
root@e7bc5e35e16e:/hello1# cat test1.txt
test1hi~
kevin@hostos1:~/hello1$ cat test1.txt
test1hi~

kevin@hostos1:~$ cd hello2
kevin@hostos1:~/hello2$ cat > test2.txt
test2kevin@hostos1:~/hello2$ cat test2.txt
test2kevin@hostos1:~/hello2$ vi test2.txt
kevin@hostos1:~/hello2$ cd ..

volume으로 DB 데이터 저장

volume은 해당 컨테이너(application)의 주요 소스, 구성 경로에 배치(해당 경로에 데이터 파일 저장)하면 된다!

1) httpd -- volume --> /var/www/html
2) nginx -- volume --> /etc/nginx or /usr/share/nginx/html

Q) mysql:5.7-debian

---> stop/rm ---> mysql:8.0 yes

Q) mysql:5.7-debian

---> stop/rm ---> mariadb:10.2 no
확인해보자!

kevin@hostos1:/$ docker run -it --name=mydb-vol -e MYSQL_ROOT_PASSWORD=pass123# \
-e MYSQL_DATABASE=kakaodb -v /home/kevin/mydb:/var/lib/mysql mysql:5.7-debian

kevin@hostos1:~$ docker exec -it mydb-vol bash
root@dc5b2d563da8:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| kakaodb            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

mysql> use kakaodb;
Database changed
mysql> create table kakao_prod (prod_name varchar(20), prod_item varcha r(50));
Query OK, 0 rows affected (0.03 sec)

mysql> insert into kakao_prod values ('imoticon', 'crong');
Query OK, 1 row affected (0.03 sec)

mysql> select * from kakao_prod;
+-----------+-----------+
| prod_name | prod_item |
+-----------+-----------+
| imoticon  | crong     |
+-----------+-----------+
1 row in set (0.00 sec)

mysql> exit
Bye

root@dc5b2d563da8:/# cd /var/lib/mysql/kakaodb/
root@dc5b2d563da8:/var/lib/mysql/kakaodb# ls
db.opt  kakao_prod.frm  kakao_prod.ibd

kevin@hostos1:~$ ls
mydb
kevin@hostos1:~$ cd mydb
kevin@hostos1:~/mydb$ sudo ls -l kakaodb/
[sudo] password for kevin:
total 112
-rw-r----- 1 systemd-coredump systemd-coredump    65  9월 15 13:54 db.o pt
-rw-r----- 1 systemd-coredump systemd-coredump  8610  9월 15 14:05 kaka o_prod.frm
-rw-r----- 1 systemd-coredump systemd-coredump 98304  9월 15 14:05 kaka o_prod.ibd

1) httpd -- volume --> /var/www/html
2) nginx -- volume --> /etc/nginx or /usr/share/nginx/html or /var/log/nginx/access.log | error.log 에 로그가 기록된다.


찾을 수 있는 문제점

  1. /가 sdb의 공간을 모두 사용할 수 있음
  2. webapp이 sda의 공간을 모두 사용할 수 있음

문제 해결 방법

  1. sdb (docker)
docker: Error response from daemon: --storage-opt is supported only for overlay over xfs with 'pquota' mount option.
See 'docker run --help'.

조건 1. overlay over xfs
조건 2. with 'pquota'

  • 조건 1은 만족!
kevin@hostos1:~$ docker info
 Storage Driver: overlay2
  Backing Filesystem: xfs
  • 조건 2
cat /etc/fstab



Docker multi Container Application 구축

application과 database가 결합된 Container 결합 환경 구성
-container화(Con

  • docker-compose를 위해 docker 명령어가 필요
    • dockerfile 작성법 ▶ linux 명령어 사용
    • docker-compose.yml (yml code) 작성법 ▶ docker 명령어 사용
  • docker-compose.yml 파일을 통해 ok

0개의 댓글