12μž₯. Docker-Compose

기운찬곰·2021λ…„ 2μ›” 11일
1

Docker

λͺ©λ‘ 보기
12/13

πŸ’» Microsoft Docker Compose μ‚¬μš©

Docker Compose

Docker Compose ν•„μš”μ„±

μ—¬λŸ¬ 개의 μ»¨ν…Œμ΄λ„ˆκ°€ ν•˜λ‚˜μ˜ μ• ν”Œλ¦¬ν‚€μ—μ…˜μœΌλ‘œ λ™μž‘ν•  λ•Œ 이λ₯Ό ν…ŒμŠ€νŠΈν•˜λ €λ©΄ 각 μ»¨ν…Œμ΄λ„ˆλ₯Ό ν•˜λ‚˜μ”© 생성해야 ν•œλ‹€. 예λ₯Ό λ“€μ–΄ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ ν…ŒμŠ€νŠΈν•˜λ €λ©΄ μ›Ή μ„œλ²„ μ»¨ν…Œμ΄λ„ˆμ™€ λ°μ΄ν„°λ² μ΄μŠ€ μ»¨ν…Œμ΄λ„ˆλ₯Ό 생성해야 ν•œλ‹€.

이처럼 μ—¬λŸ¬κ°œμ˜ μ»¨ν…Œμ΄λ„ˆλ‘œ κ΅¬μ„±λœ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬μΆ•ν•˜κΈ° μœ„ν•΄ run λͺ…λ Ήμ–΄λ₯Ό μ—¬λŸ¬ 번 μ‚¬μš©ν•  수 μžˆμ§€λ§Œ 각 μ»¨ν…Œμ΄λ„ˆκ°€ μ œλŒ€λ‘œ λ™μž‘ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” ν…ŒμŠ€νŠΈ λ‹¨κ³„μ—μ„œλŠ” μ΄λ ‡κ²Œ ν•˜κΈ° λ²ˆκ±°λ‘­λ‹€. λ”°λΌμ„œ μ—¬λŸ¬κ°œμ˜ μ»¨ν…Œμ΄λ„ˆλ₯Ό ν•˜λ‚˜μ˜ μ„œλΉ„μŠ€λ‘œ μ •μ˜ν•΄ μ»¨ν…Œμ΄λ„ˆ 묢음으둜 관리할 수 μžˆλ‹€λ©΄ μ’€ 더 νŽΈλ¦¬ν•  것이닀.

λ™μž‘ 원리

도컀 μ»΄ν¬μ¦ˆλŠ” μ—¬λŸ¬κ°œμ˜ μ»¨ν…Œμ΄λ„ˆμ˜ μ˜΅μ…˜κ³Ό ν™˜κ²½μ„ μ •μ˜ν•œ νŒŒμΌμ„ 읽어 μ»¨ν…Œμ΄λ„ˆλ₯Ό 순차적으둜 μƒμ„±ν•˜λŠ” λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€. 도컀 컴포즈의 μ„€μ • νŒŒμΌμ€ run λͺ…λ Ήμ–΄μ˜ μ˜΅μ…˜μ„ κ·ΈλŒ€λ‘œ μ‚¬μš©ν•  수 있으며, 각 μ»¨ν…Œμ΄λ„ˆμ˜ μ˜μ‘΄μ„±, λ„€νŠΈμ›Œν¬, λ³Όλ₯¨ 등을 ν•¨κ»˜ μ •μ˜ν•  수 μžˆλ‹€. λ˜ν•œ μ„€μ • 파일의 μ •μ˜λœ μ„œλΉ„μŠ€μ˜ μ»¨ν…Œμ΄λ„ˆ 수λ₯Ό μœ λ™μ μœΌλ‘œ μ‘°μ ˆν•  수 있으며 μ»¨ν…Œμ΄λ„ˆμ˜ μ„œλΉ„μŠ€ λ””μŠ€μ»€λ²„λ¦¬λ„ μžλ™μœΌλ‘œ 이뀄진닀.

λ¬Όλ‘  μ΄λŸ¬ν•œ κΈ°λŠ₯이 ν•„μš”ν•˜μ§€ μ•ŠλŠ” μ†Œκ·œλͺ¨ μ»¨ν…Œμ΄λ„ˆ κ°œλ°œν™˜κ²½μ—μ„œλŠ” 도컀 μ—”μ§„μ˜ run λͺ…λ Ήμ–΄λ‘œ μ»¨ν…Œμ΄λ„ˆλ₯Ό μƒμ„±ν•˜λŠ” 것이 더 νŽΈλ¦¬ν•  수 μžˆκ² λ‹€. κ·Έλ ‡μ§€λ§Œ μ»¨ν…Œμ΄λ„ˆκ°€ λ§Žμ•„μ§€κ³  μ •μ˜ν•΄μ•Όν•  μ˜΅μ…˜μ΄ λ§Žλ‹€λ©΄ 도컀 컴포즈λ₯Ό μ‚¬μš©ν•˜λŠ”κ²Œ μ’‹λ‹€.


Docker Compose Usage

Install

μ—¬κΈ°μ„œλŠ” μœˆλ„μš° ν™˜κ²½μ„ κ°€μ •ν•˜κ³  μ„€λͺ…ν•˜λ„λ‘ ν•˜κ² λ‹€. μœˆλ„μš°μ™€ λ§₯ OS μ—μ„œλŠ” 도컀 νˆ΄λ°•μŠ€λ‚˜ Docker for Windows, Docker for Mac을 μ„€μΉ˜ν•˜λ©΄ 도컀 엔진과 ν•¨κ»˜ 도컀 μ»΄ν¬μ¦ˆλ„ μ„€μΉ˜λ˜κΈ° λ•Œλ¬Έμ— λ”°λ‘œ λ­”κ°€λ₯Ό ν•  ν•„μš”λŠ” μ—†λ‹€.

YAML 파일 생성

도컀 μ»΄ν¬μ¦ˆλŠ” μ»¨ν…Œμ΄λ„ˆμ˜ 섀정이 μ •μ˜λœ YAML 파일일 읽어 도컀 엔진을 톡해 μ»¨ν…Œμ΄λ„ˆλ₯Ό 생성해쀀닀. λ”°λΌμ„œ 도컀 컴포즈λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ λ¨Όμ € YAML νŒŒμΌμ„ μž‘μ„±ν•΄μ•Ό ν•œλ‹€. Docker ComposeλŠ” 기본적으둜 docker-compose.yml νŒŒμΌμ„ μ„€μ • 파일둜 μ‚¬μš©ν•œλ‹€. 보톡 μ•± ν”„λ‘œμ νŠΈ λ£¨νŠΈμ— νŒŒμΌμ„ λ§Œλ“€μ–΄ μ‚¬μš©ν•œλ‹€κ³  ν•œλ‹€.

κ°€μž₯ λ¨Όμ € μŠ€ν‚€λ§ˆ 버전을 μ •μ˜ν•œλ‹€. λŒ€λΆ€λΆ„μ˜ 경우 μ§€μ›λ˜λŠ” μ΅œμ‹  버전을 μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€. λ‹€μŒμœΌλ‘œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μΌλΆ€λ‘œ μ‹€ν–‰ν•˜λ €λŠ” μ„œλΉ„μŠ€(λ˜λŠ” μ»¨ν…Œμ΄λ„ˆ) λͺ©λ‘μ„ μ •μ˜ν•œλ‹€.

version: "3.7" # ν•„μˆ˜
services: μž‘μ„±μ˜ˆμ •(ν•„μˆ˜)
networks:
    # λ„€νŠΈμ›Œν¬ μ„€μ •. 없어도 됨
volumnes:
    #λ³Όλ₯¨ μ„€μ •. 없어도 됨

YAML 파일 μž‘μ„±

λ¨Όμ € μ„œλΉ„μŠ€ ν•­λͺ©κ³Ό μ»¨ν…Œμ΄λ„ˆ 이미지λ₯Ό μ •μ˜ν•œλ‹€. μ„œλΉ„μŠ€ 이름은 μž„μ˜λ‘œ 선택할 수 μžˆλ‹€.

version: "3.7"

services:
  app: # service 이름
    image: node:14.15.5-alpine # 이미지
    command: sh -c "yarn install && yarn run dev" # μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰μ‹œ 싀행될 λͺ…λ Ή
    ports: # 포트 맀핑
      - 3000:3000
    working_dir: /app # μ»¨ν…Œμ΄λ„ˆ λ‚΄ μž‘μ—…κ³΅κ°„(μ—†μœΌλ©΄ λ§Œλ“€μ–΄μ€Œ)
    volumes: # λ³Όλ₯¨ μ„€μ • (호슀트:μ»¨ν…Œμ΄λ„ˆ)
      - ./:/app
    environment: # ν™˜κ²½λ³€μˆ˜
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: secret
      MYSQL_DB: todos
    depends_on: # μ˜μ‘΄μ„± μ„€μ •(dbκ°€ λ¨Όμ € μƒμ„±λœ 후에 app이 생성)
      - db
    restart: always # 였λ₯˜κ°€ λ‚˜λ©΄ λ°”λ‘œ λ‹€μ‹œ μ‹œμž‘
  
  db: 
    image: mariadb:10.5
    volumes: # λ³Όλ₯¨ μ„€μ • (호슀트:μ»¨ν…Œμ΄λ„ˆ)
      - todo-mysql-data:/var/lib/mysql
    environment: 
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: todos

volumes: # λ³Όλ₯¨μ„ λ”°λ‘œ 생성
  todo-mysql-data:

docker-compose μ‹€ν–‰

이제 docker-compose.yml 파일이 μ€€λΉ„λ˜μ—ˆμœΌλ―€λ‘œ μ‹œμž‘ν•  수 μžˆλ‹€.

$ docker-compose up -d

μ²˜μŒμ— mariadb_app_1(node μ»¨ν…Œμ΄λ„ˆ)κ°€ μ‹€ν–‰λ˜μžλ§ˆμž κΊΌμ§€λŠ” 였λ₯˜κ°€ λ‚˜μ„œ ν•œλ™μ•ˆ 어렀움을 κ²ͺμ—ˆλ‹€. μ΄λŸ΄λ•ŒλŠ” 밑에 둜그 확인 방법을 μ‚¬μš©ν•˜λ©΄ 무슨 였λ₯˜λ•Œλ¬Έμ— 싀행이 μ•ˆλ˜λŠ”μ§€ 확인할 수 μžˆλ‹€.

일단 λ‚˜λŠ” μ²˜μŒμ— node:14.15.5-appine에 app 폴더가 있고 κ·Έ μ•ˆμ— λ‚΄μš©μ΄ μžˆμ–΄μ„œ yarn으둜 μ„€μΉ˜ν•˜κ³  μ‹€ν–‰λ˜λ„λ‘ ν•˜λŠ”κ±΄μ€„ μ•Œμ•˜λ‹€. 근데 μ•Œκ³  λ³΄λ‹ˆκΉŒ app ν΄λ”λŠ” μ‘΄μž¬ν•˜μ§€ μ•Šκ³ , working_dirλ₯Ό 톡해 app 폴더λ₯Ό μƒμ„±ν•œ 후에 λ‚΄κ°€ μ§€κΈˆ μžˆλŠ” 폴더λ₯Ό μ»¨ν…Œμ΄λ„ˆμ—λ‹€κ°€ 볡사뢙여넣기 ν•œ λ‹€μŒμ— μ‹€ν–‰λ˜λ„λ‘ ν•˜λŠ” κ±°μ˜€λ‹€...

μ•„... μƒκ°ν•΄λ³΄λ‹ˆ μ§„μ§œ 바보같은 μ‹€μˆ˜λ₯Ό ν–ˆλ‹€.

  • working_dir: /app => μ»¨ν…Œμ΄λ„ˆμ˜ μž‘μ—…κ³΅κ°„μ„ app ν΄λ”λ‘œ μ„€μ •. μ—†λ‹€λ©΄ μ•Œμ•„μ„œ 생성해쀀닀.
  • volumes: ./:/app => λ³Όλ₯¨μ„€μ •μ„ μ΄λ ‡κ²Œ ν–ˆλ‹€. 이것은 ν˜„μž¬ λ‚΄ μ»΄ν“¨ν„°μ˜ ν˜„μž¬ κ²½λ‘œμ™€ μ»¨ν…Œμ΄λ„ˆμ΄μ˜ app 폴더와 κ³΅μœ ν•˜κ² λ‹€λŠ” μ˜λ―Έμ΄λ‹€.

✍ 정리해보면 ν˜„μž¬ μ»΄ν“¨ν„°μ˜ μž‘μ—…κ³΅κ°„κ³Ό μ»¨ν…Œμ΄λ„ˆμ˜ app μž‘μ—…κ³΅κ°„μ„ μ„œλ‘œ μΌμΉ˜μ‹œμΌœμ„œ μ»¨ν…Œμ΄λ„ˆμ—μ„œ μ‹€ν–‰λ˜λ„λ‘ λ§Œλ“  것이닀. (였.. 이러면 μœˆλ„μš°μ—μ„œ μž‘μ—…ν•œκ²Œ λ¦¬λˆ…μŠ€μ—μ„œ μ‹€μ‹œκ°„μœΌλ‘œ λ°˜μ˜λ˜λ©΄μ„œ μ‹€ν–‰λ˜λŠ” 건가???? 신세계 발견?)

도컀 λ³Όλ₯¨ 확인

app μ„œλΉ„μŠ€μ˜ volumes와 db μ„œλΉ„μŠ€μ˜ volumesλŠ” 차이가 μžˆλ‹€. 사싀 이것 λ•Œλ¬Έμ— 더 ν—·κ°ˆλ Έλ˜κ±° κ°™λ‹€. κ°€μž₯ μ•„λž˜ volumnes: todo-mysql-data 라고 μ„€μ •ν•œ 뢀뢄은 λ°”λ‘œ 도컀 λ³Όλ₯¨μ„ μƒμ„±ν•˜λŠ” λͺ…령이닀. 도컀 λ³Όλ₯¨μ— λŒ€ν•΄ 기얡이 μ•ˆλ‚œλ‹€λ©΄ 이전 글을 보고 였자.

κ·Έλ ‡κ²Œ μƒμ„±λœ todo-mysql-data λ³Όλ₯¨μ—λ‹€κ°€ mariaDB μ»¨ν…Œμ΄λ„ˆ μ•ˆμ— /var/lib/mysql 폴더λ₯Ό κ³΅μœ ν•΄μ£Όκ² λ‹€λŠ” μ˜λ―Έκ°€ λœλ‹€. κ·Έλ ‡λ‹€λ©΄ todo-mysql-data λ³Όλ₯¨μ€ μ–΄λ””μžˆμ„κΉŒ? 그것도 μœˆλ„μš° μ•ˆμ—μ„œ 말이닀.

이것과 κ΄€λ ¨ν•΄μ„œ μŠ€νƒμ˜€λ²„ν”Œλ‘œμš°μ— 쒋은 글이 μžˆμ—ˆλ‹€. λ°”λ‘œ \\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\ κ²½λ‘œμ— μžˆμ„ κ²ƒμ΄λΌλŠ” 것!!!

와.. μ‹ κΈ°ν•˜λ‹€. mariadb_todo-mysql-dataλΌλŠ” λ³Όλ₯¨μ΄ μ§„μ§œ μžˆμ—ˆλ‹€. κ±°κΈ°μ„œ _date 폴더 μ•ˆμ— μ»¨ν…Œμ΄λ„ˆ mysql μ„€μ • κ΄€λ ¨ 폴더와 νŒŒμΌλ“€μ΄ 곡유된 것을 확인할 수 μžˆμ—ˆλ‹€.

μ•„λ¬΄λž˜λ„ 이 곡간이 Windows ν˜ΈμŠ€νŠΈμ—μ„œ λ¦¬λˆ…μŠ€ 기반 도컀λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•œ WSL(λ¦¬λˆ…μŠ€μš© μœˆλ„μš° ν•˜μœ„ μ‹œμŠ€ν…œ)인거 κ°™λ‹€. WSLμ΄λž€ Windowsμ—μ„œ λ„€μ΄ν‹°λΈŒ Linux λͺ…령쀄 도ꡬλ₯Ό 직접 μ‹€ν–‰ν•  수 μžˆλŠ” μƒˆλ‘œμš΄ Windows 10 κΈ°λŠ₯이라고 ν•œλ‹€.

WSL 1κ³ΌλŠ” λ‹€λ₯΄κ²Œ WSL 2λŠ” Hyper-V 기반의 μ΅œμ‹  가상화 κΈ°μˆ μ„ μ΄μš©ν•˜μ—¬ μ‹€μ œ λ¦¬λˆ…μŠ€ 컀널을 직접 νƒ‘μž¬ν•˜λ©΄μ„œ μ„±λŠ₯ λ˜ν•œ λΉ„μ•½μ μœΌλ‘œ μƒμŠΉν•˜μ˜€λ‹€κ³  ν•˜λ‹ˆ... μ΄λž˜μ„œ μœˆλ„μš°μ—μ„œ 도컀λ₯Ό μžμ—°μŠ€λŸ½κ²Œ μ‚¬μš©ν•  수 μžˆμ—ˆλ˜ κ±°κ΅¬λ‚˜.. πŸ‘πŸ‘

Logs Checking

도컀 μ»΄ν¬μ¦ˆμ—μ„œ 둜그λ₯Ό 확인해보렀면 λ‹€μŒ λͺ…령을 μ‹€ν–‰ν•˜λ©΄ λœλ‹€. -f ν”Œλž˜κ·ΈλŠ” λ‘œκ·Έκ°€ μ‹€μ‹œκ°„μœΌλ‘œ 뒀에 μΆ”κ°€λ˜λ„λ‘ ν•΄μ£ΌλŠ” μ˜΅μ…˜μ΄λ‹€.

$ docker-compose logs -f

λ§Œμ•½ νŠΉμ • μ»¨ν…Œμ΄λ„ˆ(μ„œλΉ„μŠ€)에 λŒ€ν•œ 둜그만 보고 μ‹Άλ‹€λ©΄ μ„œλΉ„μŠ€ 이름을 적고 μ‹€ν–‰ν•˜λ©΄ λœλ‹€.

$ docker-compose logs μ„œλΉ„μŠ€ 이름(ex. app, db)

docker-compose down

docker-compose down λͺ…령을 톡해 λͺ¨λ‘ μ œκ±°ν•  수 μžˆλ‹€.


마침

도컀 컴포즈 μ€‘μ—μ„œ μ•„μ£Ό μΌλΆ€λΆ„λ§Œ μ‹€μŠ΅ν•΄λ΄€λ‹€. μ„€λͺ…ν•˜μ§€ λͺ»ν•œ μ˜΅μ…˜(networks μ •μ˜ λ“±)도 많이 있으며 도컀 컴포즈λ₯Ό μ΄μš©ν•œ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ—¬λŸ¬κ°œ 볡사 생성할 μˆ˜λ„ μžˆλ‹€.

profile
배움을 μ’‹μ•„ν•©λ‹ˆλ‹€. μƒˆλ‘œμš΄ 것을 μ’‹μ•„ν•©λ‹ˆλ‹€.

0개의 λŒ“κΈ€