๐ณ Docker Compose ํ์ผ ๊ตฌ์ฑ ์์
๐พ ๋์ปค ์ปดํฌ์ฆ์ ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์๋ฃฐ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค. ์์ฃผ ์ฌ์ฉํ๋ ํญ๋ชฉ๋ง ์ ๋ฆฌํ์๊ณ , ๋ค๋ฅธ ํญ๋ชฉ๋ค์ ํ์ธํ์๋ ค๋ฉด docker-compose๋ฅผ ํ์ธํ์ธ์.
Docker compose๋?
Docker Compose๋ฅผ ์ด์ฉํ๋ฉด ์ฌ๋ฌ ๊ฐ์ ์ปจํ
์ด๋(container)๋ก ๊ตฌ์ฑ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ํ๋์ ํ์ผ(YAML)์ ์ ์ํด๋๊ณ  ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํด ํ ๋ฒ์ ์ฌ๋ฆฌ๊ฑฐ๋ ๋ด๋ฆด ์ ์์ต๋๋ค. Docker Compose๋ ๊ธฐ๋ณธ์ ์ผ๋กย docker-compose.ymlย ํ์ผ์ ์ค์  ํ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
๊ธฐ๋ณธ ๊ตฌ์กฐ
docker-compose.ymlย ํ์ผ์ ๋๋ต์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ต๋๋ค.
version: "3.7"
services:
  web:
    # ์ปจํ
์ด๋ ์๋น์ค, ์น ์ ํ๋ฆฌ์ผ์ด์
 ์ค์ 
  db:
    # ์ปจํ
์ด๋ ์๋น์ค, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์ 
networks:
  # ๋คํธ์ํฌ ์ค์ 
volumes:
  # ๋ณผ๋ฅจ ์ค์ 
Docker Compose์์ ์๋น์ค๋ ๋
๋ฆฝ๋ ์ปจํ
์ด๋์์ ๋์๊ฐ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ฑ ์์๋ผ๊ณ  ์๊ฐํ๋ฉด ๋ฉ๋๋ค. ๊ฐ์ฅ ๋จผ์  ํ๋ก์ ํธ์์ ๊ฐ๋ฐํ๊ณ  ์๋ ์ ํ๋ฆฌ์ผ์ด์
 ์์ฒด๊ฐ ์๋น์ค๊ฐ ๋  ๊ฒ์ด๊ณ , ๊ทธ ๋ฐ์ ํด๋น ์ ํ๋ฆฌ์ผ์ด์
์ด ์์กดํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ๋ ์๋น์ค๊ฐ ๋  ์ ์์ต๋๋ค. ์ฆ, ๋ฉ์ธ ์ ํ๋ฆฌ์ผ์ด์
 ๋ฟ๋ง ์๋๋ผ ์ ์์ ์ผ๋ก ๊ตฌ๋๋๊ธฐ ์ํด์ ํ์ํ ๊ธฐ๋ฐ ์์คํ
๊น์ง Docker Compose๋ก ์ค์ ํ๋ค๊ณ  ๋ณด์๋ฉด ๋ฉ๋๋ค. 
.env ํ์ผ
docker-compose.yml ํ์ผ๊ณผ ๊ฐ์ ๊ฒฝ๋ก์ .env ํ์ผ์ ์ ์ํ  ์ ์์ต๋๋ค. .env ํ์ผ์ ํ๊ฒฝ๋ณ์๋ฅผ ์ ์ ํ๋ฉด docker-compose.yml ์์ ์ฌ์ฉํ  ์ ์์ต๋๋ค.
# .env
MY_ENV="prod"
# docker-compose.yml
version: '3.7'
services:
  web:
    build:
      context: web/
      args:
        PROFILE: ${MY_ENV}
๊ตฌ์ฑ ์์
docker-compose.yml์์ฑ์ ์์ฃผ ์ฌ์ฉํ๋ ํญ๋ชฉ์ ์ ๋ฆฌํ ๋ด์ฉ์
๋๋ค.
build
buildย ํญ๋ชฉ์ ํด๋น ์๋น์ค์ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ธฐ ์ํ ์ฉ๋๋ก,ย Dockerfile์ด ์์นํ๋ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
## docker-compose.ymlย ํ์ผ๊ณผ ๋์ผํ ๋๋ ํ ๋ฆฌ์ ์์นํย Dockerfile ์ ์ฌ์ฉํด์ web ์๋น์ค์ ์ด๋ฏธ์ง๋ฅผ ๋น๋
version: '3.7'
services:
  web:
    build: .
## Dockerfile์ด ์๋ ๋ค๋ฅธ ์ด๋ฆ์ ํ์ผ๋ก ๋น๋๋ฅผ ํ๊ณ  ์ถ๊ฑฐ๋, ๋น๋ ์ธ์๋ฅผ ๋๊ฒจ์ผ ํ๋ ๊ฒฝ์ฐ
version: '3.7'
services:
  web:
    build:
      context: ./app
      dockerfile: Dockerfile-dev
      args:
        arg1: "development"
	    arg2: "docker"
image
ํ๋ก์ ํธ์์ ์ง์  ๊ฐ๋ฐํ์ง ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ ๊ฒฝ์ฐ์๋, ์ด๋ฏธ์ง๋ฅผ ์ง์  ๋น๋ํ๋ ๋์ ์ ์ด๋ฏธ์ง ์ ์ฅ์(repository)๋ก ๋ถํฐ ์ด๋ฏธ์ง๋ฅผ ๋ด๋ ค๋ฐ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค.
# image ํญ๋ชฉ์ ์ด๋ฏธ์ง ์ ์ฅ์๋ก ๋ถํฐ ๋ด๋ ค๋ฐ์ ์ด๋ฏธ์ง์ ์ด๋ฆ๊ณผ ํ๊ทธ๋ฅผ ๋ช
์ํ๋๋ฐ ์ฌ์ฉ๋ฉ
version: '3.7'
services:
  db:
    image: postgres:13
  cache:
    image: redis
ports
portsย ํญ๋ชฉ์ ์ธ๋ถ๋ก ๋
ธ์ถ์ํฌ ํฌํธ์ ๋งตํ์ ๋ช
์ํฉ๋๋ค. ๋ฐ์ธ๋(bind)๊ฐ ํ์ํ ํธ์คํธ ์ธ๋ถ ํฌํธ์ ์ปจํ
์ด๋ ๋ด๋ถ ํฌํธ๋ฅผ ์ง์ ํฉ๋๋ค.
services:
  web:
    ports:
      - "8000:8000"
  db:
    ports:
      - "5432:5432"
volumes
volumesย ํญ๋ชฉ์ ๋ณผ๋ฅจ ์ค์ ์ ์ํด ์ฐ์
๋๋ค. ๋ง์ดํธ(mount)๊ฐ ํ์ํ ํธ์คํธ์ ๊ฒฝ๋ก์ ์ปจํ
์ด๋์ ๊ฒฝ๋ก๋ฅผ ๋ช
์ํฉ๋๋ค.
# ํธ์คํธ์ ๊ฒฝ๋ก๋ก ๋ณผ๋ฅจ ์ค์ 
services:
  web:
    volumes:
      - .:/web
# ๋ฏธ๋ฆฌ ์์ฑํ docker volume์ผ๋ก ๋ณผ๋ฅจ ์ค์ 
services:
  frontend:
    image: node:lts
    volumes:
      - myapp:/home/node/app
volumes:
  myapp:
    external: true
depends_on
depends_on ํญ๋ชฉ์ ์๋น์ค ๊ฐ ์์กด ๊ด๊ณ๋ฅผ ์ง์ ํ๊ธฐ ์ํด์ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์น ์ ํ๋ฆฌ์ผ์ด์
์ด ์ฌ๋ผ์ค๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค, ๋ ๋์ค ์๋น์ค๊ฐ ๋จผ์  ์ฌ๋ผ์์ผ ํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํฉ๋๋ค.
version: "3.7"
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres
command
commandย ํญ๋ชฉ์ ํด๋น ์๋น์ค๊ฐ ์ฌ๋ผ์ฌ ๋ย Dockerfile ์ย CMDย ๋ช
๋ น๋ฌธ์ ๋ฌด์ํ๊ณ  ์คํํ  ๋ช
๋ น์ด๋ฅผ ์ค์ ํ๊ธฐ ์ํด์ ์ฌ์ฉ๋ฉ๋๋ค.
services:
  web:
    command: node .
environment
environmentย ํญ๋ชฉ์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ๊ธฐ ์ํด์ ์ฌ์ฉ๋ฉ๋๋ค.
services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: wordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress
# ์๋์ ๊ฐ์ ํ์์ผ๋ก๋ ์ฌ์ฉํ  ์ ์์ต๋๋ค.
environment:
  - RACK_ENV=development
  - SHOW=true
๋๊ธ๋จ๊ธฐ๊ธฐ