centOS ova로 vm 생성
연결된 복제로 worker 생성
도커 컴포즈 : 컨테이너를 여러개 실행시킬 수 있는 기술
// 볼륨 생성
[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
운영자
[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
플레이북을 꾸미듯이 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
위 명령어 실행 후 브라우저에서 접속해보면
단일 장애 지점 막기
스웜 + 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
선언적 구성 : yaml 파일, ex) desired state, replicas
자동화가 모두 용이함
etcd : 데이터베이스역할 서버 있음 NoSQL 로 KVS 이다.