๐ ๊ณต๋ถ ๊ณ๊ธฐ
์ถ๊ฐ์ ์ธ ๋์ปค ๊ณต๋ถ๋ฅผ ์ํด ์ ํ๋ธ ๋ฐ๋ฐฐ๋ ๋์ปค ์๋ฆฌ์ฆ๋ฅผ ๋ณด๋ฉด์ ์ ๋ฆฌํด ๋ด ๋๋ค.
๋ชฉ์ฐจ
๐10-1. ๋น๋์์ ์ด์๊น์ง : ์ด๋ก
1๏ธโฃ ๋์ปค ์ปดํฌ์ฆ๊ฐ ๋ญ์์?

์ฌ๋ฌ ์ปจํ ์ด๋๋ฅผ ์ผ๊ด์ ์ผ๋ก ์ ์ํ๊ณ ์คํํ ์ ์๋ ํด.
ํ๋์ ์๋น์ค๋ฅผ ์ด์ํ๊ธฐ ์ํด ์ฌ๋ฌ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์ํด์ผ ํ ๋๊ฐ ์๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปจํ ์ด๋ํ ์์ผ ํตํฉ ๊ด๋ฆฌํ ์ ์๋ค.
์ง๊ธ๊น์ง ์ฌ๋ฌ ๋ช ๋ น์ด๋ฅผ ํ๋ํ๋ ์คํํด์ฃผ์๋๋ฐ
YAML(์ผ๋ฏ)ํ์ผ ํ๋๋ก ๋์ปค ์ปดํฌ์ฆ์ ์์ฒญํ๋ฉด ์ด yaml ํ์ผ์ ๋ช ๋ น์ด๋ก ํด์ํด ์ปจํ ์ด๋๋ฅผ ๊ด๋ฆฌํ๋ค.
๋ํ ์ด compose๋ก ์ฐ๊ฒฐ๋์ด ์๋ ์ปจํ ์ด๋๋ค์
docker-compose ํด๋ก ํ๊บผ๋ฒ์ ์ํ๋ฅผ ๋ณด๊ณ , ๊ด๋ฆฌํ๊ณ , ์ด์ํ ์ ์๋ค.
The Compose file
docs.docker.com
๐ฉ ๋์ปค ์ปดํ์ผ ๊ตฌ์ฑ
์ฌ๊ธฐ ํฌ์คํ ์๋ ์ ๋ฆฌํด ๋๊ธด ํ์๋๋ฐ
์ํฐ๋ ์ฑ๋ฆฐ์ง Docker 2] ๋ก์ปฌํ๊ฒฝ์์ ๋์ปค๋ฅผ ํ์ฉํด๋ณด์!
๐ ๊ณต๋ถ ๊ณ๊ธฐ ์ํฐ๋ ์ฑ๋ฆฐ์ง๊ฐ ์ด๋ฒ ๋ฌ ์ ๊ณตํ๋ ๊ฐ์๋ Docker! Docker ๊ฐ์ ์ด 4๋ฒ ์ค 2๋ฒ์งธ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํฉ๋๋ค. Docker ํ์ฉ ๋ชฉ์ฐจ ๐์ด๋ก ํธ : Docker Compose 1๏ธโฃ Docker Compose ๋? ๋์ปค ํ์ผ์ ํ๋์
littlezero48.tistory.com
* version
๋์ปค ์ปดํฌ์ฆ์ ๋ฒ์ ์ ์๋ฏธ.
ํ์ฌ(230409 ๊ธฐ์ค) version 3 ์ด์์ ์ฌ์ฉ
* services
์คํํ๋ ค๋ ์ปจํ
์ด๋๋ค์ ์ ์ํ๋ ์์ญ
์ปจํ
์ด๋์ ๋ํ ์ด๋ฆ, ์ด๋ฏธ์ง, ํฌํธ ๋งคํ, ํ๊ฒฝ๋ณ์, ๋ณผ๋ฅจ ๋ฑ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์ปจํ
์ด๋๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌ
- image : ์ปจํ ์ด๋์ ๋ฒ ์ด์ค ์ด๋ฏธ์ง
- build : ์ ์๋ ๋์ปคํ์ผ์์ ์ด๋ฏธ์ง ๋น๋ํ๊ณ ์๋น์ค ์ปจํ ์ด๋ ์์ฑ
- environment : ์ปจํ ์ด๋์ ์ ์ฉํ ํ๊ฒฝ๋ณ์ ์ค์ (run ๋ช ๋ น์ด์ --env, -e ์ต์ ๊ณผ ๋์ผ)
- command : ์ปจํ ์ด๋๊ฐ ์คํ๋ ๋ ์ํํ ๋ช ๋ น์ด (run ๋ช ๋ น์ด์ ์๋ธ command์ ์ ์ฉํ๋ ๊ฒ๊ณผ ๋์ผ)
- depends_on : ์ปจํ ์ด๋ ๊ฐ์ ์์กด์ฑ ์ฃผ์ . ์ฌ๊ธฐ์ ์ ํ ์ปจํ ์ด๋๊ฐ ๋จผ์ ์์ฑ๋์ผํ๋ค.
- ports : ๊ฐ๋ฐฉํ ํฌํธ ์ง์ (run ๋ช ๋ น์ด์ -p ์ ๋์ผ)
- expose : ๋งํฌ๋ก ์ฐ๊ณ๋ ์ปจํ ์ด๋์๊ฒ๋ง ๊ณต๊ฐํ ํฌํธ ์ค์
- volumes : ์ปจํ ์ด๋์ ๋ณผ๋ฅจ ๋ง์ดํธ
- restart : ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋ ๋ ์ฌ์์ ์ ์ฑ
- no : ์ฌ์์ ๋์ง ์์
- always : ์ธ๋ถ์ ์ํฅ์ ์ํด ์ข ๋ฃ ๋์์ ๋ ํญ์ ์ฌ์์ (์๋์ผ๋ก ๋๊ธฐ ์ ๊น์ง ํญ์ ์ฌ์์)
- on-failure : ์ค๋ฅ๊ฐ ์์ ์ ์ฌ์์

๐ข ์ฐธ๊ณ
- yaml ํ์ผ์ 2์นธ์ฉ ๋ค์ฌ์ฐ๊ธฐ(indent) ํด์ผํจ
2๏ธโฃ ๋์ปค ์ปดํฌ์ฆ๋ก ์ปจํ ์ด๋ ์คํํ ์ ์๋์?
1) ๋์ปค ์ปดํฌ์ฆ๊ฐ ์ฌ์ฉํ ์๋น์ค ๋๋ ํ ๋ฆฌ ์์ฑ
webserver ๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํ๊ณ (mkdir = make directory), webserver ๋ก ์ด๋ (cd = change directory)
mkdir webserver
cd webserver
2) docker-compose.yml ์์ฑ
๋์ปค์ปดํฌ์ฆ yml(=yaml)ํ์ผ ์์ฑ
cat > docker-compose.yml
๊ทธ ์์ ์๋ ์ฒ๋ผ ์์ฑ (*yaml ํ์ผ์ 2์ธ๋ดํธ(๋ค์ฌ์ฐ๊ธฐ) ๊ธฐ์ค!!)
version: '3'
services:
web:
image: httpd:latest
ports:
- "80:80"
links:
- mysql:db
command: apachectl -DFOREGROUND
mysql:
imge: mysql:latest
command: mysqld
environment:
MYSQL_ROOT_PASSWORD: pass
3) docker-compose ๋ช ๋ น์ด
# start : ์์, up : ์์ฑ ๋ฐ ์คํ , d ์ต์
: detach๋ชจ๋ ์ฆ, ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ
docker compose up [-d]
# ์ง๊ธ ์์นํ ๋๋ ํ ๋ฆฌ ๋์ ๋์ปค์ปดํฌ์ฆ ํ์ผ ๊ธฐ์ค์ผ๋ก ํ๋ก์ธ์ค ๋ชฉ๋ก ์กฐํ
docker compose ps
# ๊ฐ์ ์ค์
docker compose scale mysql=2
# stop : ์ค์ง, down : =rm, ์ค์ง ๋ฐ ์ญ์
docker compose down
๋ช ๋ น์ด | ์ค๋ช |
up | ์ปจํ ์ด๋ ์์ฑ/์์ |
ps | ์ปจํ ์ด๋ ๋ชฉ๋ก ํ์ |
logs | ์ปจํ ์ด๋ ๋ก๊ทธ ์ถ๋ ฅ |
run | ์ปจํ ์ด๋ ์คํ |
start | ์ปจํ ์ด๋ ์์ |
stop | ์ปจํ ์ด๋ ์ ์ง |
restart | ์ปจํ ์ด๋ ์ฌ์์ |
pause | ์ปจํ ์ด๋ ์ผ์ ์ ์ง |
unpause | ์ปจํ ์ด๋ ์ฌ๊ฐ |
port | ๊ณต๊ฐ ํฌํธ ๋ฒํธ ํ์ |
config | ๊ตฌ์ฑ ํ์ธ (yaml ํ์ผ ๋ฌธ๋ฒ ์ฒดํฌ |
kill | ์คํ ์ค์ธ ์ปจํ ์ด๋ ๊ฐ์ ์ ์ง |
rm | ์ปจํ ์ด๋ ์ญ์ |
down | ๋ฆฌ์์ค ์ญ์ |
-f | ๋ค๋ฅธ ํด๋์ ์๋ yamlํ์ผ์ ์คํํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ์ต์ |
scale ์๋น์ค์ด๋ฆ=๊ฐ์ | ํด๋น ์๋น์ค ๊ฐ์๋ฅผ ์ค์ |
๐10-2. ๋น๋์์ ์ด์๊น์ง : ์ค์ต
0๏ธโฃ ๋์ปค ์ปดํฌ์ฆ ํ๋ฌ๊ทธ์ธ ์ค์น
Install the Compose plugin
docs.docker.com
sudo apt-get update
sudo apt-get install docker-compose-plugin

์ฌ๊ธฐ ์ค์ต ๋ถ๋ถ์ ๋์ปค์์ ์ ๊ณตํ๋ ์๋ฃ์ ํจ๊ป ์ค์ต
Try Docker Compose
docs.docker.com
1๏ธโฃ ์๋น์ค ๋๋ ํ ๋ฆฌ ์์ฑ ๋ฐ ํ์ผ ์์ฑ
์๋น์ค ๋๋ ํ ๋ฆฌ ์์ฑ
mkdir composetest
cd composetest

์ค์ต์ฉ ์์ ํ์ผ app.py
cat > 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)

์ค์ต์ฉ ํ์ผ requirements.txt

2๏ธโฃ ๋น๋๋ฅผ ์ํ dockerfile ์์ฑ
ํ์ผ ์์ฑ
cat > Dockerfile
ํ์ผ ์์ฑ
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"]
# ๋ค์์ค์์ crtl+cํ๋ฉด ์ ์ฅ ๋ฐ ์ข
๋ฃ
ํ์ผ ์กฐํ
# > ๋ฆฌ๋ค์ด๋ ์
์ด ๋ค์ด๊ฐ๋ฉด ๋ฎ์ด์ฐ๊ธฐ๊ฐ ๋๋ฏ๋ก ๋นผ์ฃผ๋ฉด ์กฐํ๊ฐ๋ฅ
cat Dockerfile

๋ช ๋ น์ด ๋ถ์
๋ช ๋ น์ด | ์ค๋ช |
FROM python:3.7-alpine | python:3.7-alpine ์ด๋ฏธ์ง๋ฅผ ๋ฒ ์ด์ค๋ก ์ฌ์ฉ |
WORKDIR /code | ์์ ๋๋ ํ ๋ฆฌ๋ ํ์ฌ์์น์ code๋ผ๋ ํด๋๋ฅผ ์ฌ์ฉ |
ENV FLASK_APP=app.py | ํ๊ฒฝ๋ณ์ FLASK_APP ์ app.pyํ ๋น |
ENV FLASK_RUN_HOST=0.0.0.0 | ํ๊ฒฝ๋ณ์ FLASK_RUN_HOST์ 0.0.0.0 ํ ๋น |
RUN apk add --no-cache gcc musl-dev linux-headers | |
COPY requirements.txt requirements.txt | ํธ์คํธ์ requirements.txt ํ์ผ์ ์ปจํ ์ด๋ ์์ ๋๋ ํ ๋ฆฌ์ธ code ์ ๋ณต์ฌ |
RUN pip install -r requirements.txt | requirements.txt ๋ด๋ถ ์์๋ฅผ ์ฝ์ด pip ์ธ์คํจ์ ์งํ |
EXPOSE 5000 | 5000ํฌํธ๋ฅผ ๊ฐ๋ฐฉ |
COPY . . | ํ์ฌ . ๋๋ ํ ๋ฆฌ๋ฅผ ์ปจํ ์ด๋์ . ๋๋ ํ ๋ฆฌ๋ก ๋ชจ๋ ๋ณต์ฌ |
CMD ["flask","run"] | ๋ณต์ฌํ ์ฝ๋๋ฅผ flask๋ก ์คํํ๋ ๋ช ๋ น์ด |
3๏ธโฃ docker-compose.yml ์์ฑ
docker-compose.yml ์์ฑ
cat > docker-compose.yml
๋ด์ฉ ์์ฑ
version: "3"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"

4๏ธโฃ docker-compose ๋ช ๋ น์ด
์ปดํฌ์ฆ๋ฅผ ์คํ (** ์ปดํฌ์ฆ ํ์ผ๋ช ์ด docker-compose.yml ์๋๋ผ๋ฉด -f ์ต์ ์ ํตํด ํ์ผ ์ด๋ฆ์ ์ ํํ๊ฒ ์ ์ด์ผํจ)
docker compose up


5๏ธโฃ docker-compose ํ์ธ
# ํ์ฌ ์ปดํฌ์ฆํ์ผ๋ก ์ธํด ์คํ๋ ํ๋ก์ธ์ค ๋ชฉ๋ก ์กฐํ
docker compose ps

6๏ธโฃ๊ธฐ์กด docker-compose๋ฅผ ์ค๊ฐ์ ์์ ํ๋ ค๋ฉด
์ผ๋จ ๊ธฐ์กด ์ปจํ ์ด๋๋ค์ ์ค์งํ๊ณ ์ญ์
docker compose down
๋น์ฅฌ์ผ ์๋ํฐ๋ก compose ํ์ผ ์์
์ปจํ ์ด๋์ ์๋ ํ์ผ์ ํธ์คํธ๋ ๋ณผ๋ฅจ๋ง์ดํธํด์ ํธ์คํธ์์ ์์ ํด๋ณด๊ธฐ ์ํ ๋ณผ๋ฅจ ๋ง์ดํธ
version: "3"
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
environment:
FLASK_ENV: development
redis:
image: "redis:alpine"

์์ ํ๊ณ ๋ค์ up

๊ทธ๋ฆฌ๊ณ ํธ์คํธ์ ๋๋ ํ ๋ฆฌ์ ๋ง์ดํธํ์ผ๋ ํธ์คํธ์ app.py๋ฅผ ๋ฐ๋ก ์์ ํด์ ์ ์ฉ๋๋ ์ง๋ฅผ ํ์ธํด๋ณด์




7๏ธโฃ ๊ฐ์๋ฅผ ์กฐ์ ํด๋ณด์

# ํ์ฌ scale ๋ช
๋ น์ด๋ ๋นํ์ฑํ ๋์๊ณ
docker compose scale redis=3
# up์ ์ต์
์ผ๋ก ์ฌ์ฉํด์ผํ๋ค
docker compose up --scale redis=3

์ด ๋ช ๋ น์ด๋ฅผ ํตํด ๊ทธ๋๊ทธ๋ ์ฌ์ฉ์์ ์์ ๋ฐ๋ผ scale out, scale in์ ํด์ค ์ ์๋ค.
๐ข ๋ค๋ง, ํฌํธํฌ์๋ฉ๋ ๊ฒฝ์ฐ๋ ์ ํด์ง ํฌํธ๋ฅผ ์ฐ๊ธฐ ๋๋ฌธ์ ํ์ฅ์ด ๋ถ๊ฐ๋ฅ, ๋ค๋ฅธ ํฌํธ ์ฌ์ฉํด์ผํจ
8๏ธโฃ ์ถ๊ฐ ๋ช ๋ น์ด
- run์ ์ด์ฉํ๋ฉด ์๋ธ ๋ช ๋ น์ด ์ ๋ฌ ๊ฐ๋ฅ
์๋๋ web ์ปจํ ์ด๋์ env ๋ช ๋ น์ด๋ก ํ๊ฒฝ๋ณ์ ๋ณด์ฌ๋ฌ๋ผ๋ ์๋ฏธ
# docker compose run [OPTIONS] SERVICE [COMMAND] [ARGS...]
docker compose run web env

- ํด๋น ์ปจํ ์ด๋ ๋ก๊ทธ ๋ณด๊ธฐ
docker compose logs web

9๏ธโฃ ์ข ๋ฃ ๋ฐ ์ญ์
# ์ข
๋ฃ
docker compose stop
# ์ข
๋ฃ ๋ฐ ์ญ์
docker compose down
# --volumes ์ต์
๊น์ง ๋ฃ์ผ๋ฉด ์ปดํฌ์ฆ๋ก ์ธํด ์์ฑ๋ ๋ณผ๋ฅจ๊น์ง๋ ๋ชจ๋ ์ญ์
docker compose down --volumes
๐ ๋ ๋ค๋ฅธ ์์
์๋ํ๋ ์ค๋ mysql์ด๋ ์ฐ๋ํด๋ณด๋ ์์
WordPress samples
docs.docker.com
1) ์๋น์ค ๋๋ ํ ๋ฆฌ ์์ฑ

2) docker-compose.yml ์์ฑ

3) compose ์คํ ํ์ธ


'DevOps > Docker' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐ๋ฐฐ๋ ๋์ปค ์๋ฆฌ์ฆ 9] ์ปจํ ์ด๋๊ฐ ํต์ (๋คํธ์ํฌ) (0) | 2023.04.23 |
---|---|
๋ฐ๋ฐฐ๋ ๋์ปค ์๋ฆฌ์ฆ 8] Docker Container Storage (0) | 2023.04.21 |
๋ฐ๋ฐฐ๋ ๋์ปค ์๋ฆฌ์ฆ 7] ์ปจํ ์ด๋ ๊ด๋ฆฌ (0) | 2023.04.15 |
๋ฐ๋ฐฐ๋ ๋์ปค ์๋ฆฌ์ฆ 6] ์ปจํ ์ด๋ ์ฌ์ฉํ๊ธฐ (0) | 2023.04.14 |
๋ฐ๋ฐฐ๋ ๋์ปค ์๋ฆฌ์ฆ 5] ์ปจํ ์ด๋ ๋ณด๊ด์ฐฝ๊ณ Registry (0) | 2023.04.13 |