[πŸ‹Docker] 도컀 컴포즈(Docker Compose)

vincaΒ·2023λ…„ 12μ›” 8일
0
post-thumbnail
post-custom-banner

도컀 μ»΄ν¬μ¦ˆλž€?

기본적으둜 πŸ‹λ„μ»€μ΄κΈ° λ•Œλ¬Έμ— k8s와 달리 단일 호슀트 ν™˜κ²½μ΄λ‹€.

πŸ™λ„μ»€ μ»΄ν¬μ¦ˆλŠ” μ΄λŸ¬ν•œ 단일 호슀트 ν™˜κ²½μ—μ„œ μ—¬λŸ¬ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•˜κ³  κ΄€λ¦¬ν•˜λŠ”λ° μ‚¬μš©λœλ‹€.

도컀 μ»΄ν¬μ¦ˆλŠ” YAML νŒŒμΌμ„ μ‚¬μš©ν•˜μ—¬ 각 μ»¨ν…Œμ΄λ„ˆκ°€ μ–΄λ–»κ²Œ μƒν˜Έμž‘μš©ν•˜λŠ”μ§€, μ–΄λ–€ λ„€νŠΈμ›Œν¬μ™€ λ³Όλ₯¨μ„ μ‚¬μš©ν•˜λŠ”μ§€λ₯Ό μ •μ˜ν•  수 μžˆλ‹€.

  • Version : Docker Engineκ³Ό ν˜Έν™˜λ˜λŠ” Docker Compose 파일의 버전을 λͺ…μ‹œν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, version: '3.8'κ³Ό 같이 λͺ…μ‹œν•©λ‹ˆλ‹€.

  • Services : μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„œλΉ„μŠ€λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. μ„œλΉ„μŠ€λŠ” μ»¨ν…Œμ΄λ„ˆμ˜ μ§‘ν•©μœΌλ‘œ, λ…λ¦½μ μœΌλ‘œ ν™•μž₯ν•˜κ±°λ‚˜ ꡐ체할 수 μžˆλŠ” μ»΄ν“¨νŒ… μžμ›μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 각 μ„œλΉ„μŠ€λŠ” Docker 이미지와 싀행을 μœ„ν•œ 섀정을 ν¬ν•¨ν•©λ‹ˆλ‹€.

  • Networks : μ„œλΉ„μŠ€κ°€ μ—°κ²°ν•  λ„€νŠΈμ›Œν¬λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. λ„€νŠΈμ›Œν¬λŠ” 도컀 μ—”μ§„μ˜ κΈ°λ³Έ λ„€νŠΈμ›Œν¬ λ“œλΌμ΄λ²„λ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ μ‚¬μš©μž μ •μ˜ λ„€νŠΈμ›Œν¬ λ“œλΌμ΄λ²„λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • Volumes : 데이터λ₯Ό μ €μž₯ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” λ³Όλ₯¨μ„ μ •μ˜ν•©λ‹ˆλ‹€. μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€λ‚˜ 호슀트 μ‹œμŠ€ν…œμ— 데이터λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€.

  • Configs : λŸ°νƒ€μž„μ— μ„œλΉ„μŠ€ μ»¨ν…Œμ΄λ„ˆμ— μ „λ‹¬λ˜λŠ” ꡬ성 νŒŒμΌμ„ μ •μ˜ν•©λ‹ˆλ‹€. 이 ꡬ성은 μ»¨ν…Œμ΄λ„ˆμ— λ§ˆμš΄νŠΈλ˜κ±°λ‚˜ ν™˜κ²½ λ³€μˆ˜λ‘œ 섀정될 수 μžˆμŠ΅λ‹ˆλ‹€.

  • Secrets : λ―Όκ°ν•œ 데이터λ₯Ό μ•ˆμ „ν•˜κ²Œ μ €μž₯ν•˜κ³  μ „λ‹¬ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. μ΄λŠ” μ»¨ν…Œμ΄λ„ˆμ— 읽기 μ „μš© 파일둜 λ§ˆμš΄νŠΈλ˜μ–΄ μ•”ν˜Έ, 토큰, μΈμ¦μ„œ λ“±κ³Ό 같은 λ³΄μ•ˆμ— λ―Όκ°ν•œ 정보λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€.


k8s / Docker Swarm / Docker Compose 차이

도컀 컴포즈 (Docker Compose)

도컀 μ»΄ν¬μ¦ˆλŠ” μ—¬λŸ¬ 개의 도컀 μ»¨ν…Œμ΄λ„ˆλ₯Ό μ •μ˜ν•˜κ³  μ‹€ν–‰ν•˜κΈ° μœ„ν•œ 도ꡬ.

단일 ν˜ΈμŠ€νŠΈμ—μ„œ μž‘λ™ν•˜λ©°, YAML νŒŒμΌμ„ μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ μ»¨ν…Œμ΄λ„ˆ κ°„μ˜ 관계, ν™˜κ²½ μ„€μ • 등을 μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•œλ‹€.

주둜 배포 ν™˜κ²½μ΄ μ•„λ‹Œ, 개발 ν™˜κ²½μ—μ„œμ˜ λΉ λ₯Έ ν…ŒμŠ€νŠΈλ‚˜ κ°„λ‹¨ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 배포에 μœ μš©ν•˜λ‹€.

Kubernetes (k8s)

λŒ€κ·œλͺ¨μ˜ μ»¨ν…Œμ΄λ„ˆν™”λœ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ μ˜€ν”ˆ μ†ŒμŠ€ μ»¨ν…Œμ΄λ„ˆ μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜ ν”Œλž«νΌ

μ—¬λŸ¬ 호슀트둜 κ΅¬μ„±λœ ν΄λŸ¬μŠ€ν„°μ—μ„œ μ»¨ν…Œμ΄λ„ˆλ₯Ό 배포, ν™•μž₯, μžλ™ 볡ꡬ 등을 μžλ™ν™”ν•  수 μžˆλ‹€.
κ³ κ°€μš©μ„±, μžλ™ μŠ€μΌ€μΌλ§, μ„œλΉ„μŠ€ λ””μŠ€μ»€λ²„λ¦¬ λ“± κΈ°λŠ₯을 μ œκ³΅ν•˜μ—¬ λŒ€κ·œλͺ¨ 및 λ³΅μž‘ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ ν•©ν•˜λ‹€.

도컀 μŠ€μ›œ (Docker Swarm)

도컀 λ‚΄μž₯ μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜ λ„κ΅¬λ‘œ, μ—¬λŸ¬ ν˜ΈμŠ€νŠΈμ— 걸쳐 μ»¨ν…Œμ΄λ„ˆλ₯Ό ν΄λŸ¬μŠ€ν„°λ§ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” 데 μ‚¬μš©ν•œλ‹€.

Kubernetes와 μ™„λ²½ν•˜κ²Œ λ™μΌν•˜λ‚˜, Kubernetesλ³΄λ‹€λŠ” 더 κ°€λ²Όμš°λ©° κ°„λ‹¨ν•˜κ³  μ‰½κ²Œ μ‹œμž‘ν•  수 μžˆλ‹€.

μš”μ•½

μ„œλΉ„μŠ€κ°€ κ³ λ„ν™”λ μˆ˜λ‘ μ•„λž˜μ™€ 같은 ν˜•νƒœλ‘œ μ‚¬μš©λœλ‹€.

πŸ™λ„μ»€ 컴포즈 < πŸ‹λ„μ»€ μŠ€μ›œ < ☸️Kubernetes


μ‹€μŠ΅

# 이미지 올리기
docker compose up
# 이미지 내리기
docker compose down

ν•˜λ‚˜μ˜ μ„œλΉ„μŠ€(μ»¨ν…Œμ΄λ„ˆ) 배포

version: '2.23.0'

services:
  my-service1:
    image: ubuntu:latest

μ—¬λŸ¬κ°œμ˜ μ„œλΉ„μŠ€(μ»¨ν…Œμ΄λ„ˆ) 배포

version: '2.23.0'

services:
  my-service1:
    image: ubuntu:latest
  my-service2:
    image: ubuntu:latest
  my-service3:
    image: ubuntu:latest

λ°°ν¬λ˜λŠ” μ»¨ν…Œμ΄λ„ˆμ˜ λͺ…은 폴더 경둜의 λͺ…을 λ”°λΌκ°€λŠ” 것을 확인할 수 μžˆλ‹€.

μ™ΈλΆ€μ˜ λ„μ»€νŒŒμΌ 배포

version: '2.23.0'

services:
  my-service1:
    build: 
      context: ./dfile
      dockerfile: Dockerfile_1
# download ubuntu image
FROM ubuntu:latest

도컀 μ»΄ν¬μ¦ˆμ— μ •μ˜ν•œ 파일이 μ•„λ‹Œ, 도컀 파일이 외뢀에 dfile 디렉터리에 μœ„μΉ˜ν•΄ μžˆλŠ” 경우 λ‹€μŒκ³Ό 같이 μ“Έ 수 μžˆλ‹€.

args의 μ‚¬μš©

도컀 컴포즈λ₯Ό μ‹œμž‘ν•  λ•Œ 도컀 νŒŒμΌμ— argsλ₯Ό μ •μ˜ν•˜κ³ , 이λ₯Ό 도컀 컴포즈 μͺ½μ—μ„œ ν• λ‹Ήν•΄λ³΄μž.

λ„μ»€νŒŒμΌμ— μ •μ˜λœ λ³€μˆ˜ buildno에 도컀 μ»΄ν¬μ¦ˆμ—μ„œ ν•΄λ‹Ή 값을 args: - buildno=1둜 ν• λ‹Ήν•˜μ—¬ 도컀 이미지λ₯Ό λΉŒλ“œλ˜λŠ” 것을 확인할 수 μžˆλ‹€.

tty μ˜΅μ…˜

version: '2.23.0'

services:
  my-service1:
    tty: true
    build: 
      context: ./dfile
      dockerfile: Dockerfile_1
      args:
        - buildno=1

tty: true
Docker μ»¨ν…Œμ΄λ„ˆμ—μ„œ 가상 터미널(TTY)을 ν™œμ„±ν™”ν•˜λŠ” μ˜΅μ…˜

도컀 컴포즈λ₯Ό λ°°ν¬ν•˜κ³  배포된 μ»¨ν…Œμ΄λ„ˆμ˜ μ΄λ¦„μœΌλ‘œ 터미널을 μ—΄μ–΄ μ ‘μ†ν•΄λ³΄μž.

docker compose up
docker exec -it 1208-my-service1-1 /bin/bash

접속이 μž˜λ˜λŠ” 것을 확인할 수 μžˆλ‹€.

μ›Ή 접속

version: '2.23.0'

services:
  web:
    image: python:3.7
    command: "python -m http.server 8000"
    ports:
      - "8000:8000"

Python λ‚΄μž₯ λͺ¨λ“ˆμΈ http.serverλ₯Ό μ‚¬μš©ν•˜μ—¬ 8000번 ν¬νŠΈμ—μ„œ μ›Ή μ„œλ²„λ₯Ό μ‹€ν–‰ν•˜λ„λ‘ 지정.

Docker μ»¨ν…Œμ΄λ„ˆ λ‚΄μ—μ„œ μ‹€ν–‰ 쀑인 μ›Ή μ„œλ²„κ°€ ν˜„μž¬ λ””λ ‰ν† λ¦¬μ˜ 파일 λͺ©λ‘μ„ ν‘œμ‹œλœλ‹€.

workdir 지정 및 ν™˜κ²½ λ³€μˆ˜ 등둝

version: '2.23.0'

services:
  myservice1:
    tty: true
    image: alpine
    environment:
      - HOST=kim
      - NAME_PORT=8080
    working_dir: /data
    command: ["/bin/sh", "-c", "echo 'hello world!' > hello.txt; tail -f /dev/null"]
    
## 이후 λ‹€λ₯Έ μ‰˜λ‘œ 접속
docker exec -it 1208-myservice1-1 /bin/sh

도컀 컴포즈 μ»€λ§¨λ“œ 지정

# 도컀 파일
# download ubuntu image
FROM ubuntu:latest

CMD [ "echo", "hello docker file!" ]
# -------------------------------------
# 도컀 컴포즈 파일
version: '2.23.0'

services:
  myservice1:
    tty: true
    build: 
      context: ./dfile
      dockerfile: Dockerfile_1
    command: "echo 'hello docker compose!'"

도컀 컴포즈 μͺ½μ˜ μ»€λ§¨λ“œκ°€ μ‹€ν–‰λ˜κ²Œ λœλ‹€

. env

내뢀에 κ³΅κ°œλ˜μ–΄μ„œλŠ” μ•ˆλ˜λŠ” key λ˜λŠ” 포트 λ²ˆν˜Έμ™€ 같이 μˆ¨κ²¨μ•Όν•˜λŠ” ν™˜κ²½λ³€μˆ˜μ™€ 같은 정보λ₯Ό.env νŒŒμΌμ„ ν†΅ν•΄μ„œ λ³„λ„λ‘œ λ§Œλ“€μ–΄μ„œ 관리할 수 μžˆλ‹€.

depends_on

version: '2.23.0'

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    depends_on:
      - db
    #links:
    #  - db
  db:
    image: mariadb:latest
    environment:
      - MYSQL_ROOT_PASSWORD=1234
      - NAME_PORT

links μ˜΅μ…˜μ€ μ„œλΉ„μŠ€ κ°„μ˜ 연결을 μˆ˜λ™μœΌλ‘œ μ„€μ •ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜μ—ˆλ‹€.
예λ₯Ό λ“€μ–΄, web μ„œλΉ„μŠ€κ°€ db μ„œλΉ„μŠ€μ— 쒅속적이고, web μ„œλΉ„μŠ€κ°€ db μ„œλΉ„μŠ€μ˜ 호슀트λͺ…을 μ•Œμ•„μ•Ό ν•  경우 μ‚¬μš©ν•˜μ˜€λŠ”λ°, μ΅œμ‹  λ²„μ „μ˜ Docker Composeμ—μ„œλŠ” μ΄λŸ¬ν•œ 연결이 μžλ™μœΌλ‘œ κ΄€λ¦¬λ˜κΈ° λ•Œλ¬Έμ— links μ˜΅μ…˜μ„ λͺ…μ‹œμ μœΌλ‘œ μ‚¬μš©ν•  ν•„μš”κ°€ μ—†μ–΄μ‘Œλ‹€.

.env / 도컀 컴포즈 / 도컀 파일

2λ²ˆμ— κ±Έμ³μ„œ ν™˜κ²½ λ³€μˆ˜λ₯Ό 도컀 이미지(λ¦¬λˆ…μŠ€)에 μ „λ‹¬ν•΄λ³΄μž.

λ„μ»€νŒŒμΌ λ‚΄ μ΄λ―Έμ§€μ˜ ν™˜κ²½λ³€μˆ˜λ₯Ό 등둝할 λ•Œ 도컀 μ»΄ν¬μ¦ˆμ—μ„œ args ν˜•νƒœλ‘œ 인자λ₯Ό 톡해 값을 전달 ν•  수 μžˆλ‹€.

도컀 컴포즈의 ν™˜κ²½λ³€μˆ˜λŠ” μ™ΈλΆ€ .env ν™˜κ²½ λ³€μˆ˜μ— νŒŒμΌμ— λ“±λ‘ν•˜μ—¬ ${env_name} ν˜•νƒœλ‘œ μ ‘κ·Όν•˜λ©΄ λœλ‹€.

Docker Compose - services μ„œλΉ„μŠ€ 배포

version: '2.23.1'

services:
  web:
    image: nginx:latest
    # ports:- "8080:80" κ³Ό 동일
    ports:
      - target: 80
        published: 8080
        protocol: tcp
        mode: HOST
    # κ°œλ°œλ˜λŠ” μ„œλΉ„μŠ€λ₯Ό μŠ€μΌ€μΌλ§ ν•˜κΈ° μœ„ν•œ μ˜΅μ…˜
    deploy:
      mode: replicated
      replicas: 3 # ν™•μž₯ μ‹œν‚€κ³ μž ν•˜λŠ” λ…Έλ“œμ˜ 개수
      resources: # μ§€μ •ν•˜κ³ μž ν•˜λŠ” λ¦¬μ†ŒμŠ€ ꡬ성 μˆ˜νŽ™
        limits: # cpu와 λ©”λͺ¨λ¦¬ μ œν•œ
          cpus: "0.5" # cpuλ₯Ό 전체 λΉ„μœ¨λ‘œ ν• λ‹Ή
          memory: 50M # memoryλ₯Ό 50λ©”κ°€λ°”μ΄νŠΈλ‘œ μ„€μ •
      restart_policy: # μž¬μ‹œμž‘ μ •μ±…
        condition: on-failure # 싀행이 μ‹€νŒ¨ν–ˆμ„ μ‹œ μž¬μ‹œμž‘       

deploy
Docker Compose의 β€˜deploy’ μ˜΅μ…˜μ€ μ„œλΉ„μŠ€λ₯Ό 배포할 λ•Œ μΆ”κ°€ 메타데이터λ₯Ό μ„ μ–Έν•˜λŠ” 데 μ‚¬μš©λœλ‹€

Docker Compose - network

network
networks μ˜΅μ…˜μ„ μ‚¬μš©ν•˜λ©΄ μ—¬λŸ¬ 개의 μ»¨ν…Œμ΄λ„ˆλ‘œ κ΅¬μ„±λœ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄μ—μ„œ μ»¨ν…Œμ΄λ„ˆ κ°„μ˜ 톡신을 μ„€μ •ν•  수 μžˆλ‹€.

ν•˜μ§€λ§Œ μ΄λŠ” ν˜„μž¬ μ›Ήκ³Ό DBκ°€ 같은 λ„€νŠΈμ›Œν¬λ₯Ό μ‚¬μš©ν•˜λ„λ‘ ν–ˆμ„ 뿐, μ‹€μ œλ‘œ λΆ€μ—¬λœ IPκ°€ μ—†μœΌλ―€λ‘œ 톡신은 λΆˆκ°€λŠ₯ν•˜λ‹€.

profile
뢉은 λ°° μ˜€μƒ‰ 딱닀ꡬ리 개발자 πŸ¦ƒCloud & DevOps
post-custom-banner

0개의 λŒ“κΈ€