TIL

9_3.Docker 네트워크 및 데이터 관리

꿀승 2025. 2. 20. 09:13
728x90
반응형
SMALL

학습내용

  1. Docker 네트워크
  2. Docker 데이터 관리
  3. Docker 볼륨 마이그레이션 방법
  4. 컨테이너 간 바인드 마운트 활용 마이그레이션

학습정리

1. Docker 네트워크

  • Docker 컨테이너 간 통신을 관리하는 기능

  • 네트워크 종류

    드라이버 설명 주요 특징 사용 예시
    bridge 기본 네트워크 컨테이너 간 통신 가능, DNS 지원 단일 호스트 내 컨테이너 간 통신
    host 호스트 네트워크 사용 포트 매핑 불필요, 성능 최적화 성능이 중요한 애플리케이션
    none 네트워크 없음 보안성이 높음, 외부 연결 불가 네트워크를 사용하지 않는 컨테이너
    overlay 여러 호스트 연결 Swarm 모드 필요, 컨테이너 간 자동 DNS 여러 호스트에 걸친 서비스
    macvlan 물리 네트워크 인터페이스 사용 개별 MAC 주소 할당 네트워크 장비와 직접 통신
  • bridge 네트워크

    • 기본 bridge 네트워크에서는 컨테이너간 통신이 안되지만, 커스텀 bridge 네트워크로 통신 가능

      # 네트워크 생성
      docker network create my-network
      
      # 컨테이너 실행 (my-network에 연결)
      docker run -d --name svc3 --network=my-network busybox sleep infinity
      docker run -d --name svc4 --network=my-network busybox sleep infinity
      
      # 컨테이너 간 핑 테스트
      docker exec -it svc3 ping svc4
      
      -------------------------------------------------
      PING svc4 (172.21.0.3): 56 data bytes
      64 bytes from 172.21.0.3: seq=0 ttl=64 time=0.300 ms
      64 bytes from 172.21.0.3: seq=1 ttl=64 time=0.161 ms
      64 bytes from 172.21.0.3: seq=2 ttl=64 time=0.119 ms
      64 bytes from 172.21.0.3: seq=3 ttl=64 time=0.174 ms
      64 bytes from 172.21.0.3: seq=4 ttl=64 time=0.196 ms
  • host 네트워크

    • 컨테이너가 호스트 시스템의 네트워크 인터페이스를 그대로 사용

    • 컨테이너가 호스트에서 직접 실행 하는 것 처럼 작동

      docker run -d --network host nginx
      
      docker exec -it 18e2e2af8577 curl -v http://localhost
  • None 네트워크

    • 컨테이너가 외부 네트워크와 연결되지 않도록 하는 네트워크

      # None 네트워크를 사용하는 컨테이너 생성
      docker run --network none --name no-net-container alpine:latest
      
      # 컨테이너 내부에서 네트워크 인터페이스 확인
      docker exec no-net-container ip addr
  • Overlay 네트워크

    • 여러 Docker 호스트에 걸쳐 컨테이너들을 연결하는 네트워크로, Docker Swarm 모드에서 사용됨.
  • macvlan 네트워크

    • 컨테이너가 물리 네트워크의 MAC 주소를 직접 받아 물리적 네트워크 인터페이스처럼 동작할 수 있도록 함

2. Docker 데이터 관리

  • Docker 데이터 관리

    스토리지 유형 설명 데이터 지속성 성능 사용 사례
    Container Storage 컨테이너 내부에 저장되는 임시 저장소로, 컨테이너 삭제 시 데이터도 함께 사라짐 컨테이너 생명주기와 동일 디스크 속도에 의존 테스트 환경, 임시 데이터 처리
    Bind Mounts 호스트의 디렉토리나 파일을 컨테이너에 직접 마운트함. 호스트와 컨테이너 사이에서 파일 시스템을 공유 호스트 시스템에 의존, 컨테이너보다 오래 지속 호스트 파일 시스템의 속도에 의존 개발 환경, 설정 파일, 로그 파일의 지속적 관리
    Volumes Docker가 관리하는 호스트 파일 시스템의 일부 영역에 데이터를 저장. 컨테이너와 독립적으로 관리됨 컨테이너와 독립적으로 지속 일반적으로 높은 I/O 성능 프로덕션 데이터 저장, 데이터베이스 관리
    Tmpfs Mount 메모리에 저장되며, 컨테이너 재시작 시 데이터가 유실됨. 높은 속도의 데이터 접근을 제공함 실행 중인 컨테이너에서만 지속 매우 높은 속도 (RAM 기반) 민감한 정보 처리, 임시 캐시 생성
  • Container Storage

    • 컨테이너 내에 데이터를 저장하며, 컨테이너가 삭제되면 데이터도 함께 삭제됩니다. 이 방식은 일시적인 데이터 저장이나 실험적 환경에 적합합니다.
  • Bind Mounts

    • 개발 과정에서 호스트 시스템의 파일이나 디렉토리를 컨테이너와 공유할 때 사용합니다. 코드나 리소스를 컨테이너와 실시간으로 공유할 수 있어 편리합니다.
    • 예시
      mkdir -p docker_data
      echo "Hello Bind Mount" > docker_data/hello.txt
      docker run --rm -v ./docker_data:/data busybox cat /data/hello.txt
  • Volumes

    • Docker가 직접 관리하는 방식으로, 컨테이너가 삭제되어도 볼륨에 저장된 데이터는 유지됩니다. 데이터베이스나 중요한 파일 저장에 사용됩니다.
    • 예시
      docker volume create my_volume
      docker volume ls | grep my_volume
      docker run -d --name vol_test -v my_volume:/data busybox tail -f /dev/null
      docker inspect my_volume  # 볼륨 상세 정보 확인
      docker exec -it vol_test sh -c "echo 'Hello Volume' > /data/test.txt"
      docker rm -f vol_test
      docker run --rm -v my_volume:/data busybox cat /data/test.txt
  • Tmpfs Mounts

    • 메모리에 데이터를 저장하여 처리 속도가 매우 빠르나, 컨테이너가 종료되면 데이터는 사라집니다. 보안이 중요한 임시 데이터 처리에 적합합니다.
  • 자주 사용 되는 Volumes vs Bind Mounts 비교

    특징 Docker Volume Bind Mount
    저장 위치 /var/lib/docker/volumes/ (Docker가 관리) 지정된 호스트 디렉토리 사용
    컨테이너 독립성 컨테이너 삭제 후에도 데이터 유지 (Production 환경에 적합) 컨테이너와 직접 연결
    (로컬 개발 환경에 적합)
    권한 관리 Docker가 관리하여 더 안전함 호스트의 파일 시스템 권한이 필요
    사용 예시 데이터베이스, 로그 저장 로컬 개발, 설정 파일 공유

3. Docker 볼륨 마이그레이션 방법

  • 기존 컨테이너 볼륨 데이터 백업 및 복원

    1. 볼륨을 사용하는 컨테이너 실행
      docker run -d --name old-container -v myvolume:/data busybox sh -c 'echo "Hello, Docker!" > /data/test.txt'
    2. 볼륨 데이터 백업
      docker run --rm --volumes-from old-container -v $(pwd):/backup busybox tar cvf /backup/myvolume.tar /data
    3. 새 컨테이너에 복원
      # newvolume:/data → 새로운 볼륨 newvolume을 /data에 마운트
      # $(pwd):/backup → 현재 디렉토리를 /backup으로 마운트
      # tar xvf /backup/myvolume.tar -C / → /backup/myvolume.tar을 /data에 복원
      docker run --rm -v newvolume:/data -v $(pwd):/backup busybox tar xvf /backup/myvolume.tar -C /
    4. 복원 확인
      docker run --rm -v newvolume:/data busybox cat /data/test.txt
  • 볼륨을 직접 다른 컨테이너에서 마운트

    # --volumes-from old-container:  old-container에서 사용한 볼륨을 new-container에서도 동일하게 마운트
    docker run -d --name new-container --volumes-from old-container busybox tail -f /dev/null
    
    docker exec -it new-container ls /data

4. 컨테이너 간 바인드 마운트 활용 마이그레이션

  • 컨테이너 간 바인드 마운트 이용한 데이터 공유
    1. 호스트 디렉토리 컨테이너에 마운트
      mkdir -p ~/docker-data
      echo "Bind Mount Test" > ~/docker-data/test.txt
      docker run -d --name bind-container -v ~/docker-data:/app/data busybox tail -f /dev/null
    2. 컨테이너 내부에서 데이터 확인
      docker exec -it bind-container ls /app/data
    3. 새로운 컨테이너에서 동일한 데이터 마운트
      docker run -d --name new-bind-container -v ~/docker-data:/app/data busybox tail -f /dev/null
      docker exec -it new-bind-container cat /app/data/test.txt
  • 바인드 마운트를 활용해서 코드 변경
    1. 코드가 있는 폴더 생성
      mkdir -p ~/flask-app
      echo 'print("Hello from Flask!")' > ~/flask-app/app.py
    2. 컨테이너 실행하면서 바인드 마운트 설정
      docker run -d --name flask-container -v ~/flask-app:/app python:3.9-slim python /app/app.py
    3. 호스트에서 코드 변경
      echo 'print("Updated Flask App!")' > ~/flask-app/app.py docker restart flask-container

참고자료

Docker(1)_Dockerfile, Volume,Network

728x90
반응형
LIST