DevOps/Docker

[Docker] 기초 시리즈 (10) 도커 컨테이너 - Volume 관리

유자맛바나나 2022. 6. 7. 03:39

 

[도커 기초 시리즈 포스팅]

[Docker] 기초 시리즈 (1) 도커의 개념과 사용이유

[Docker] 기초 시리즈 (2) Ubuntu에 도커 엔진 설치

[Docker] 기초 시리즈 (3) 이미지와 컨테이너 관계, 도커 아키텍처

[Docker] 기초 시리즈 (4) 도커 이미지의 구조

[Docker] 기초 시리즈 (5) 도커 이미지 다루기 - Docker Hub(Registry)

[Docker] 기초 시리즈 (6) 도커 이미지 다루기 - 이미지 직접 생성

[Docker] 기초 시리즈 (7) 자주 사용하는 Dockerfile 명령어

[Docker] 기초 시리즈 (8) 자주 사용하는 도커 명령어 모음

[Docker] 기초 시리즈 (9) 도커 컨테이너 - 개념, 기본 사용법

[Docker] 기초 시리즈 (10) 도커 컨테이너 - Volume 관리 (Now)

 

❑ 볼륨(Volume)을 관리하는 방법 3가지

  • 도커 컨테이너는 삭제될 때 모든 변경사항이 삭제되므로 데이터를 보존하기 위해 볼륨 관리 방법을 알아야 한다.
  • 현업에서는 1번과 2번 방식을 많이 사용하고, 최근 2번 방식을 많이 사용한다고 함

 

1. 도커 호스트 볼륨

$ docker run -v [host path]:[container mount path]:[readonly]
  • 도커 호스트 내 디렉토리를 컨테이너의 특정 경로에 마운트하는 방식이다. 마운트 한다는 건 동기화 하는 것과 같다. 호스트 디렉토리에 파일을 생성해도 컨테이너 디렉토리에도 생기고, 반대로 컨테이너에서 생성해도 호스트에도 생성된다.
  • 컨테이너 실행시 -v 옵션을 이용해 호스트 디렉토리와 컨테이너 디렉토리를 매칭시킨다.
  • [readonly] 부분에 ro 또는 readonly라고 작성하면 컨테이너는 마운트 된 호스트 디렉토리를 조회만 가능하다. static 파일을 제공하기만 하는 웹 서버같은 서비스를 할 때 사용한다.
  • [참고] [host path] 생략
    container mount path만 입력하면 호스트 시스템의 컨테이너 uuid 디렉토리 내에 임의의 새로운 디렉토리를 만들고 그곳에 저장한다.

 

예제) 

$ docker run -d -v $(pwd)/html:/usr/share/nginx/html -p 80:80 nginx
  • [host path] : $(pwd)/html
    호스트 OS의 현재 디렉토리(pwd) 안에 있는 html 디렉토리 (=호스트 OS의 현재 디렉토리는 nginx의 html 디렉토리가 있는 곳으로 가정)
  • [container mount path] : /usr/share/nginx/html
    컨테이너의 nginx 디렉토리

 

 

[참고] 저장되는 디렉토리 확인

$ docker inspect [컨테이너 ID or 컨테이너 명]
  • "Mounts" > "source" 확인 ("Destination"은 컨테이너의 디렉토리)

 

[참고] 컨테이너 간 데이터 공유는 어떻게 할까?

더보기
  • 컨테이너 간 데이터 공유는 컨테이너끼리 직접 공유하는 것이 아닌, 각 컨테이너가 동일한 호스트 디렉토리를 마운트함으로써 해당 디렉토리를 통해 공유할 수 있다.
  • 그림 해석
    • 애플리케이션 컨테이너가 파일을 만들어서 호스트에 저장, Nginx 컨테이너가 파일을 클라이언트에게 제공한다.
    • 컨테이너1과 컨테이너2는 각각 호스트 시스템의 /webdata 디렉토리를 통해 데이터를 공유하고 있다.
    • 컨테이너1이 파일을 생성해 /webdata에 저장하고, 컨테이너2가 /webdata에 접근해 클라이언트에게 파일을 제공한다.
    • [참고] 컨테이너 생성 명령어
      - 호스트 디렉토리: /webdata
      - 컨테이너1(애플리케이션 컨테이너) 생성: $ docker run -v /webdata:/webdata -d myApp:latest
      - 컨테이너2(Nginx 컨테이너) 생성: $ docker run -v /webdata:/usr/share/nginx/html:ro -d myApp:latest

 

2. 도커 볼륨

1) 도커 볼륨 생성

$ docker volume create --name [도커 볼륨 이름]
  • 도커가 제공하는 볼륨 관리 기능을 활용해 데이터를 보존한다
  • volume create 명령어를 이용해 도커 볼륨을 생성할 수 있다
  • 기본적으로 도커 호스트 OS의 /var/lib/docker/volumes/${volume-name}/_data 에 데이터가 저장됨
  • 도커 볼륨과 도커 컨테이너의 디렉토리 마운트 역시 -v 옵션을 사용한다.

 

예제) 

#!/usr/bin/env sh

# 'db'라는 이름의 도커 볼륨 생성
docker volume create --name db 

# 도커 볼륨 목록 출력 (도커 호스트 OS에서 출력됨) 

docker volume ls 

# 도커 볼륨과 마운트 하는 컨테이너(mysql) 생성
docker run \
    -d \
    --name fastcampus-mysql \
    -e MYSQL_DATABASE=fastcampus \
    -e MYSQL_ROOT_PASSWORD=fastcampus \
    -v db:/var/lib/mysql \     # 'db'라는 도커 볼륨과 컨테이너의 /var/lib/mysql 디렉토리를 마운트 함
    -p 3306:3306 \
    mysql:5.7
  • 쉘 스크립트(.sh 파일)로 작성된 예제
  • 도커 호스트에서 'docker volume' 이라고 입력하면 docker volume과 관련된 명령어를 확인할 수 있음

 

2) 도커 볼륨 설정정보 확인

$ docker volume inspect [도커 볼륨 이름]
  • volume inspect 명령어를 통해 도커 볼륨의 설정 정보를 확인할 수 있다

예제)

  • "Mountpoint"를 통해 도커 호스트 내 데이터가 쌓이는 경로를 확인할 수 있다
  • 'sudo ls -l /var/lib/docker/volumes/db/_data' 를 입력하면 mysql 데이터가 쌓이는 것을 확인할 수 있다

 

3) 도커 볼륨 삭제

$ docker volume rm [도커 볼륨 이름]
  • volume rm 명령어를 통해 도커 볼륨을 삭제할 수 있다
  • 만약 volume is in use - ... 와 같이 에러가 뜬다면 현재 도커 볼륨이 사용중이기 때문에 삭제하지 못하는 것이다. 이럴 땐 도커 볼륨을 사용하는 컨테이너를 먼저 삭제 후 도커 볼륨을 삭제해야 한다.

 

3. 볼륨 컨테이너

1) 볼륨 컨테이너의 개념

  • 볼륨 컨테이너는 데이터만 관리할 목적의 볼륨 컨테이너를 만들어 관리하는 것이다.
  • 볼륨 컨테이너는 특별한 타입의 컨테이너가 아니라 일반 컨테이너처럼 생성해서 데이터만 쌓는 것이다. 
  • 그림에서 Data-only Container가 볼륨 컨테이너, 좌측의 Containter는 볼륨 컨테이너를 참조하는 어플리케이션 등의 컨테이너다.
  • 데이터가 필요한 컨테이너는 볼륨 컨테이너를 참조한다

 

2) 볼륨 컨테이너를 참조하는 컨테이너 생성

$ docker run --volumes-from [컨테이너 ID or 컨테이너 명]
  • --volumes-from [컨테이너 ID or 컨테이너 명] 옵션을 사용해 참조할 컨테이너를 지정한다

 

예제) 

#!/usr/bin/env sh

# Step1. 볼륨 컨테이너 생성: web-volume
docker run \
    -d \
    -it \
    -v $(pwd)/html:/usr/share/nginx/html \.    # 도커 호스트 디렉토리와 볼륨 마운트
    --name web-volume \
    ubuntu:focal       # 데이터 관리 목적이므로 단순 우분투 이미지 사용

# Step2. 볼륨 컨테이너를 참조하는 컨테이너 생성: my-nginx 
docker run \
    -d \
    --name my-nginx \
    --volumes-from web-volume \.      # 볼륨 컨테이너 web-volume을 참조하도록 설정
    -p 80:80 \
    nginx
  • 쉘 스크립트(.sh 파일)로 작성된 예제
  • 스크립트가 실행된 후 도커 호스트에서 docker ps 명령어를 통해 두 개의 컨테이너가 생성된 것을 확인한다.
  • 도커 호스트에서 curl localhost:80를 입력해 정상적으로 연결되는지 확인한다
  • docker inspect my-nginx 명령어를 입력해 컨테이너의 마운트 설정 정보를 확인해보자
    • "Mounts" 부분을 통해 마운트 정보를 확인할 수 있다
    • "Source" : 도커 호스트의 디렉토리
    • "Destination" : 볼륨 마운트 된 컨테이너의 디렉토리