Docker, Docker-Compose, K8S

1. Docker ๐ณ
๋์ปค๋ "๋ง๋ฒ์ ์์"์์!
- ์ปดํจํฐ ํ๋ก๊ทธ๋จ์ ์์์ ๋ด์์ ์ด๋์๋ ๋๊ฐ์ด ์คํํ ์ ์๊ฒ ํด์ค์
- ๋ง์น ์ฅ๋๊ฐ์ ์์์ ๋ด์์ ์น๊ตฌ ์ง์ ๊ฐ์ ธ๊ฐ๋ ๋๊ฐ์ด ๋ ์ ์๋ ๊ฒ์ฒ๋ผ์!
2. Docker Compose ๐ผ
๋์ปค ์ปดํฌ์ฆ๋ "์ฌ๋ฌ ์์๋ฅผ ๊ด๋ฆฌํ๋ ๊ด๋ฆฌ์"์์!
- ์ฌ๋ฌ ๊ฐ์ ๋์ปค ์์๋ฅผ ํ ๋ฒ์ ๊ด๋ฆฌํด์ค์
- ๋ ๊ณ ๋ธ๋ก์ ์กฐ๋ฆฝ ์ค๋ช ์๋๋ก ๋ง์ถ๋ ๊ฒ์ฒ๋ผ, ์ฌ๋ฌ ํ๋ก๊ทธ๋จ์ ์ฐ๊ฒฐํด์ค์
3. Kubernetes (K8s) โ
์ฟ ๋ฒ๋คํฐ์ค๋ "๊ฑฐ๋ํ ๋์ด๊ณต์ ๊ด๋ฆฌ์"์์!
- ์๋ง์ ๋์ปค ์์๋ค์ ์๋์ผ๋ก ๊ด๋ฆฌํด์ค์
- ๋์ด๊ณต์์์ ์๋์ด ๋ง์ผ๋ฉด ๋์ด๊ธฐ๊ตฌ๋ฅผ ๋ ๋๋ฆฌ๋ ๊ฒ์ฒ๋ผ, ํ์ํ ๋งํผ ํ๋ก๊ทธ๋จ์ ๋๋ ค์ค์
๐ฆ ์ค์นํ๋ ๋ฐฉ๋ฒ
1. Docker ์ค์นํ๊ธฐ
# 1๋จ๊ณ: ์์คํ
์
๋ฐ์ดํธ (์ปดํจํฐ๋ฅผ ์ต์ ์ํ๋ก ๋ง๋ค๊ธฐ)
sudo apt update
sudo apt upgrade -y
# 2๋จ๊ณ: ํ์ํ ๋๊ตฌ๋ค ์ค์นํ๊ธฐ
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
# 3๋จ๊ณ: Docker์ ์ด์ (GPG key) ์ถ๊ฐํ๊ธฐ
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 4๋จ๊ณ: Docker ์ ์ฅ์ ์ถ๊ฐํ๊ธฐ
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 5๋จ๊ณ: Docker ์ค์นํ๊ธฐ
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
# 6๋จ๊ณ: ํ์ฌ ์ฌ์ฉ์๊ฐ Docker๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํ๊ธฐ
sudo usermod -aG docker $USER
newgrp docker
# 7๋จ๊ณ: Docker๊ฐ ์ ์ค์น๋๋์ง ํ์ธํ๊ธฐ
docker --version
2. Docker Compose ์ค์นํ๊ธฐ
# ์ต์ ๋ฒ์ ๋ค์ด๋ก๋ํ๊ธฐ
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# ์คํ ๊ถํ ์ฃผ๊ธฐ
sudo chmod +x /usr/local/bin/docker-compose
# ํ์ธํ๊ธฐ
docker-compose --version
3. Kubernetes ์ค์นํ๊ธฐ (Minikube ์ฌ์ฉ)
# 1๋จ๊ณ: kubectl ์ค์น (์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ๋ชจ์ปจ)
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
# 2๋จ๊ณ: Minikube ์ค์น (์์ ์ฟ ๋ฒ๋คํฐ์ค ๋์ดํฐ)
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# 3๋จ๊ณ: Minikube ์์ํ๊ธฐ
minikube start --driver=docker
# ํ์ธํ๊ธฐ
kubectl version --client
๐ Docker ์ฌ์ฉํ๊ธฐ
๊ธฐ๋ณธ ๋ช ๋ น์ด๋ค
# 1. ์ด๋ฏธ์ง ๊ฒ์ํ๊ธฐ (์ฑ์คํ ์ด์์ ์ฑ ์ฐพ๊ธฐ)
docker search nginx
# 2. ์ด๋ฏธ์ง ๋ค์ด๋ก๋ํ๊ธฐ (์ฑ ๋ค์ด๋ก๋)
docker pull nginx
# 3. ๋ค์ด๋ก๋ํ ์ด๋ฏธ์ง ๋ชฉ๋ก ๋ณด๊ธฐ
docker images
# 4. ์ปจํ
์ด๋ ์คํํ๊ธฐ (์ฑ ์คํ)
docker run -d --name my-web -p 8080:80 nginx
# -d: ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ
# --name: ์ปจํ
์ด๋ ์ด๋ฆ ์ ํ๊ธฐ
# -p: ํฌํธ ์ฐ๊ฒฐ (์ปดํจํฐ์ 8080๋ฒ ๋ฌธ์ ์ปจํ
์ด๋์ 80๋ฒ ๋ฌธ๊ณผ ์ฐ๊ฒฐ)
# 5. ์คํ ์ค์ธ ์ปจํ
์ด๋ ๋ณด๊ธฐ
docker ps
# 6. ๋ชจ๋ ์ปจํ
์ด๋ ๋ณด๊ธฐ (์ค์ง๋ ๊ฒ๋ ํฌํจ)
docker ps -a
# 7. ์ปจํ
์ด๋ ์ค์งํ๊ธฐ
docker stop my-web
# 8. ์ปจํ
์ด๋ ์์ํ๊ธฐ
docker start my-web
# 9. ์ปจํ
์ด๋ ์ญ์ ํ๊ธฐ
docker rm my-web
# 10. ์ด๋ฏธ์ง ์ญ์ ํ๊ธฐ
docker rmi nginx
์ค์ต ์์ : ๊ฐ๋จํ ์น์๋ฒ ๋ง๋ค๊ธฐ
- index.html ํ์ผ ๋ง๋ค๊ธฐ
mkdir my-website
cd my-website
echo "<h1>์๋
ํ์ธ์! ๋์ ์ฒซ ๋์ปค ์น์ฌ์ดํธ์
๋๋ค!</h1>" > index.html
- Dockerfile ๋ง๋ค๊ธฐ
# Dockerfile
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html
- ์ด๋ฏธ์ง ๋น๋ํ๊ณ ์คํํ๊ธฐ
# ์ด๋ฏธ์ง ๋ง๋ค๊ธฐ
docker build -t my-website .
# ์ปจํ
์ด๋ ์คํํ๊ธฐ
docker run -d --name my-site -p 8080:80 my-website
# ๋ธ๋ผ์ฐ์ ์์ http://localhost:8080 ์ ์ํด๋ณด๊ธฐ!
๐ผ Docker Compose ์ฌ์ฉํ๊ธฐ
์์ : WordPress ๋ธ๋ก๊ทธ ๋ง๋ค๊ธฐ
- docker-compose.yml ํ์ผ ๋ง๋ค๊ธฐ
version: '3'
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 ์๋น์ค
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data:
- Docker Compose ๋ช ๋ น์ด๋ค
# ์๋น์ค ์์ํ๊ธฐ
docker-compose up -d
# ์คํ ์ค์ธ ์๋น์ค ๋ณด๊ธฐ
docker-compose ps
# ๋ก๊ทธ ๋ณด๊ธฐ
docker-compose logs
# ์๋น์ค ์ค์งํ๊ธฐ
docker-compose stop
# ์๋น์ค ์ญ์ ํ๊ธฐ
docker-compose down
# ์๋น์ค์ ๋ณผ๋ฅจ๊น์ง ๋ชจ๋ ์ญ์ ํ๊ธฐ
docker-compose down -v
โ Kubernetes ์ฌ์ฉํ๊ธฐ
๊ธฐ๋ณธ ๊ฐ๋
- Pod: ๊ฐ์ฅ ์์ ๋จ์ (๋์ปค ์ปจํ ์ด๋๋ฅผ ๋ด๋ ๊ผฌํฌ๋ฆฌ)
- Deployment: Pod๋ฅผ ๊ด๋ฆฌํ๋ ๊ด๋ฆฌ์
- Service: Pod์ ์ ๊ทผํ ์ ์๋ ๋ฌธ
์์ : ๊ฐ๋จํ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌํ๊ธฐ
- deployment.yaml ํ์ผ ๋ง๋ค๊ธฐ
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3 # 3๊ฐ์ ๋ณต์ฌ๋ณธ ๋ง๋ค๊ธฐ
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
- service.yaml ํ์ผ ๋ง๋ค๊ธฐ
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
- Kubernetes ๋ช ๋ น์ด๋ค
# Deployment ์์ฑํ๊ธฐ
kubectl apply -f deployment.yaml
# Service ์์ฑํ๊ธฐ
kubectl apply -f service.yaml
# Pod ๋ชฉ๋ก ๋ณด๊ธฐ
kubectl get pods
# Service ๋ชฉ๋ก ๋ณด๊ธฐ
kubectl get services
# Deployment ์ํ ๋ณด๊ธฐ
kubectl get deployments
# Pod ์์ธํ ๋ณด๊ธฐ
kubectl describe pod [pod-name]
# Pod ๋ก๊ทธ ๋ณด๊ธฐ
kubectl logs [pod-name]
# Pod ๊ฐ์ ๋๋ฆฌ๊ธฐ
kubectl scale deployment nginx-deployment --replicas=5
# ๋ฆฌ์์ค ์ญ์ ํ๊ธฐ
kubectl delete -f deployment.yaml
kubectl delete -f service.yaml
๐ฏ ์ธ์ ๋ฌด์์ ์ฌ์ฉํ ๊น์?
Docker๋ฅผ ์ฌ์ฉํ ๋
- ํ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ ๋
- ๊ฐ๋ฐ ํ๊ฒฝ์ ๋ง๋ค ๋
- ๊ฐ๋จํ ํ ์คํธ๋ฅผ ํ ๋
์์: "๋ด ์ปดํจํฐ์์ Python ํ๋ก๊ทธ๋จ์ ๋์ปค๋ก ์คํํ๊ธฐ"
docker run -it python:3.9 python
>>> print("์๋
ํ์ธ์!")
Docker Compose๋ฅผ ์ฌ์ฉํ ๋
- ์ฌ๋ฌ ๊ฐ์ ๊ด๋ จ๋ ์๋น์ค๋ฅผ ํจ๊ป ์คํํ ๋
- ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ ์ฒด ์์คํ ์ ํ ์คํธํ ๋
์์: "์น์ฌ์ดํธ + ๋ฐ์ดํฐ๋ฒ ์ด์ค ํจ๊ป ์คํํ๊ธฐ"
Kubernetes๋ฅผ ์ฌ์ฉํ ๋
- ์ค์ ์๋น์ค๋ฅผ ์ด์ํ ๋
- ์๋์ผ๋ก ํ์ฅ/์ถ์๊ฐ ํ์ํ ๋
- ์ฌ๋ฌ ๋์ ์ปดํจํฐ์์ ์คํํ ๋
์์: "1000๋ช ์ด ๋์์ ์ฌ์ฉํ๋ ์น์ฌ์ดํธ ์ด์ํ๊ธฐ"
๐ ์ ๋ฆฌ
- Docker: ํ ๊ฐ์ ํ๋ก๊ทธ๋จ์ ์์์ ๋ด๊ธฐ
- Docker Compose: ์ฌ๋ฌ ์์๋ฅผ ํ ๋ฒ์ ๊ด๋ฆฌํ๊ธฐ
- Kubernetes: ์๋ง์ ์์๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ๊ธฐ
์ด๋ ๊ฒ ๋จ๊ณ๋ณ๋ก ๋ฐฐ์ฐ๋ฉด, ์์ ํ๋ก์ ํธ๋ถํฐ ํฐ ํ๋ก์ ํธ๊น์ง ๋ชจ๋ ๊ด๋ฆฌํ ์ ์์ด์! ๐