[Docker] Docker 응용 (2)

Bzeromo·2025년 5월 21일
0

Infra, DevOps, MSA

목록 보기
27/28
post-thumbnail

🐳 Docker 응용 (2)


📌 도커 볼륨

컨테이너의 데이터 영속성과 데이터 공유를 위해 제공되는 특별한 저장소 메커니즘

  • 컨테이너 내부의 데이터는 기본적으로 일시적이어서 컨테이너가 삭제되면 함께 사라지지만, 볼륨을 사용하면 컨테이너의 생명주기와 무관하게 데이터를 안전하게 보존할 수 있음

  • 하나의 볼륨을 여러 컨테이너에 동시에 마운트하여 데이터를 공유할 수 있음

  • 볼륨은 컨테이너와 별도로 생성·삭제되며, 명시적으로 볼륨을 삭제하지 않는 한 데이터는 남아 있음

  • 도커 볼륨은 기본적으로 호스트 시스템의 /var/lib/docker/volumes/ 디렉터리 아래에 저장

볼륨의 종류

  • 도커 볼륨(Docker-managed Volume) - 추천

    • 도커 엔진이 직접 관리하는 볼륨으로, docker volume create 명령어로 생성
    • 도커가 내부적으로 저장 위치와 마운트, 관리 등을 담당
  • 바인드 마운트(Bind Mount)

    • 호스트의 특정 디렉터리를 컨테이너 내부에 직접 연결하는 방식
    • 도커의 관리 없이 호스트 파일 시스템을 직접 사용하므로, 보안상 권장되지 않음
  • tmpfs 마운트

    • 리눅스에서만 사용 가능하며, 호스트나 컨테이너 파일 시스템이 아닌 메모리에 데이터를 저장
    • 컨테이너가 살아있는 동안만 데이터가 유지되므로, 민감정보 임시 저장 등에 사용
  • 구분볼륨 마운트바인드 마운트
    관리 주체Docker가 직접 관리사용자가 직접 관리
    저장 위치Docker 내부 디렉토리호스트의 임의 경로
    권한/인식성권한 문제 적용, OS에 독립적권한 문제 발생 가능, OS에 종속적
    CLI/API 지원Docker 명령어로 관리 가능직접 파일/폴더 관리
    공유/백업/이동쉽고 안전하게 가능제한적, 수동 관리 필요
    사용 용도프로덕션, 데이터 안전한 공유개발 환경, 실시간 파일 공유

💡 이미 저장된 volume이 보고 싶다면?
docker volume ls

⚓ 볼륨 작성하기

# docker volume create [OPTIONS] [VOLUME]
docker volume create --name myvol01

# mountpoint 확인
docker volume inspect myvol01

⚓ 컨테이너에 볼륨 마운트하기

구분--volume(-v) 옵션--mount 옵션
구문짧고 간단명확하고 세부 설정 가능
사용 목적단순 볼륨/바인드 마운트복잡한 마운트, 여러 옵션 지정 필요 시
지원 타입volume, bind (tmpfs는 미지원)volume, bind, tmpfs 등 모두 지원
옵션 지정제한적 (읽기 전용 등 일부만 지원)type, source, target, readonly 등 다양
가독성/확장성간단한 상황에 적합복잡한 상황, 여러 마운트에 적합

🖥 볼륨을 이용한 컨테이너 생성 (-v)

# 볼륨을 이용한 컨테이너 생성
docker run -d --name postgres01 \
-e POSTGRES_PASSWORD=bzeromo \
-v postgresvol:/var/lib/postgresql/data \
postgres:15.13-bullseye

# 컨테이너 내부에서 사용자 추가
docker exec -it postgres01 /bin/bash

psql -U postgres

create user ubuntu password 'ubuntu';
\du
\q
exit

# 컨테이너 삭제
docker rm -f postgres01

# 새로운 컨테이너 생성 후 ubuntu 계정 확인
# 같은 볼륨을 활용했기 때문에 계정이 남아있어야 함
docker run -d --name postgres02 \
-e POSTGRES_PASSWORD=bzeromo \
-v postgresvol:/var/lib/postgresql/data \
postgres:15.13-bullseye

docker exec -it postgres02 /bin/bash
psql -U postgres
\du

🖥 bind mount를 활용한 컨테이너 생성 (-v)

# bind mount
mkdir -p ~/vols/nginx/html
mkdir -p ~/vols/nginx/conf.d

echo "<h1>Hello, Bzero? Bind mount time.</h1>" \
> ~/vols/nginx/html/index.html

docker run -d --name nginx01 \
-p 9090:80 \
-v ~/vols/nginx/html:/usr/share/nginx/html \
nginx

curl localhost:9090

# index.html 변경 후 확인
echo "<h2>Hello, mo? It's bind mount time.</h2>" \
>> ~/vols/nginx/html/index.html

curl localhost:9090

💡 이렇게 즉각적인 변화에는 bind mount가 유리할 수 있다.


📌 Docker Compose

Docker 컨테이너 애플리케이션을 정의하고 실행하기 위한 도구

  • 단일 명령어로 복잡한 다중 컨테이너 애플리케이션을 쉽게 배포, 관리할 수 있게 해 줌

    • YAML 파일을 사용하여 애플리케이션의 서비스 정의

    • 이 파일에는 서비스 이름, 사용할 이미지, 볼륨 마운트, 네트워크, 환경변수 등의 설정 포함

    • 하나의 애플리케이션을 구성하는 여러 개의 서비스(웹서버, 데이터베이스, 캐시 등)를 하나의 docker-compose.yml 파일로 정의하고 실행할 수 있음

    • 서비스 간의 의존성을 정의하면, 자동으로 해당 서비스들을 연결하고 통신할 수 있도록 설정

Docker Compose 사용사례

  • 개발 및 테스트 환경 설정:

    • 개발 및 테스트 환경을 빠르고 쉽게 설정할 수 있음
  • 마이크로서비스 애플리케이션 배포:

    • 여러 컨테이너로 구성된 마이크로서비스 애플리케이션을 배포하는 데 매우 유용
  • CI/CD 파이프라인 자동화:

    • CI/CD 파이프라인을 자동화하고 이미지 빌드 및 배포 프로세스를 간소화할 수 있음

⚓ 최상위 속성

속성명설명
versionCompose 파일의 포맷 버전 지정. 파일 내에서 사용 가능한 기능과 문법을 결정
최신 Compose에서는 version 명시를 생략하는 경우도 있음
services실제로 실행할 컨테이너 서비스들의 목록 정의. 각 서비스는 별도의 컨테이너로 동작하며, 이미지, 빌드, 환경 변수, 포트, 볼륨, 네트워크 등 다양한 하위 설정을 포함
networks서비스 간 통신을 위한 사용자 정의 네트워크 정의
네트워크 이름, 드라이버(bridge, overlay 등), 옵션 등을 지정할 수 있음
volumes컨테이너와 호스트 간, 또는 컨테이너 간에 데이터를 공유할 수 있는 볼륨 정의
볼륨의 이름, 드라이버, 옵션 등을 설정할 수 있음
configs(Swarm 환경) 서비스에서 사용할 설정 파일 정의
Swarm 모드에서 주로 사용하며, 민감하지 않은 설정 정보를 안전하게 배포할 수 있음
secrets(Swarm 환경) 서비스에서 사용할 민감 정보(예: 비밀번호, 인증서 등)를
안전하게 저장하고 배포할 때 사용
extensionsx-로 시작하는 커스텀 확장 속성으로, 반복되는 설정을 재사용하거나 템플릿처럼 활용할 때 사용
공식 스펙에는 포함되지 않지만, YAML의 anchor/alias와 함께 자주 활용

⚓ Services 하위 속성

속성설명
image사용할 도커 이미지 이름 지정. 예: nginx:latest
buildDockerfile 위치나 빌드 컨텍스트 지정. image와 함께 사용 시 빌드 후 해당 이름으로 태그됨
ports호스트와 컨테이너 간 포트 매핑 지정. "호스트포트:컨테이너포트" 형식
volumes호스트↔컨테이너, 컨테이너↔컨테이너 간 디렉터리 또는 볼륨 매핑. "호스트경로:컨테이너경로" 또는 "볼륨명:경로"
environment환경 변수 지정. key-value 쌍 또는 리스트 형식 모두 지원
env_file환경 변수 목록 파일 지정. environment에서 덮어쓸 수 있음
command컨테이너 시작 시 실행할 명령 지정 (Dockerfile의 CMD 덮어씀)
entrypoint컨테이너 시작 시 실행할 엔트리포인트 지정 (ENTRYPOINT 덮어씀)
depends_on해당 서비스 실행 전 필요한 다른 서비스 지정. 실행 순서 제어 목적
links연결할 다른 서비스 지정. 같은 네트워크에 연결됨 (구버전 방식)
networks컨테이너가 연결될 사용자 정의 네트워크 지정. 다중 네트워크도 가능
restart컨테이너 재시작 정책 지정. 예: always, on-failure
healthcheck컨테이너 상태 확인용 명령과 조건 지정. 주기적 상태 체크
deploy(Swarm 전용) 복제 수, 배치 조건, 리소스 제한 등 배포 전략 지정
labels컨테이너에 메타데이터(라벨) 추가. 관리/검색/오케스트레이션에 활용
extra_hosts컨테이너의 /etc/hosts 파일에 추가할 호스트 정보 지정
user컨테이너 내에서 사용할 사용자(UID/GID) 지정
working_dir컨테이너 내 작업 디렉터리 지정
ttyTTY 할당 여부 지정. 대화형 터미널 사용 시 유용
stdin_open표준 입력 유지 여부 지정. 대화형 세션 지원 시 사용

🖥 compose.yaml파일 예시

version: "3.9"  # Compose 파일 버전(생략 가능)

services:       # 컨테이너 서비스 목록
  서비스이름:
    image: 이미지명:태그           # 사용할 도커 이미지
    build: .                      # Dockerfile로 이미지 빌드
    command: ...                  # 컨테이너 시작 시 실행할 명령
    entrypoint: ...               # 컨테이너 시작 시 ENTRYPOINT 지정
    ports:                        # 포트 매핑 (호스트:컨테이너)
      - "8080:80"
    expose:                       # 컨테이너 내부 포트만 노출(호스트에는 노출X)
      - "3306"
    volumes:                      # 볼륨/바인드 마운트
      - ./data:/var/lib/mysql
    environment:                  # 환경 변수
      - MYSQL_ROOT_PASSWORD=1234
      - TZ=Asia/Seoul
    depends_on:                   # 의존 서비스(먼저 실행)
      - db
    networks:                     # 네트워크 지정
      - frontend
      - backend

volumes:                          # 볼륨 정의
  data-volume:

networks:                         # 네트워크 정의
  frontend:
  backend:

.yaml 형식 파일의 들여쓰기는 tab 한번이자 3번 띄어쓰기임을 기억하자

profile
Hodie mihi, Cras tibi

0개의 댓글