개발 기록장

03. Docker Volume과 다수 컨테이너 SW 다루기 본문

데브코스(DE)/Docker & K8S

03. Docker Volume과 다수 컨테이너 SW 다루기

jxwxnk 2024. 5. 29. 23:29
반응형

학습 주제: Docker Volume, 컨테이너와 이미지 삭제(클린업), 다수의 컨테이너로 구성된 소프트웨어 실행, Docker-Compose

Docker Volume

Docker Volume의 필요성

  • Docker Container가 실행되었다가 중단되었을때의 데이터 처리
  • 특정 소프트웨어가 Docker Container를 통해 일회성으로 동작하는 것이 아닌 계속해서 동작해야 한다면 데이터가 영구적으로 보관 되어야 함
    • ex) 데이터베이스가 Docker Container안에서 동작하는데 잠시 컨테이너를 중단해도 데이터가 날아가면 안됨
  • 이런 Data Persistence 보장하는 기능이 Docker Volumes
  • Docker Container내의 가상 파일 시스템과 호스트 시스템의 파일 시스템을 매핑
    • ex) 호스트 파일 시스템의 /home/jiwon/logs를 Docker Container의 /var/lib/airflow/logs로 맵핑
    • 이 경우 Docker Container가 중단되더라도 모든 Airflow logs는 기록이 남게 됨

Docker Volume의 예시) Container와 Host 시스템이 특정 폴더를 공유

  • Container가 사라지더라도 데이터를 남게 하는 것
  • Container로 MySQL을 실행하는 경우 데이터가 저장되는 공간을 Docker Volume으로 설정

Docker Volume의 정의

  • 호소트 파일 시스템 폴더를 Docker Container 파일 시스템의 폴더로 마운트 하는 것
    • 호스트쪽에서 내용을 바꾸면 바로 Docker Container 쪽에도 반영됨(반대도 가능)
      • 이를 통해 Docker Container의 상태와 관계없이 데이터를 영구적으로 변환
  • 파일 시스템 마운트:
    • 원래 마운트란 디스크와 같은 물리적인 장치를 파일 시스템의 특정 위치(폴더)에 연결해주는 것을 말함
    • 예를 들어 윈도우에서 USB를 꼽으면 내 컴퓨터에 새로운 :D 혹은 :E와 같은 새로운 폴더가 생기는 것이 마운트임

Docker Volume 타입

  • Host Voluems: docker run -v를 실행할 때 페어로 지정
    • docker ruen -v /home/jiwon/logs:/var/lib/airflow/logs
    • :앞이 호스트 파일 시스템 path이고 뒤가 컨테이너 파일 시스템 path
  • Anonymous Volumes: docker run -v를 실행할 때 패스만 지정
    • docker run -v /var/lib/mysql/data
    • 이 방식이 Dockerfile에서 사용되는 방식으로 호스트 쪽에 액세스 되지 않지만 재시작 해도 유지됨
  • Named Volumes: docker run -v를 실행할 때 이름과 컨테이너 패스를 지정
    • docker run -v name:/var/lib/mysql/data
    • 가장 선호되는 방식(가장 많이 쓰임). 이 방식이 하나의 Volume을 다수의 컨테이너에서 공유하는 것도 가능하게 함
    • 이 포맷으로 docker-compose에서도 사용됨

Volume을 Readonly로 지정하고 싶다면?

  • name:/var/lib/mysql/data: ro

Docker 환경 클린업: 컨테이너와 이미지 삭제

Using 커맨드 라인

  • Image를 삭제하려면 실행 중인 Container가 없어야 함
    • 순서: Container 중단 -> Container 삭제 -> Image 삭제
  • 컨테이너 삭제
    • docker container ls -> container Id 개별적으로 docker container rm 뒤에 추가 해야함
      • ex) $ docker container rm cfb08d30f4ec f2a8dcac5aca cb46ab7b4957
    • 일괄 삭제: $ docker container rm -f $(docker container ls -aq)
      • docker container ls -aq은 현재 존재하는 모든 container id 리스팅 -> 이것이 삭제 인자로 적용
  • 이미지 삭제
    • docker image ls -> image Id 개별적으로 docker image rm 뒤에 추가 해야함
    • 일괄 삭제: $ docker image rm -f $(docker image ls -q)
  • 삭제 확인
    • docker ps
    • docker images
    • docker image ls

Using Docker Desktop

  • Docker Desktop에서 모두 삭제하는 것이 가장 직관적임
    • Desktop에서 Troubleshoot 메뉴 -> clear/Purge data: 일괄 삭제됨

다수의 컨테이너가 존재하는 프로그램 다루기

실행할 프로그램 설명

5개의 컨테이너 따로 다루기

  • 이미지 빌드(./~에 있는 Dockerfile읽어 이미지 빌드)

    • vote 이미지 빌드: docker build -t vote ./vote
    • result 이미지 빌드: docker build -t result ./result
    • worker 이미지 빌드: docker build -t worker ./worker
    • redis와 postgres는 공식 이미지이므로 빌드할 필요 X
    • 빌드된 이미지 목록 확인: docker images
  • 컨테이너 실행

    • docker run -d --name=redis redis
    • docker run -d -e POSTGRES_PASSWORD=postgres --name=db postgres
    • docker run -d --name=vote -p 5001:80 vote
    • docker run -d --name=result -p 5002:80 result
    • docker run -d --name=worker worker
  • 결과: 컨테이너를 모두 각각 실행했으므로 각 컴포넌틀간의 네트워크 연결이 안됨 즉, 투표 결과가 DB에 저장 X -> result에 결과 안 넘어옴 문제

하나의 컨테이너로 다루기

  • 위의 문제를 해결하기 위해 network를 하나 만들고 모든 컨테이너들을 이 네트워크 안으로 지정

    • docker의 network 기능 사용(전에는 docker run의 link 옵션 사용)
    • 연결 상황에 따라 별개의 네트워크를 만들고 사용도 가능함
      • back-tier
      • front-tier
    • 예제에서는 mynetwork를 하나 만들고 진행
  • docker network create

    • 위에서 따로 만든 것들 삭제: docker container rm -f $(docker container ls -aq)
      • rm -f: -f 옵션 container 실행중이어도 삭제 가능
    • mynetwork라는 이름으로 네트워크 생성: docker network create mynetwork
    • mynetwork 연결하고 redis 실행: docker run -d --name=redis --network mynetwork redis
    • mynetwork 연결하고 Postgres 실행: docker run -d --name=db -e POSTGRES_PASSWORD=password --network mynetwork postgres
      • -e POSTGRES_PASSWORD=password: password 라는 비밀번호를 지정함(비밀번호 지정해야 오류 안 남)
    • mynetwork 연결하고 vote 실행: docker run -d --name=vote -p 5001:80 --network mynetwork vote
    • mynetwork 연결하고 result 실행: docker run -d --name=result -p 5002:80 --network mynetwork result
    • mynetwork 연결하고 worker 실행: docker run -d --name=worker --network mynetwork worker
반응형

'데브코스(DE) > Docker & K8S' 카테고리의 다른 글

05. Kubernetes(K8s)  (0) 2024.05.31
04. Docker Compose  (0) 2024.05.30
02. Docker에서 웹 서비스 실행  (0) 2024.05.28
01. Docker  (0) 2024.05.28