:alert:
๐ณ docker compose ์ค์น
linux์ ๊ฒฝ์ฐ docker compose๋ฅผ ๋ณ๋๋ก ์ค์นํด์ค์ผ ํ๋ค.
https://docs.docker.com/compose/install/
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker for mac/windows๋ก ์ค์นํ ๊ฒฝ์ฐ docker๋ ์ด๋ฏธ docker-compose๊ฐ ์ค์น๋์ด ์๋ค.
์ค์น๊ฐ ์ ๋๋ก ๋์๋์ง ํ์ธํ๊ธฐ ์ํด version ์ ๋ณด๋ฅผ ์ฐ์ด๋ณด์.
docker-compose version
๐ณ docker-compose ์ ์? (= ๊ทธ๋ฅ ๋์ปค ์ฐ๋ฉด ๋ญ๊ฐ ๋ถํธํจ?)
์์ฝํ์๋ฉด, ๋์ปค ๋ช ๋ น์ด๋ฅผ ํ์ผ๋ก ๊ด๋ฆฌํด์ ๋ณต์กํ ๋์ปค ์ปจํ ์ด๋ ๋ฐ ๋์ปค ๋คํธ์ํฌ๋ฅผ ๊ตฌ์ฑํ๊ธฐ์ ์ฉ์ดํ๋ค๋ ๊ฒ์ด๋ค!
1. docker ๋ณด๋ค ๊ฐ๊ฒฐํจ
๊ฐ๋จํ html์ ๋ง๋ค๊ณ nginx๋ก ์ฐ๊ฒฐํ๋ ค๋ฉด ์๋์ ๊ฐ์ด docker ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด์ผ ํ๋ค.
์ปจํ ์ด๋ 80 ํฌํธ๋ฅผ ๋ก์ปฌ 8080 ํฌํธ์ ๋งคํํ๊ณ , ์ข ๋ฃ์ ์ปจํ ์ด๋๋ฅผ ์ญ์ ํ๊ธฐ ์ํด --rm ์ต์ ์ ์ฃผ์๊ณ
๋ก์ปฌ์ ํน์ ๊ฒฝ๋ก์ ํด๋ ํน์ ํ์ผ์ ์ฐธ๊ณ ํ๋๋ก volume ์ต์ ์ ํตํด ํ์ฌ ๊ฒฝ๋ก $(pwd)๋ฅผ nginx ์ปจํ ์ด๋ ๋ด์ /usr/share/nginx/html์ ๋งคํํด์ฃผ์.
์ด ๋ชจ๋ ๊ณผ์ ์ ์ดํดํ ์๋ ์์ง๋ง ์ด์ง verboseํ๋ค. compose๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฐ ๋ฒ๊ฑฐ๋ก์ด cli๋ฅผ ์์ฑํ์ง ์๊ณ ,
docker-compose.yml์ ํ์ฉํ ์ ์๋ค.
docker run -it -p 8080:80 --rm -v $(pwd):/usr/share/nginx/html/ nginx
2. ์ปจํ ์ด๋ ๊ฐ ์ฐ๊ฒฐ์ด ์ฌ์์ง๋ค.
์๋๋ postgres์ django-sample์ด๋ ์ปจํ ์ด๋๋ฅผ ์ฐ๊ฒฐํ ๊ฒ์ด๋ค.
--link ์ต์ ์ ์ฃผ์ด์ django-sample ์ปจํ ์ด๋์๊ฒ db๋ผ๋ ์ด๋ฆ์ผ๋ก postgres ์ปจํ ์ด๋์ ์กด์ฌ๋ฅผ ์๋ฆฐ ๊ฒ์ด๋ค.
{์ฐ๊ฒฐํ ์ปจํ ์ด๋ ์ด๋ฆ}:{ํด๋น ์ปจํ ์ด๋์์ ์ฐธ๊ณ ํ ์ด๋ฆ}
์ญ์๋ verboseํ๋ค.
docker run --rm -d --name postgres \
-e POSTGRES_DB=djangosample \
-e POSTGRES_USER=sampleuser \
-e POSTGRES_PASSWORD=samplesecret \
postgres
docker run -d --rm \
-p 8000:8000 \
-e DJANGO_DB_HOST=db \
--link postgres:db \
django-sample
3. ํน์ ์ปจํ ์ด๋๋ผ๋ฆฌ๋ง ํต์ ํ ์ ์๋ ๊ฐ์ ๋คํธ์ํฌ ํ๊ฒฝ์ ๊ด๋ฆฌํ๋๋ฐ ๋๋ฌด ๋ช ๋ น์ด๊ฐ ๊ธธ์ด์ง๋ค.
--network ์ต์ ์ ํตํด์ ํน์ ๋คํธ์ํธ ๋ด์๋ง ์กด์ฌํ๋ ์ปจํ ์ด๋๋ผ๋ฆฌ๋ง ํต์ ํ ์ ์๋๋ก ๋ง๋ค์ด์ฃผ์๋ค.
django2์ ๊ฒฝ์ฐ ํด๋น ๋คํธ์ํฌ ๋ด์ ์กด์ฌํ์ง ์๋ ์ปจํ ์ด๋์ด๊ธฐ ๋๋ฌธ์ --link๋ก ์ฐ๊ฒฐํด๋ ํต์ ํ ์ ์๊ฒ ๋๋ค.
๋๋ฌด verboseํ๋ค...
// network ์์ฑ
docker network create --driver bridge web-service
// ํด๋น network๋ฅผ ํ์ฉํ์ฌ ์ปจํ
์ด๋ ์คํ
docker run --rm -d --name postgres \
--network web-service \
-e POSTGRES_DB=djangosample \
-e POSTGRES_USER=sampleuser \
-e POSTGRES_PASSWORD=samplesecret \
postgres
docker run -d --rm --name django1 \
--network web-service \
-p 8000:8000 \
-e DJANGO_DB_HOST=db \
--link postgres:db \
django-sample
docker run -d --rm --name django2 \
-p 8001:8000 \
-e DJANGO_DB_HOST=db \
--link postgres:db \
django-sample
๐ณ docker-compose.yml
docker-compose๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํ yml ํ์ผ์ ๋ง๋ค์.
์์ ๊ตฌ์ฑํ ๋์ปค ๊ตฌ์ฑ์ ์๋์ ๊ฐ์ด ํ์ผ ํํ๋ก ์์ฑํ์ฌ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
version: '3'
volumes:
postgres_data: {}
services:
db:
image: postgres
volumes:
- postgres_data:/var/lib/postgres/data
environment:
- POSTGRES_DB=djangosample
- POSTGRES_USER=sampleuser
- POSTGRES_PASSWORD=samplesecret
django:
build:
context: .
dockerfile: ./compose/django/Dockerfile-dev
volumes:
- ./:/app/
command: ["./manage.py", "runserver", "0:8000"]
environment:
- DJANGO_DB_HOST=db
depends_on:
- db
restart: always
ports:
- 8000:8000
์คํํ๋ ๋ฐฉ๋ฒ์ ํด๋น docker-compose.yml์ด ์๋ ํ์ผ์ ๊ฐ์ docker-compose up ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด์ฃผ๋ฉด ๋๋ค.
๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํํ๊ธฐ ์ํด -d ์ต์ ๋ ์ค์๋ค.
docker-compose up -d
์คํ ์ค์ธ ์ปจํ ์ด๋๋ฅผ ๋ด๋ฆฌ๊ณ ์ถ๋ค๋ฉด downํฉ์๋ค.
docker-compose down
๐ณ docker-compose ๋ช ๋ น์ด
docker-compose up -d // ๋์ปค ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ
docker-compose up --force-recreate // ๋์ปค ์ปจํ
์ด๋ ์๋ก ๋ง๋ค๊ธฐ
docker-compose up --build // ๋์ปค ์ด๋ฏธ์ง ๋น๋ ํ compose up
1. docker-compose up ์์ --build ํ๋๊ทธ ์ฌ๋ถ์ ์ฐจ์ด๋,
--build๊ฐ ๋ถ์ผ๋ฉด ์บ์ฑ๋ ์ด๋ฏธ์ง๋ฅผ ์ฒดํฌํ์ง ์๊ณ ๋ฌด์กฐ๊ฑด ๋น๋๋ฅผ ํ๊ณ ์์ํ๋ผ๋ ์๋ฏธ์ ๋๋ค.
๋ถ์ด์ง ์๊ณ ์จ๋ ์ด๋ฏธ์ง์ ์์ผ๋ฉด ๋น๋๋ถํฐ ์์ํฉ๋๋ค.
์์ค ์์ ์ด ์ด๋ฃจ์ด์ก์ ๋๋ ๋ค์ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํด์ผ ํ๋ฏ๋ก ๊ฐ๊ธ์ --build๋ฅผ ๋ถ์ฌ์ compose-up์ ํ๋๋กํฉ์๋ค.
2. -d (detached) ๋ชจ๋๋ฅผ ๋ถ์ด๋ฉด ๋ฐฑ๊ทธ๋ผ์ด๋๋ผ์ ๋น์ฐํ ์ฑ ๋ด์ ์ถ๋ ฅ์ด ํฐ๋ฏธ๋์ ์ฐํ์ง ์์ต๋๋ค.
docker-compose start // ์ ์งํ ์ปจํ
์ด๋๋ฅผ ์ฌ๊ฐ
docker-compose start mysql // mysql ์ปจํ
์ด๋๋ง ์ฌ๊ฐ
docker-compose restart // ์ด๋ฏธ ์คํ ์ค์ธ ์ปจํ
์ด๋ ๋ค์ ์์
docker-compose restart redis // ์ด๋ฏธ ์คํ์ค์ธ redis ์ฌ์์
docker-compose stop // gracefully stopํจ.
docker-compose stop wordpress
docker-compose down // stop ๋ฟ๋ง ์๋๋ผ ์ปจํ
์ด๋ ์ญ์ ๊น์ง
docker-compose logs
docker-compose logs -f // ๋ก๊ทธ watching
docker-compose ps // ์ปจํ
์ด๋ ๋ชฉ๋ก
docker-compose exec [์ปจํ
์ด๋] [๋ช
๋ น์ด]
docker-compose exec wordpress bash // wordpress์์ bash ๋ช
๋ น์ด ์คํ
docker-compose build // build ๋ถ๋ถ์ ์ ์๋ ๋๋ก ๋น๋
docker-compose build wordpress // wordpess ์ปจํ
์ด๋๋ง ๋น๋
docker-compose run [service] [command] // ์ด๋ฏธ docker-compose ๊ฐ๋ ์ค์ธ ๊ฒ๊ณผ ๋ณ๊ฐ๋ก ํ๋ ๋ ์ฌ๋ฆด ๋
docker-compose run nginx bash
๐ณ docker-compose.yml ๋ฌธ๋ฒ
- version
docker-compose.yml ํ์ผ์ ๋ช ์ธ ๋ฒ์ . ๋ฒ์ ์ ๋ฐ๋ผ ๋์ปค ์์ง ๋ฒ์ ๋ ๋ค๋ฅด๋ค.
๋ญ ์ธ์ง๋ docs.docker.com/compose/compose-file/ ์ฐธ๊ณ .
version: '2'
- services
์ปจํ ์ด๋์ ์ฌ์ฉํ ์ด๋ฏธ์ง ์ด๋ฆ๊ณผ ํ๊ทธ(๋ฒ์ ) ํ๊ทธ๋ฅผ ์๋ตํ๋ฉด ์ต์ ๋ฒ์ ์ ์ค์นํฉ๋๋ค.
์ด๋ฏธ์ง๊ฐ ์์ผ๋ฉด ์๋์ผ๋ก pullํ๊ธฐ ๋๋ฌธ์ ๊ตณ์ด ์์์ ์ผ๋ก ๋ก์ปฌ์ ์ค์นํ ํ์ ์์ต๋๋ค.
๋, ports์ ์์ด์ ์ผ๋ฐ dockerfile์ ๊ตฌ์ฑํ ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ํธ์คํธ ํฌํธ๋ก ์ ๊ทผํด์ผ ๋ด์ฉ์ ๋ณผ ์ ์๋ค.
services:
django:
image: ...
ports:
- "8000:80" // ํธ์คํธ ํฌํธ:์ปจํ
์ด๋ ํฌํธ
postgres:
image: ....
restart
์ฌ์์ ์ ์ฑ . pm2 ๋์ ์ฌ์ฉํ๊ธฐ๋ ํ๊ธฐ๋ํ๊ณ , ๋์ปค ์ปจํ ์ด๋๊ฐ ์คํ๋๋ ์๊ฐ ์ ๊ทผํ์ฌ ์ ๊ทผ ์๊ฐ์ ๋ฐ๋ฅธ ์คํจ๋ฅผ ๋ฐฉ์งํ๊ณ , ์๋์ผ๋ก ์ฌ์์ํ๊ฒ๋ ํด์ฃผ๊ธฐ๋ ํฉ๋๋ค.
์ฌ๋์ ๋ ์ ์ฉํ ๋ ์์ ๋๋ค.
services:
django:
image: ...
restart: always // "no", always, on-failure, unless-stopped
postgres:
image: ....
build
์ด๋ฏธ์ง๋ฅผ ์์ฒด ๋น๋ ํ ์ฌ์ฉํ ๊ฒฝ์ฐ build๋ฅผ ์ด์ฉํ ๊ฒฝ์ฐ์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฏธ์ง ๋น๋๋ฅผ ์ํ dockerfile์ด ํ์ํ๋๊น ์ง์ ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
์์ฒด ๋น๋๋๊น image ์์ฑ ๋์ ์ฌ์ฉํฉ๋๋ค.
docker-compose build๋ฅผ ํตํด์ ๋น๋ํ ํ docker-compose upํด์ฃผ๋ฉด ๋๋ค.
services:
django:
build:
context: .
dockerfile: ./compose/django/Dockerfile-dev
postgres:
image: ....
environment
์ฌ์ฉํ๊ณ ์ ํ๋ ์ด๋ฏธ์ง์ ํ๊ฒฝ ๋ณ์.
์ฌ๊ธฐ์, dockerfile์ ํ๊ฒฝ๋ณ์์ docker-compose.yml์ ํ๊ฒฝ๋ณ์๊ฐ ์ค๋ณต๋์ด์ ์ฌ๋ผ๊ฐ๋ฉด ์ด๋ป๊ฒ ๋๋๋?๋ ์๋ฌธ์ด ์๊น๋๋ค.
์ฐ์ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ฆ, docker.compose.yml์ด ๋ฎ์ด์ฐ๊ฒ ๋ฉ๋๋ค.
1. docker-compose [run / exec] -e key:value
2. docker-compose.yml์ environment
3. Dockerfile์ ENV
services:
db:
image: mysql:5.7 // ์ฌ์ฉํ ์ด๋ฏธ์ง
volumes:
- ./mysql:/var/lib/mysql // ๋ณผ๋ฅจ(์ปจํ
์ด๋๊ฐ ์ฃฝ์ด๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ง)
restart: always // ์ปจํ
์ด๋๊ฐ ์ฃฝ์ง ์๊ณ ๊ณ์
environment: // ํ๊ฒฝ๋ณ์
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
volumes
services:
nginx:
image: nginx
ports:
- 8080:80
volumes:
- ./:/usr/share/nginx/html
link:
- mysql:db
link (legacy)
docker cli ์ฌ์ฉํ ๋ --link์ ๋์ผํ๋ค. {์ฐ๊ฒฐํ ์ปจํ ์ด๋ ์ด๋ฆ}:{ํด๋น ์ปจํ ์ด๋์์ ์ฐธ๊ณ ํ ์ด๋ฆ}
๊ทธ๋ฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก docker-compose ๋ด๋ถ์์ ๋ชจ๋ ์ปจํฐ๋ค์ด๋๊ฐ ์ํตํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ๋์ง ์์.
services:
nginx:
image: nginx
ports:
- 8080:80
link:
- mysql:db
depends_on
์์กด์ฑ ๋ช ์๋ค. ์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ด ์จ ์๋ค๋ฉด, nginx๋ mysql์ ์์กดํ๊ณ ์์ผ๋ฏ๋ก mysql ์ด๋ฏธ์ง๊ฐ ๋จผ์ ์คํ๋ ํ์ ๊ทธ ๋ค์์ nginx ์ด๋ฏธ์ง๊ฐ ์คํ๋๋ค.
services:
mysql:
image: mysql
...
nginx:
image: nginx
ports:
- 8080:80
depends_on:
- mysql
๋ค์ํ docker-compose.yml ์์ฑ ์์๋ค
1. ๊ฐ๋จํ Nginx ์ฌ๋ฆฌ๊ธฐ
docker run -it -p 8080:80 -v $(pwd):/usr/share/nginx/html nginx๋ก ์คํํ๋ ๊ฒ์ docker-compose.yml๋ก ๋ง๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑ๋ ์ ์๋ค. cli ํ๊ฒฝ์ด ์๋๋๊น $(pwd)๊ผด๋ก ์ฌ์ฉ๋ชปํ๊ณ , ์ง์ ๊ฒฝ๋ก๋ฅผ ์ค ๊ฒ๋ง ๋ค๋ฅด๋ค.
version: '3'
services:
nginx:
image: nginx
ports:
- 8080:80
volumes:
- ./:/usr/share/nginx/html
2. ์๋ํ๋ ์ค
mysql ์คํํ๋ฉด์ ์ฝ์ด๋ค์ด๋ ํ๊ฒฝ ๋ณ์๋ค์ด ์์ผ๋ ์๋์ฒ๋ผ ์ค์ ํด์ฃผ๊ณ ,
db๋ฅผ ๋จผ์ ์ผ๋๋ก depends_on์ wordpress์ ์ธํ ํด์ฃผ๋ฉด ๋๋ค.
version: '3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: rootpwd
MYSQL_DATABASE: databasename
MYSQL_USER: user
MYSQL_PASSWORD: userpwd
wordpress:
image: wordpress
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wp
WORDPRESS_DB_PASSWORD: wp
WORDPRESS_DB_NAME: wp
depends_on:
- db
volumes:
db_data: {}
3. flask + redis ์กฐํฉ
dockerfile๋ก ๋น๋ํ ํ์ compose๋ก ์ฌ๋ ธ์ต๋๋ค.
docker-compose up -d --build
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
COPY . .
CMD ["flask", "run"]
version: '3'
services:
redis:
image: redis
ports:
- 6379:6379
restart: always
flask:
image: whateveryouwant
build:
context: .
dockerfile: .
ports:
- 5000:5000
depends_on:
- redis
restart: always
'Ops, Infra, etc > ๐ Docker (+Swarm)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
docker๋ก ๊ฐ๋ฐ์ฉ mysql ์ปจํ ์ด๋ ์ฌ๋ฆฐ ํ ์๊ฒฉ์ ์ํ๊ธฐ (0) | 2021.05.06 |
---|---|
docker ๊ธฐ๋ฐ nginx~react ๊ฐ๋ฐ ๋ฐ ๋ฐฐํฌ (0) | 2021.03.26 |
docker compose์ ๊ฐ๋จํ compose ๋ฌธ๋ฒ (1) | 2021.03.24 |
node.js ๊ธฐ๋ฐ ์ฑ์ docker ํ๊ฒฝ์์ ์คํํด๋ณด์ (0) | 2021.03.23 |
Dockerfile์ ์ด์ฉํ Docker ์ด๋ฏธ์ง ์์ฑํ๊ธฐ (0) | 2020.09.03 |
docker ๊ธฐ๋ณธ ๋ช ๋ น์ด (ps, stop, start, rm, logs, exec, images, network) (0) | 2020.09.03 |
๊ท์ฌ์ด ๋์ปค ์์ด์ฝ์์ ๋นต ํฐ์ง๊ณ ๊ฐ์ ใ ใ