๋ฐ์ํ
๐ก ๋ณธ ๋ฌธ์๋ 'docker compose'์ ๋ํด ์ ๋ฆฌํด๋์ ๊ธ์ ๋๋ค.
๊ฐ๋จํ๊ฒ 'docker compose'๊ฐ ๋ฌด์์ด๋ฉฐ, 'docker-compose.yml ํ์ผ์ ์์ฑํ๋ ๋ฐฉ๋ฒ' ๋ฐ '์ค์ ์ฌ๋ฌ ์ปจํ ์ด๋๋ฅผ ์ด์ฉํ ์๋น์ค ๊ตฌ๋'๊น์ง ๋ค๋ฃจ๊ณ ์์ผ๋ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค.
1. docker compose ์ ๋ํ์ฌ
1.1 docker-compose๋? ๋ฉํฐ ์ปจํ ์ด๋๋ฅผ ๊ตฌ๋ํ์!
๊ธฐ์กด์ Docker ์ปจํ ์ด๋ ๊ฐ์ ์๋ก ์ญํ ์ด ๋ถ๋ฆฌ๋์ด ํ๋์ ์๋น์ค๋ฅผ ์ํด์ Docker ์ปจํ ์ด๋๋ฅผ ๋ช ๊ฐ ์์ฑํ๋ ค ํ๋ค๋ฉด ์๋์ ๊ฐ์ด ์ ๋ ฅํด์ผ ํฉ๋๋ค.
$ docker run elasticsearch
$ docker run kibana
$ docker run mysql
๊ทธ๋ฆฌ๊ณ ์ปจํ
์ด๋๊ฐ ์๋ก ์ฐ๋์ด ๋์ด์ผ ํ๋ค๋ฉด ์ปจํ
์ด๋ ์ฌ์ด์ ๋งํฌ ์ค์ ๋ ์ ํด์ผ ํ๊ธฐ์, ์ด๋ฐ ๋ถํธํจ์ ์ผ๋ถ ํด์ํ ์ ์๋ ํด์ด Docker Compose ๋ผ๋ ํด์
๋๋ค. ์ด ํด์ docker build๋ฅผ ํตํ ์ด๋ฏธ์ง ์์ฑ์ ๋น๋กฏํ์ฌ ์ปจํ
์ด๋ ์ฌ์ด์ ์ค์ ๊ณผ docker container run ์์ ์ฌ์ฉํ๋ ๋ณผ๋ฅจ, ๋คํธ์ํฌ, ํฌํธ ์ ๋ณด๋ฅผ docker-compose.yml ๋ผ๋ configuration ํ์ผ์ ์ค์ ํ์ฌ ๋ฉํฐ ์ปจํ
์ด๋๋ฅผ ๊ตฌ๋์ํฌ ์ ์์ต๋๋ค.
services:
elasticsearch:
image: "elasticsearch"
kibana:
image: "kibana"
rdb:
image: "mysql"
- Docker Compose๊ฐ Dockerfile๋ก ์ ์ํ Costom image๋ฅผ ๋น๋ ์์ฒด๋ ๊ฐ๋ฅํฉ๋๋ค๋ง Dockerfile์ ๋์ฒดํ ์๋ ์์ต๋๋ค.
- Docker Compose๋ ๋จ์ผ ํธ์คํธ ๋จธ์ ์ ์ฌ๋ฌ ์ปจํ ์ด๋๋ฅผ ์ ์ดํ๋๋ฐ ์ ํฉํ๋ฉฐ, ์ฌ๋ฌ ํธ์คํธ ๋จธ์ ์ ํฉ์ด์ ธ์๋ ์ปจํ ์ด๋๋ค์ ์ ์ดํ๋๋ฐ๋ ์ ํฉํ์ง ์์ต๋๋ค. ์ด๋ฐ ๊ด๋ฆฌ๋ฅผ ์ํด์๋ Docker Swarm, kubernetes์ ๊ฐ์ ์ปจํ ์ด๋ ์ค์ผ์คํธ๋ ์ด์ ํด์ด ํ์ํฉ๋๋ค.
2. docker compose ์์ฑํ๊ธฐ
2.1 docker compose ์์ฑํ๊ธฐ: YAML ํ์ผ์ ๋ํด ์์๋ณด์ (feat. docker-compose.yml)
Docker Compose ์์ ์ฌ์ฉํ๋ ํ์ผ์ docker-compose.yml๋ก YAML ํ์์ ํ์ผ์
๋๋ค.
- YAML ๋ฌธ๋ฒ: http://serious-code.net/doku/doku.php?id=kb:yamltutorial
- YAML ๋ฌธ๋ฒ ๊ฒ์ฆ: http://yaml-online-parser.appspot.com/
2.2 docker compose ์์ฑํ๊ธฐ: ์ฃผ์ ์ง์์ ์๊ฐ
docker-compose.yml ํ์ผ์๋ ๋ฐ๋์ image ๋ build ์ง์์๊ฐ ์์ด์ผ ํฉ๋๋ค. ์ฃผ์ ํค๋ก๋ ์๋์ ๊ฐ์ด ์์ต๋๋ค.
image
|
Docker Image ๋ฅผ ์
๋ ฅ
|
build
|
Dockerfile ์ด ์๋ ๋๋ ํ ๋ฆฌ์ ๊ฒฝ๋ก๋ฅผ ์
๋ ฅ
|
command
|
Dockerfile ์ด๋ image ์ ์์ command ๋ฅผ ์ค๋ฒ๋ผ์ด๋
|
links
|
์ปจํ
์ด๋๋ฅผ ๋ค๋ฅธ ์๋น์ค๋ค๊ณผ ํต์ ๊ฐ๋ฅํ๊ฒ ์ฐ๊ฒฐํ๊ณ ์ข
์์ฑ์ ์ค์
|
external_links
|
์ปจํ
์ด๋๋ฅผ compose ํ์ผ ์ธ๋ถ์ ์๋ ์๋น์ค์ ์ฐ๊ฒฐ
|
extra_hosts
|
์ปจํ
์ด๋์ /etc/hosts ์ ์ธ๋ถ ํธ์คํธ์ ๋ณด๋ฅผ ์ถ๊ฐ
|
ports
|
์ปจํ
์ด๋์์ ํธ์คํธ ์ ํต์ ํ ํฌํธ๋ฅผ ์ง์
|
expose
|
ํธ์คํธ์๋ ๋
ธ์ถํ์ง ์๊ณ ์ฐ๊ฒฐ๋ ์๋น์ค๋ผ๋ฆฌ๋ง ์ ๊ทผ ๊ฐ๋ฅํ ํฌํธ ์
๋ ฅ
|
volumes
|
ํ์ฌ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ณผ๋ฅจ์ผ๋ก ๋ง์ดํธํ ๋ ์ปจํ
์ด๋์์ ์ฌ์ฉํ ๊ฒฝ๋ก๋ฅผ ์
๋ ฅ
|
volumes_from
|
๋ค๋ฅธ ์๋น์ค๋ ์ปจํ
์ด๋์ ์ ์ฒด ๋ณผ๋ฅจ์ ๋ง์ดํธ
|
depends_on
|
์๋น์ค ๊ฐ์ ์ข
์์ฑ์ ์ค์
|
deploy
|
๋์ปค ์ค์์์ ์ฌ์ฉ๋๋ ์ฌ๋ฌ ์ต์
๋ค์ ์ ์
|
secrets
|
ํจ์ค์๋ ๋ฑ์ secret ์ ๋ณด๋ฅผ ์ ์ฅ์ ์ฌ์ฉ
|
2.3 docker compose ์์ฑํ๊ธฐ: ์ง์์ ์ฉ๋ก ๋ฐ ์์ธํ ์ค๋ช
version
๋์ปค ์ปดํฌ์ฆ ํ์ผ ๊ฐ์ฅ ์์ version์ ๋์ปค ์ปดํฌ์ฆ ์คํ์ ๋ํ ๋ฒ์ ์ผ๋ก ์ด ๋ฒ์ ์ ๋ฐ๋ผ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ๋ค์ด ๋ค๋ฅผ ์ ์๊ณ , ๊ฐ์ ๊ธฐ๋ฅ์ด๋ผ๋ ์ ์ํ๋ ๋ฐฉ๋ฒ, ์ฆ ๋ฌธ๋ฒ์ ์ฐจ์ด๊ฐ ์์ ์ ์๊ธฐ ๋๋ฌธ์ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด๊ฐ๋ฉฐ ์ฌ์ฉํ๋ ๋ฒ์ ์ ๋ง๋ ํ์์ผ๋ก ์์ฑ์ ํด์ผ ํฉ๋๋ค.
- Compose File Version ๊ฐ์ด๋๋ผ์ธ ๋ฌธ์๋ฅผ ํตํด ํ์ฌ ์ฌ์ฉ๊ฐ๋ฅํ ๋ฒ์ , ๊ฐ ๋ฒ์ ์ ๋ฐ๋ฅธ ์ฌ์ฉ๊ฐ๋ฅํ ๊ธฐ๋ฅ ๋ฐ ๊ฐ์ด๋๋ผ์ธ์ ํ์ธํ ์ ์์ต๋๋ค.
version: "1.x"
- ๊ธฐ๋ณธ ์ปจํ ์ด๋ ๋คํธ์ํฌ๋ก ๊ธฐ๋ณธ ๋ธ๋ฆฌ์ง ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ
- ๋ง์ฝ์ ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ network ๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด ์ด๋ฅผ ํํํ๋ ์ง์์๊ฐ ์๊ณ
- ์ปจํ ์ด๋๊ฐ ์ข ์์ฑ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ง์์๋ ์์ต๋๋ค.
version: "2.x"
- ๋ค์ํ ๋คํธ์ํฌ๋ฅผ ์ ์ํ ์ ์๊ณ ์ปจํ ์ด๋ ์ข ์์ฑ๋ ๊ด๋ฆฌํ ์ ์๋๋ก ์ง์์๋ฅผ ์ถ๊ฐํ์ผ๋ฉฐ,
- version ์ง์์๋ฅผ ์ถ๊ฐํ๊ณ services ๋ผ๋ ์ง์์ ์๋ ์๋น์ค๋ฅผ ๊ธฐ์ ํ๋๋ก ๋ฐ๋์์ต๋๋ค.
version: "3.x"
- Docker Swarm ์ ์ง์ํ๋ฉฐ,
- V2 ์์ ์ง์ํ๋ ๋ช๋ช ์ง์์๊ฐ ๋น ์ง๊ฑฐ๋ ๋ฐ๋์์ต๋๋ค.
services
๊ด๋ จ์๋ ์ปจํ
์ด๋์ ๋ฌถ์ ๊ฒฝ์ฐ, services ํค๋ฅผ ์ฌ์ฉํฉ๋๋ค (๋จ์ผ ์ปจํ
์ด๋๋ฅผ ๋์ธ๋์๋ ์ฌ์ฉํด๋ ๋ฌด๋ฐฉํฉ๋๋ค.).
์๋ฅผ ๋ค์ด ์น ์๋น์ค๋ฅผ ์ํด FrontEnd, Application, DB ๊ฐ์ด 3๊ฐ์ง ์ปจํ
์ด๋๊ฐ ํ์ํ๋ค๋ฉด, ์ด๋ฅผ services ํ์์ ์ ์ํด ์ค๋๋ค.
services:
FrontEnd:
Application:
DB:
image
Docker ์ปจํ
์ด๋์ ๊ธฐ๋ฐ์ด ๋๋ ๋ฒ ์ด์ค ์ด๋ฏธ์ง๋ฅผ ์ง์ ํ๊ธฐ ์ํ ํค๋ก, ๋ก์ปฌ์ ์ด๋ฏธ์ง๊ฐ ์์ผ๋ฉด ๊ทธ ์ด๋ฏธ์ง๋ฅผ ์๊ฒฉ ์ ์ฅ์์์ Pull ํด์ ๊ฐ์ ธ์ต๋๋ค.
webserver:
image: docker/dockersample:1.0
build
build ํค์ Dockerfile ์ด ์๋ ๋๋ ํ ๋ฆฌ์ ๊ฒฝ๋ก๋ฅผ ์
๋ ฅํ ๊ฒฝ์ฐ, ํด๋น ๋๋ ํ ๋ฆฌ ๋ด์ Dockerfile์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํฉ๋๋ค.
# docker-compose.yml ํ์ผ์ ์ฌ์ฉ์
services:
webapp:
build: ./dir
# docker-compose.yml ๋์ ๋ค๋ฅธ ๋์ฒด ํ์ผ ์ฌ์ฉ์
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
# ๋์ปค ํ์ผ ๋ด๋ถ์ ํ๋ผ๋ฏธํฐ๊ฐ ์๋ ๊ฒฝ์ฐ ์ธ์ ์ ๋ฌ ๋ฐฉ๋ฒ
## Dockerfile
...
ARG buildno
RUN echo "Build number: $buildno"
## docker-compose.yaml
services:
webapp:
build:
context: ./dir
args:
- buildno: 1
command
์ปจํ
์ด๋ ๋ด์์ ๋์ํ๋ ์ปค๋งจ๋ ์ง์ ์ ์ฌ์ฉ์ command ํค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋์ปค ํ์ผ ๋ด๋ถ์ ์๋ CMD ๊ฐ ์ด๋ฏธ ์๋ ๊ฒฝ์ฐ ์ด๋ฅผ Override ํฉ๋๋ค.
webserver:
image: ubuntu
command: /bin/bash
entrypoint
์ปจํ
์ด๋ ๋ด์์ ๋์ํ๋ ์ํธ๋ฆฌ ํฌ์ธํธ ์ง์ ์ entrypoint ํค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋์ปค ํ์ผ ๋ด๋ถ์ ์๋ ENTRYPOINT ๊ฐ ์ด๋ฏธ ์๋ ๊ฒฝ์ฐ ์ด๋ฅผ Override ํฉ๋๋ค.
webserver:
image: ubuntu
entrypoint: /code/entrypoint.sh
์๋์ ๊ฐ์ด ๋ช
๋ น์ ์ง์ ์คํํ ์๋ ์์ต๋๋ค.
configuration_generator:
image: java:8-jdk
entrypoint:
- java
- -cp
- zookeeper-vertx-example-0.0.1-fat.jar
- com.lukeolbrish.example.ConfigurationGenerator
links
์ปจํ
์ด๋๋ฅผ ๋ค๋ฅธ ์๋น์ค๋ค๊ณผ ์ฐ๊ฒฐ์ links ํค๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ด ์ปจํ
์ด๋์ /etc/hosts ํ์ผ์ ๊ทธ ๋ด์ฉ์ด ์ถ๊ฐ๋์ด์ ์ปจํ
์ด๋์์ ๋ค๋ฅธ ์ปจํ
์ด๋ ๋ค์ ์ ๊ทผํ ์ ์๊ฒ ๋ฉ๋๋ค.
links:
- db
- db:database
- redis
์์ ๊ฐ์ด ์ค์ ์ ํ๊ฒ ๋๋ฉด /etc/hosts ํ์ผ์ ๋ด์ฉ์ด ์๋์ ๊ฐ์ด ๋ณ๊ฒฝ๋์ด ๋งํฌ๋ ์ปจํ
์ด๋์ ํต์ ํ ์ ์๊ฒ ๋ฉ๋๋ค.
192.168.1.186 db
192.168.1.186 database
192.168.1.187 redis
๋ํ ๋งํฌ๋ depends_on๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋น์ค ๊ฐ์ ์ข
์์ฑ์ ํํํ๋ฏ๋ก ์๋น์ค ์์ ์์๋ฅผ ๊ฒฐ์ ํฉ๋๋ค(์ฆ links ์ ๊ธฐ์ ํ ์๋น์ค๊ฐ ๋จผ์ ์์๋ฉ๋๋ค.).
external_links
links ์ ๋น์ทํ ๋ฐฉ์์ผ๋ก ์ค์ ํ์ง๋ง compose ๋ด๋ถ์ ์ปจํ
์ด๋๊ฐ ์๋๋ผ compose ์ธ๋ถ์ ์๋ ์๋น์ค ํน์ ์ปจํ
์ด๋์ ์ฐ๊ฒฐ์ external_links ํค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
external_links:
- redis
- project_db:mysql
extra_hosts
์ปจํ
์ด๋์ /etc/hosts ์ ์ธ๋ถ ํธ์คํธ์ ๋ณด๋ฅผ ์ถ๊ฐ์ external_hosts ํค๋ฅผ ์ฌ์ฉํ๋ฉฐ, DNS ์ง์ ํ ๋์๋ ์ฌ์ฉํ์ฌ ํน์ ์์ดํผ๋ฅผ ๋๋ฉ์ธ์ผ๋ก ๋งตํํ๊ธฐ๋ ํฉ๋๋ค.
extra_hosts:
- "somehost: 162.168.2.31"
์์ ๊ฐ์ด ์ค์ ์ ํ๊ฒ ๋๋ฉด /etc/hosts ํ์ผ์ ๋ด์ฉ์ด ์๋์ ๊ฐ์ด ๋ณ๊ฒฝ๋ฉ๋๋ค.
162.168.2.31 somehost
๋ฆฌ๋ ์ค์ ๊ฒฝ์ฐ์๋ host.docker.internal์ ๋ค์๊ณผ ๊ฐ์ด extra_hosts์ ์ถ๊ฐํด ์ฃผ์ด์ผ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค!
extra_hosts:
- "host.docker.internal:host-gateway"
volumes
์ปจํ
์ด๋์ ๋ณผ๋ฅจ์ ๋ง์ดํธ(mount) ์ volumes ํค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๋ณผ๋ฅจ์ ready only ์ผ๋ก ๋ง์ดํธ ํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ :ro ๋ฅผ ๋ถ์ (์ค์ ํ์ผ๋ฑ์ ์ ์ฉ)
- ๋ณผ๋ฅจ์ ready write ๋ก ๋ง์ดํธ ํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ :rw ๋ฅผ ๋ถ์
๋ณผ๋ฅจ type ์ค์
- type: volume ์ธ ๊ฒฝ์ฐ, NamedVolume (๊ฒฝ๋ก๋ฅผ ํน์ ์ด๋ฆ์ผ๋ก ์ค์ ) ์ ๋งํ๊ณ
- type: bind ์ธ ๊ฒฝ์ฐ, ์ ์ bind ( source: ํธ์คํธ ๋ณผ๋ฅจ ) ๋ฐ ๋์ bind (source ๋ฅผ ๋น์๋์) ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
version: "3.2"
services:
web:
image: nginx:alpine
volumes:
# Named Volumes
- type: volume
source: mydata
target: /data
volume:
nocopy: true
# Host Volumes
- type: bind
source: ./static
target: /opt/app/static
db:
image: postgres:latest
volumes:
#SHORT SYNTAX
- "/var/run/postgres/postgres.sock:/var/run/postgres/postgres.sock"
- "dbdata:/var/lib/postgresql/data"
# Named Volumes
volumes:
mydata:
dbdata:
environment
์ปจํ
์ด๋ ๋ด์ ํ๊ฒฝ ๋ณ์ ์ง์ ์ environment ํค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
#๋ฐฐ์ด ํ์์ผ๋ก ์ง์
environment:
- HOGE=fuga
- FOO
#hash ํ์์ผ๋ก ์ง์
environment:
HOGE: fuga
FOO:
env_file
ํ๊ฒฝ๋ณ์๋ฅผ ์ ์ํ ํ์ผ์ ํธ์ถํ๋ ํ์ผ์ ์ง์ ์ env_file ํค๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ค์ ํ๊ณ ์ ํ๋ ํ๊ฒฝ ๋ณ์๊ฐ ๋ง์ ๊ฒฝ์ฐ env_file ์ ํ๊ฒฝ ๋ณ์๊ฐ์ ๋ฃ์ด๋๊ณ ์ด๋ฅผ ๊ฐ์ ธ๋ค ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํ์ํ๋ค.
#ํ๊ฒฝ๋ณ์ ํ์ผ ์ฝ๊ธฐ
env_file: .env
#์ฌ๋ฌ ๊ฐ์ ํ๊ฒฝ๋ณ์ ํ์ผ ์ฝ๊ธฐ
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
depends_on
์๋น์ค๊ฐ ๋ช
์์ ์ข
์์ฑ์ ๋ถ์ฌํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ depends_on ํค๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์๋์ ๊ฐ์ด ์ค์ ํ๋ฉด db์ redis ์์์ ์ ์์ web ์ด ๋จผ์ ๊ตฌ๋๋ฉ๋๋ค.
๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ links ๋ก ๋ค๋ฅธ ์ปจํ
์ด๋์ ์ฐ๊ฒฐ ๊ด๊ณ๋ฅผ ์ค์ ํ๋ฉด ์์์ ์ผ๋ก ์ฐ๊ฒฐ์ด ํ์ํ ์ปจํ
์ด๋๋ฅผ ๋จผ์ ๊ตฌ๋์ํต๋๋ค.
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
devices
ํธ์คํธ์ ์ฅ์น๋ฅผ ์ปจํ
์ด๋์์ ์ฌ์ฉํ ์ ์๋๋ก ์ฐ๊ฒฐ์ devices ํค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
devices:
- "/dev/ttyUSB0:/dev/ttyUSB0"
ports
์ปจํ
์ด๋์์ ํธ์คํธ์ ํต์ ํ ํฌํธ๋ฅผ ์ง์ ์ ports ํค๋ฅผ ์ฌ์ฉํ๋ฉฐ ๋ค์์ ํ์์ผ๋ก ์
๋ ฅ๊ฐ๋ฅํฉ๋๋ค.
- <์ปจํ ์ด๋ ํฌํธ>
- <ํธ์คํธ ํฌํธ>:<์ปจํ ์ด๋ ํฌํธ>
- <ํธ์คํธ ํฌํธ>:<์ปจํ ์ด๋ ํฌํธ>/<ํ๋กํ ์ฝ>
# ์ปจํ
์ด๋ ํฌํธ๋ง ์ง์ ํ๋ ๊ฒฝ์ฐ
mysql:
image: mysql:5.7
ports:
- 3306
# ํธ์คํธ ํฌํธ์ ์ปจํ
์ด๋ ํฌํธ๋ฅผ ๋ ๋ค ์ง์ ํ๋ ๊ฒฝ์ฐ
mysql:
image: mysql:5.7
ports:
- 3333:3306
ํธ์คํธ ํฌํธ๋ฅผ ์๋ตํ๊ณ ์ปจํ
์ด๋ ํฌํธ๋ง ์ง์ ํ๋ฉด ํธ์คํธ ํฌํธ๋ ๋๋ค์ผ๋ก ์ง์ ๋๋ฉฐ, ํ๋กํ ์ฝ์ ์ง์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ผ๋ก tcp ํต์ ์ ์ฌ์ฉํฉ๋๋ค.
# ํธ์คํธ ํฌํธ์ ์ปจํ
์ด๋ ํฌํธ๋ฅผ ๋ ๋ค ์ง์ ํ๋ ๊ฒฝ์ฐ
$ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------
mysql_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3333->3306/tcp
# ์ปจํ
์ด๋ ํฌํธ๋ง ์ง์ ํ๋ ๊ฒฝ์ฐ
$ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------
mysql_1 docker-entrypoint.sh mysqld Up 0.0.0.0:32769->3306/tcp
expose
ํธ์คํธ์๋ ๋
ธ์ถํ์ง ์๊ณ ์ฐ๊ฒฐ๋ ์๋น์ค๋ผ๋ฆฌ๋ง ์ ๊ทผ ๊ฐ๋ฅํ ํฌํธ๋ฅผ ์
๋ ฅ์ expose ํค๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์ด๋ dockerfile ์ EXPOSE ์ ๋์ผํฉ๋๋ค.
์ด ํฌํธ๋ ํธ์คํธ์์ ์ ๊ทผ ํ ์ ์๊ณ docker-compose up ์ ์ฐ๊ฒฐํ ํฌํธ๋ฅผ ์ง์ ํ๋ค.
mysql:
image: mysql:5.7
expose:
- 3306/tcp
์๋์ ๊ฐ์ด host ์ชฝ๊ณผ ์ฐ๊ฒฐ ์ ๋ณด๊ฐ ์๋ค.
$ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------
mysql_1 docker-entrypoint.sh mysqld Up 3306/tcp
dns
์ปจํ
์ด๋์์ ์ฌ์ฉํ DNS ์๋ฒ๋ฅผ ์ค์ ํ๋ ค๋ ๊ฒฝ์ฐ dns ํค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
dns:
- 8.8.8.8
- 9.9.9.9
dns-search
์ปจํ
์ด๋์์ ์ฌ์ฉํ DNS ๊ฒ์ ๋๋ฉ์ธ์ ์ค์ ํ๋ ๊ฒฝ์ฐ dns-search ํค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
dns_search:
- dc1.example.com
- dc2.example.com
network-mode
์ปจํ
์ด๋์ ๋คํธ์ํฌ ๋ชจ๋๋ฅผ ์ค์ ํ๋ ๊ฒฝ์ฐ network-mode ํค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
# Docker ๋คํธ์ํฌ ๋ธ๋ฆฌ์ง์ ์ ๋คํธ์ํฌ๋ฅผ ์์ฑ
network_mode: "bridge"
# ์ปจํ
์ด๋ ์์์ ํธ์คํธ์ ๋คํธ์ํฌ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉ
network_mode: "host"
# ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉ์ํจ
network_mode: "none"
# ๋ค๋ฅธ ์๋น์ค์ ๋คํธ์ํฌ๋ฅผ ํจ๊ป ์ฌ์ฉ
network_mode: "service:[service name]"
# ๋ค๋ฅธ ์ปจํ
์ด๋์ ๋คํธ์ํฌ๋ฅผ ํจ๊ป ์ฌ์ฉ
network_mode: "container:[container name/id]"
networks
๋คํธ์ํฌ๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํ ์ต์์ ํค, ์ดํ ์ต์
ํค๋ค์ ์กฐํฉํ์ฌ ๋คํธ์ํฌ๋ฅผ ์ง์ ํด์ผ ํ๋ค.
driver
bridge / overlay / host / none ์ธ ๊ฒฝ์ฐ๋ฅผ ์ง์ ํ๋๋ฐ host ๋ none ์ธ ๊ฒฝ์ฐ๋ network_mode ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ด ๋ ํธํฉ๋๋ค.
version: "3.3"
services:
wordpress:
image: wordpress
ports:
- "8080:80"
networks:
mynet1:
driver: overlay
networks:
mynet1:
์ด์ธ ์ต์
๋ค์ด ๋ง์ด ์์ผ๋ฉฐ, ํ๋จ์ ํ์ด์ง์์ ํ์ธํ ์ ์์ต๋๋ค.
healthcheck
์๋น์ค์ ์ํ๋ฅผ ์ฒดํฌํ๋ ค๋ ๊ฒฝ์ฐ healthcheck ํค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
# ์ปจํ
์ด๋๊ฐ ์์ํ๊ณ 40์ด ํ๋ถํฐ 1๋ถ 30 ์ด๋ง๋ค ์น ์๋ฒ๊ฐ 10์ด ์ด๋ด์
# ๊ธฐ๋ณธ ํ์ด์ง๋ฅผ ์ ๊ณตํ๋ ํ์ธ
# ์คํจ์ 3๋ฒ ์ฌ์๋ ํจ
#
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 40s
secrets
v3.1 ์ด์์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์๋น์ค์ ์ํธํ๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ผ๋ ค๋ ๊ฒฝ์ฐ secrets ํค๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
# psql_user, psql_password ๋ฅผ ์ํธํ
# ํด๋น ๋ฐ์ดํฐ๋ฅผ environment ์์ ์ฌ์ฉํจ
#
version: "3.1"
services:
psql:
image: postgres
secrets:
- psql_user
- psql_password
environment:
POSTGRES_PASSWORD_FILE: /run/secrets/psql_password
POSTGRES_USER_FILE: /run/secrets/psql_user
secrets:
psql_user:
file: ./psql_user.txt
psql_password:
file: ./psql_password.txt
์ฌ์ค ํ์ผ์ ์ฌ์ฉํ๊ธฐ ๋ณด๋ค๋ secret ์ ๋ค์ด๊ฐ๋ ๊ฒ์ ๋ฐ๋ก ๋ง๋ค์ด ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ secret ์ค๋ธ์ ํธ๋ฅผ CLI ์์ ๋ง๋ค๋ฉด ๋ฉ๋๋ค.
# psql_user, psql_password ๋ฅผ ์ํธํ
# ํด๋น ๋ฐ์ดํฐ๋ฅผ environment ์์ ์ฌ์ฉํจ
#
version: "3.1"
services:
psql:
image: postgres
secrets:
- psql_user
- psql_password
environment:
POSTGRES_PASSWORD_FILE: /run/secrets/psql_password
POSTGRES_USER_FILE: /run/secrets/psql_user
secrets:
psql_user:
external: true
psql_password:
external: true
# echo "<string>" | docker secret create psql_user - <value>
$ echo "aaafba" | docker secret create psql-password -
#asdoaiuer34543490$#apdf
$ echo "aaafba" | docker secret create psql-user -
wer$%$#%&fgsfgsdf456ghj
2.4 docker compose ์์ฑํ๊ธฐ: Exercise
docker run ์ผ๋ก ์์ํด์ ์๋น์ค๋ฅผ ๊ตฌ๋ํด๋ณด๊ณ ์ด๋ฅผ docker-compose.yaml ์ ๊ธฐ์ ํ์ฌ ๋ฉํฐ ์ปจํ
์ด๋๋ฅผ ๊ตฌ๋ํ๋ ์ฐ์ต์ ํด๋ด
์๋ค.
ํด๋น App ์ ์ฌ์ฉ์๊ฐ voting-app ์ ํตํด ํฌํ๋ฅผ ํ๋ฉด result-app ์ ํตํด ํตํฉ ๊ฒฐ๊ณผ๋ฅผ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ ๊ตฌ์กฐ๋ก ๋์ด ์์ต๋๋ค.
๋จ์ํ ์ด ๊ตฌ์กฐ๋ฅผ ์ฐ๊ฒฐ ๋งํฌ ๊ด๊ณ์์ด ์๋์ ๊ฐ์ด ์ปจํ
์ด๋๋ง ๊ตฌ๋ํ๋ฉด ์ปจํ
์ด๋๊ฐ์
$ docker run -d --name=redis redis
$ docker run -d --name=db
$ docker run -d --name vote -p 5000:80 voting-app
$ docker run -d --name=result -p 5001:80 result-app
$ docker run -d --name=worker worker
๋ค๋ฅธ ์ปจํ
์ด๋์ ์กด์ฌ๋ฅผ ๋ชจ๋ฅด๋ฏ๋ก ์๋์ ์๋ฌ ๋ฉ์์ง๋ฅผ ๋ณด๊ฒ ๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ์ปจํ
์ด๋ ๊ฐ์ ์ฐ๊ฒฐ ๊ด๊ณ๋ฅผ ํ์ธํด ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
voting-app (python) ์น ์๋ฒ ์ฝ๋ ์กฐ๊ฐ์ ๋ณด๋ฉด ์น ์๋ฒ๊ฐ ์์๋๋ฉด redis ๋ฅผ ์ฐพ๋๋ค.
result-app (node-js) ์น ์๋ฒ ์ฝ๋ ์กฐ๊ฐ์ ๋ณด๋ฉด ์น ์๋ฒ๊ฐ ์์๋๋ฉด db ๋ฅผ ์ฐพ๋๋ค.
worker (.NET) ์น ์๋ฒ ์ฝ๋ ์กฐ๊ฐ์ ๋ณด๋ฉด ๋ฐฑ์๋ ํ๋ก์ธ์ค๋ db ์ redis ๋ฅผ ๋ชจ๋ ํ์ธํ๋ค.
์ฆ ๊ฐ ๋งํฌ ๊ด๊ณ๋ฅผ ์๊ฐํด๋ณด๋ฉด ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋งํฌ๊ฐ ๋งบ์ด์ง๋ฏ๋ก
docker run ๋ช
๋ น์ ์๋์ ๊ฐ์ด --link ์ต์
์ ๋ ์ฃผ์ด์ผ ํ๋ค.
$ docker run -d --name=redis redis
$ docker run -d --name=db
$ docker run -d --name vote -p 5000:80 --link redis:redis voting-app
$ docker run -d --name=result -p 5001:80 --link db:db result-app
$ docker run -d --name=worker --link db:db --link redis:redis worker
๊ทธ๋ฆฌ๊ณ voting-app ์ ์ ๊ทผํด์ /etc/hosts ํ์ผ์ ํ์ธํด ๋ณด๋ฉด ์๋์ ๊ฐ์ด ๋ณ๊ฒฝ๋์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด์ ์ด ๊ณผ์ ์ docker-compose.yml ํ์ผ์ ๋
น์ฌ๋ณด์.
๋จผ์ ํ ์ผ์ docker-compose.yml ํ์ผ์ ๋ง๋ค๊ณ ์ปจํ
์ด๋ ์ด๋ฆ์ ๋ฃ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ ์ปจํ
์ด๋์์ ์ฌ์ฉํ ์ด๋ฏธ์ง๋ฅผ ๋ฃ๋๋ค.
๊ทธ ๋ค์ ์ฌ์ฉํ ํฌํธ ์ ๋ณด๋ฅผ ์
๋ ฅํ๋ค.
๋ง์ง๋ง์ผ๋ก ์ฌ์ฉํ๋ ๋งํฌ ์ ๋ณด๋ฅผ ๋ฃ๋๋ค.
์์ ๊ฒฝ์ฐ docker compose v1 ๊ธฐ์ค์ผ๋ก ์์ฑํ์๋๋ฐ
์ฌ๊ธฐ์ ๋ํด ๋ง์ฝ ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉ์ ํธ๋ํฝ์ ๋ฐ์ front-end ์ ์ฑ ํต์ ์์ ์ฌ์ฉํ back-end ๋ก ๋๋์๋ค๊ณ ์๊ฐํด ๋ณด์.
์ด ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด ๋ณ๊ฒฝํ๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋์ ๊ฐ๋จํ ์๋์ ๊ฐ์ด ๊ตฌ๋ํ๋ฉด ๋๋ค.
docker-compose up
์ฐธ๊ณ
- 12. Docker Compose: https://kin3303.tistory.com/18
- ๋์ปค ์ปดํฌ์ฆ(Docker Compose): https://velog.io/@dong5854/%EB%8F%84%EC%BB%A4-%EC%BB%B4%ED%8F%AC%EC%A6%88Docker-Compose
๋ฐ์ํ
'Study: DeveloperTools(DevTool) > DevTool: Container' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Docker] ๋์ปค ๋คํธ์ํฌ ์ ๋ฆฌ (feat. docker network) (0) | 2022.10.27 |
---|---|
[Docker] Privileged Container์ ๋ํ์ฌ (1) | 2022.10.03 |
[Docker] docker-compose VS docker compose ์ฐจ์ด์ ๋น๊ต (0) | 2022.09.07 |
[Docker] Docker Compose ์ปค๋งจ๋ ์ฌ์ฉ๋ฒ (0) | 2022.09.06 |
[Docker] Dockerfile ์ ๋ฆฌ: Docker image๋ฅผ ์์ฑํ์ (feat. Docker ์ปค๋ฉ๋) (0) | 2022.09.04 |