docker compose?

  • 다중 컨테이너 애플리케이션을 정의하고 실행하는 도구
  • 전체 애플리케이션 스택의 제어를 간소화하여 서비스, 네트워크 및 볼륨을 이해하기 쉬운 단일 YAML 구성 파일로 쉽게 관리
  • 단일 명령으로 구성 파일에서 모든 서비스를 생성하고 시작

 

docker compose 파일 

  • 사용하는 컴포즈 파일 : 현재 작업 디렉터리에 있는 다음의 파일 사용 
    • compose.yaml (권장) / compose.yml 
    • docker-compose.yaml / docker-compose.yml

 

 

compose.yaml 파일 구성  

  • services: 여러 서비스를 정의 (이름을 string으로)
    •  서비스 이름과 각 서비스 컨테이너에 적용되는 구성이 포함
  • build: 소스에서 컨테이너 이미지를 생성하기 위한 빌드 구성을 지정
  • ports: 호스트 머신과 컨테이너 간의 포트 매핑을 정의
  • image: 컨테이너를 시작할 이미지를 지정
  • environment: 컨테이너에 설정된 환경 변수를 정의
  • volumes: 서비스 컨테이너가 액세스할 수 있는 마운트 호스트 경로 또는 명명된 볼륨을 정의
  • network: 서비스 컨테이너가 연결되는 네트워크를 정의
  • depends_on: 서비스 시작 및 종료 순서를 제어
  • driver_opts: 드라이버에 전달할 키-값 쌍 형태의 옵션 목록을 지정
  • command: 컨테이너 이미지에서 선언된 기본 명령을 재정의
  • restart: 컨테이너 종료 시 플랫폼이 적용하는 정책을 정의
    • restart options :
      • "no": (기본값) 재시작하지 않음
      • always: 컨테이너가 제거될 때까지 항상 컨테이너를 다시 시작
      • on-failure[:max-retries]: 종료 코드가 오류를 나타내는 경우 컨테이너를 다시 시작. [선택적으로 Docker 데몬의 재시작 재시도 횟수를 제한]
      • unless-stopped: 종료 코드와 관계없이 컨테이너를 다시 시작, 서비스가 중지되거나 제거되면 다시 시작을 중지
  • configs: Docker 이미지를 다시 빌드할 필요 없이 서비스가 동작을 조정할 수 있도록 함
  • secrets: 민감한 데이터에 대한 접근 권한을 서비스별로 부여

 

예시 

# compose.yaml

services:
  frontend:
    image: example/webapp
    ports:
      - "443:8043"
    networks:
      - front-tier
      - back-tier
    configs:
      - httpd-config
    secrets:
      - server-certificate

  backend:
    image: example/database
    volumes:
      - db-data:/etc/data
    networks:
      - back-tier

volumes:
  db-data:
    driver: flocker
    driver_opts:
      size: "10GiB"

configs:
  httpd-config:
    external: true

secrets:
  server-certificate:
    external: true

networks:
  # The presence of these objects is sufficient to define them
  front-tier: {}
  back-tier: {}
    • services: 컨테이너로 실행될 서비스 정의
      • frontend 
        • image: example/webapp 이미지를 기반으로 컨테이너 실행
        • ports: 호스트의 443 포트를 컨테이너의 8043 포트에 매핑 (HTTPS 사용 목적)
        • networks: front-tier, back-tier 네트워크에 연결
        • configs: 외부에서 정의된 httpd-config 설정을 주입
        • secrets: server-certificate라는 외부 비밀 데이터를 주입 (보통 SSL 인증서)
        • => frontend 서비스는 웹 서버 역할을 하며 HTTPS 통신을 위한 인증서와 설정 파일이 필요하고, backend와도 통신해야 하므로 두 네트워크에 모두 연결됨 
      • backend
        • image: example/database 이미지를 기반으로 실행
        • volumes: db-data 볼륨을 /etc/data에 마운트
        • networks: back-tier 네트워크에만 연결
        • => backend는 데이터 저장 역할을 하며, db-data 볼륨을 통해 데이터를 유지. frontend와만 통신 가능하도록 back-tier만 연결.
    • volumes: 서비스에 마운트할 외부 스토리지 설정
      • db-data: 이름이 지정된 볼륨
      • driver: flocker: Flocker라는 스토리지 드라이버 사용 (컨테이너 간 데이터 공유 및 영속성을 보장)
      • driver_opts: 크기를 10GiB로 제한
      • => backend가 사용하는 DB 데이터를 외부 스토리지에 영속적으로 저장
  • configs: 서비스에 주입할 외부 설정 파일
    • 외부에 존재하는 설정 파일 (httpd-config)을 Compose 파일에서 참조만 함
    • frontend 서비스에서 사용
    • => 컨테이너에서 필요한 웹 서버 설정 파일을 미리 준비해두고 재사용
  • secrets: 보안 상 민감한 정보 (예: 인증서, 비밀번호 등)
    • 외부에 이미 존재하는 server-certificate 비밀 정보를 Compose에서 참조
    • =>  HTTPS 구성을 위한 SSL 인증서 또는 개인키 등을 안전하게 전달
         
  • networks: 서비스 간 통신을 위한 네트워크 정의
    • 빈 객체로 정의만 하면 Docker가 기본 설정으로 네트워크 생성
    • front-tier: 외부 통신 또는 사용자와 연결되는 네트워크
    • back-tier: frontendbackend 간 내부 통신 전용 네트워크
    • => 네트워크 분리 이유: 보안성과 효율성을 위해 외부와 내부 네트워크를 구분

 

 

docker compose 명령어 

$ docker compose [OPTIONS] COMMAND

 

Options: 

  • -f, --file stringArray                  Compose configuration files
  • -p, --project-name string        Project name

 

Commands :

      • build       Build or rebuild services
      • up           Create and start containers
      • down      Stop and remove containers, networks
      • logs        View output from containers
      • ps           List containers
      • restart    Restart containers

 

 


* docker compose 
https://docs.docker.com/compose/

* Compose file reference
https://docs.docker.com/reference/compose-file/

 

'! > docker' 카테고리의 다른 글

docker network  (0) 2025.04.15
docker volume, bind mounts  (0) 2025.04.12
Dockerfile  (0) 2025.04.04
Docker CLI 명령어  (0) 2024.11.14
Docker 설치 (MacOS)  (0) 2022.09.05

JSON 파일?

  • JavaScript Object Notation
  • 이름-값 쌍과 배열로 구성된 데이터 객체를 저장하고 전송하는 개방형 표준 파일 형식이자 경량의 데이터 교환 형식
  • 사람이 읽고 쓰기에 용이하며, 기계가 분석하고 생성함에도 용이
  • 확장자 : .json

 

구조

 

1. 주석 

  • // (한줄)
  • /* */ (여러줄)

 

2. 값

  • string(""), number, true, false, null, object({ }), array([ ]) 

 

3. object (객체)

  • { } 
  • 객체는 {} (중괄호) 문자 안에 이름 : 값 쌍들을 ,(콤마) 로 구분 
  • 비순서화된 SET

 

4. array (배열) 

  • [ ]
  • 배열은 [] (대괄호) 문자 안에 ,(콤마) 로 값 구분
  • 순서 존재

 

{
  "이름 공간(키)": "값",
  "값 구분자": "각각의 값들은 ',' (콤마)로 구분되어야 합니다.",
  "이스케이프": "키나 값에서 큰따옴표를 쓰고 싶으면-특정 문자를 이스케이프하려면- \"처럼 문자 앞에 역슬래시를 붙입니다.",
  "자료형": "표현 가능한 자료형은 문자열, 숫자, 불리언, 널, 객체, 배열 6개입니다.",
  "문자열값": "나무위키, 여러분이 가꾸어 나가는 지식의 나무",
  "숫잣값": 19721121,
  "불리언값": true,
  "널값": null,
  "객쳇값": {
    "값 1": 3.14159265358979323846264338,
    "값 2": false,
    "값 3": {
      "객체 안에": "객체를 넣는 것도 가능하지요",
      "구분자": "또한 키와 값은 ':'로 구분됩니다"
    }
  },
  "배열값": [
    "이것은 배열입니다.",
    {
      "현잿값의 인덱스": 1,
      "이런 식으로": "배열 안에 여러 값을 넣을 수 있습니다."
    },
    [ "배열", "안에", "배열을", "넣는 것도", "가능하지요" ]
  ],
  "값의 개수가 적을 때는": "다음과 같이 한 줄로도 객체와 배열 표현이 가능합니다.",
  "한 줄 객체": { "1": "one", "2": "two", "3": "three" ,  "4": "four" },
  "한 줄 배열": [ "1", "2", "3", "4", "5", "6" ]
}

 

 

 

자주 쓰이는 JSON 파일 예시 (from.gpt) 

1. 앱 설정 파일 (config.json)

{
  "app_name": "MyCoolApp",
  "version": "1.0.0",
  "debug": true,
  "server": {
    "host": "127.0.0.1",
    "port": 8000
  }
}

 

  • Python, Node.js 등 백엔드 앱의 설정 파일
  • server 안에 중첩된 구조로 호스트/포트를 설정함

 

2. 사용자 정보 예시 (user.json)

{
  "id": 1,
  "username": "johndoe",
  "email": "johndoe@example.com",
  "roles": ["admin", "editor"]
}
  • 로그인한 사용자 정보를 표현
  • roles처럼 배열이 자주 사용됨
  • 인증 토큰 발급 시 정보로도 활용됨

 

3. API 응답 예시 (response.json)

{
  "status": "success",
  "data": {
    "title": "JSON 예제",
    "views": 123,
    "tags": ["json", "example", "api"]
  }
}
  • REST API에서 반환하는 구조
  • status는 응답 상태
  • data 안에 실제 정보 포함 (중첩 구조)

 

4. 테스트 설정 예시 (test_config.json)

{
  "database": {
    "engine": "sqlite",
    "path": "test.db"
  },
  "log_level": "debug",
  "mock": true
}
  • 테스트 실행 시 사용할 DB 설정, 로그 레벨 등
  • 실제 환경과 격리된 테스트 환경용

 

 

 


* json
https://www.json.org/json-en.html

* wikipedia/json
https://en.wikipedia.org/wiki/JSON

* 나무위키/json
https://namu.wiki/w/JSON

'! > 파일' 카테고리의 다른 글

INI  (0) 2025.04.15
YAML  (0) 2025.04.15

INI 파일?

  • Initialization 
  • 설정 파일에 대한 사실상 표준
  • 확장자 : .ini 

 

기본 구조 

 

1. 주석

  • ;

 

2. 키-값 쌍  

  • 키 = 값
var = a       ; This is an inline comment
foo = bar     # This is another inline comment

 

 

3. 섹션 

  • [section] 
  • 키-값 쌍은 섹션 아래에 그룹화
  • 모든 타입은 문자열로 저장됨
; 홍길동이 2001년 4월 1일에 마지막으로 수정하였음
[owner]
name=홍길동
organization=최고의 제품

[database]
server=192.0.2.62     ; 네트워크 이름 변환이 동작하지 않는 경우 IP 주소를 사용한다
port=143
file="payroll.dat"

 

 

 

ini 파일 예시 (from.gpt) 

  • 설정 파일 예시 
# config.ini
[app]  ; 애플리케이션 기본 설정
name = MyCoolApp
version = 1.0.0
debug = true

[server]  ; 서버 관련 설정
host = 127.0.0.1
port = 8080

[database]  ; DB 접속 정보
engine = mysql
host = localhost
port = 3306
user = myuser
password = mypass
name = mydatabase

 

 

 


* ini 파일 
https://ko.wikipedia.org/wiki/INI_%ED%8C%8C%EC%9D%BC#:~:text=INI(Initialization)%20%ED%8C%8C%EC%9D%BC%20%ED%8F%AC%EB%A7%B7%EC%9D%80,%EC%B2%B4%EC%A0%9C%EC%97%90%EC%84%9C%EB%8F%84%20%EC%82%AC%EC%9A%A9%ED%95%A0%20%EC%88%98%20%EC%9E%88%EB%8B%A4.

'! > 파일' 카테고리의 다른 글

JSON  (0) 2025.04.15
YAML  (0) 2025.04.15

YAML 파일? 

  • YAML Ain't Markup Language
  • 사람이 읽기 쉬운 데이터 직렬화 언어
  • 파일 확장자 : .yaml / .yml

 

구조

 

1. 주석

  • #

 

2. 리스트

  • 하이픈+공백을 사용하여 목록에서 새 항목을 시작
# Favorite movies
- Casablanca
- North by Northwest
- The Man Who Wasn't There

 

 

3. 키/값 쌍 

  • 키: 값
  • 들여쓰기와 줄바꿈을 사용하여 키/값 쌍을 구분
  • 쉼표(,)와 공백을 사용하여 중괄호 안에 있는 키/값 쌍을 구분
--- # Indented Block
  name: John Smith
  age: 33
  
--- # Inline Block
{name: John Smith, age: 33}

 

 

4. 긴 문장 

  • 문자열에 따옴표를 보통 사용하지 않음 
  • >
  • |
  • >,| + 줄바꿈 문자와 함께 사용 
data1: |
   There once was a tall man from Ealing
   Who got on a bus to Darjeeling
       It said on the door
       "Please don't sit on the floor"
   So he carefully sat on the ceiling
   
data2: >
   Wrapped text
   will be folded
   into a single
   paragraph

   Blank lines denote
   paragraph breaks

 

 

5. 중첩 구조

  • 들여쓰기로 중첩 구조를 나타냄
receipt:     Oz-Ware Purchase Invoice
date:        2012-08-06
customer:
    first_name:   Dorothy
    family_name:  Gale

items:
    - part_no:   A4786
      descrip:   Water Bucket (Filled)
      price:     1.47
      quantity:  4

    - part_no:   E1628
      descrip:   High Heeled "Ruby" Slippers
      size:      8
      price:     133.7
      quantity:  1

 

 

6. 단일 스트림 내의 여러 문서

  • --- 
--- # The Smiths
- {name: John Smith, age: 33}
- name: Mary Smith
  age: 27
- [name, age]: [Rae Smith, 4]   # sequences as keys are supported

--- # People, by gender
men: [John Smith, Bill Jones]
women:
  - Mary Smith
  - Susan Williams

 

 

 

자주 쓰이는 YAML 파일 예시 (from.gpt) 

 

1. CI/CD (예: GitHub Actions workflow)

  • GitHub Actions를 이용한 CI/CD 파이프라인 설정 예시
# .github/workflows/deploy.yml
name: Deploy App  # 워크플로 이름

on:
  push:
    branches: [ main ]  # main 브랜치에 push될 때 실행

jobs:
  deploy:
    runs-on: ubuntu-latest  # 가상환경 OS

    steps:
      - name: Checkout repository
        uses: actions/checkout@v3  # 코드 체크아웃

      - name: Set up Python
        uses: actions/setup-python@v4  # Python 환경 설정
        with:
          python-version: '3.10'

      - name: Install dependencies
        run: pip install -r requirements.txt  # 의존성 설치

      - name: Run tests
        run: pytest  # 테스트 실행

      - name: Deploy to server
        run: |
          echo "Deploying..."  # 실제 배포 명령 (예: ssh, rsync 등 사용 가능)

 

 

2. Docker compose 

  • 여러 컨테이너를 함께 정의하는 Docker Compose 설정 예시
# docker-compose.yml
version: '3.8'  # Compose 파일 버전

services:
  db:
    image: mysql:8  # 사용할 이미지
    environment:
      MYSQL_ROOT_PASSWORD: example  # 루트 비밀번호
      MYSQL_DATABASE: mydb  # 생성할 데이터베이스 이름
    ports:
      - "3306:3306"  # 호스트:컨테이너 포트 매핑
    volumes:
      - db_data:/var/lib/mysql  # 데이터 유지용 볼륨

  web:
    build: .  # 현재 디렉터리에서 Dockerfile 빌드
    ports:
      - "8000:8000"
    depends_on:
      - db  # db가 먼저 실행돼야 web 서비스가 시작됨

volumes:
  db_data:  # named volume 정의

 

ports:

 - "3306:3306"

  • YAML은 문자열에 따옴표(")를 꼭 쓸 필요는 없지만, 콜론(:) 문자가 있으면 key-value pair로 착각하여 문자열로 인식하기 위해서 따옴표(")를 사용 

 

3. Kubernetes Deployment

  • Kubernetes 애플리케이션 배포 설정 예시
# deployment.yaml
apiVersion: apps/v1  # 사용할 API 버전
kind: Deployment  # 리소스 종류

metadata:
  name: my-app  # Deployment 이름

spec:
  replicas: 3  # 파드 수
  selector:
    matchLabels:
      app: my-app  # 어떤 파드를 관리할지 정의

  template:
    metadata:
      labels:
        app: my-app  # 파드에 붙일 레이블
    spec:
      containers:
      - name: my-container  # 컨테이너 이름
        image: my-image:latest  # 사용할 Docker 이미지
        ports:
        - containerPort: 80  # 컨테이너 내부 포트

 

 

4. Configuration File (예: Python 앱 설정 등)

  • Python 애플리케이션 설정 파일 예시
# config.yaml
app:
  name: my-data-app  # 앱 이름
  version: 1.0.0  # 버전 정보

database:
  host: localhost  # DB 호스트
  port: 3306  # 포트 번호
  user: root  # 사용자
  password: secret  # 비밀번호
  name: mydb  # 데이터베이스 이름

logging:
  level: INFO  # 로그 레벨
  file: logs/app.log  # 로그 파일 경로

 

 


* YAML
https://en.wikipedia.org/wiki/YAML

'! > 파일' 카테고리의 다른 글

JSON  (0) 2025.04.15
INI  (0) 2025.04.15

+ Recent posts