[LG CNS AM Inspire Camp 1기] Docker (5) - Volume Mount & Bind Mount

정성엽·2025년 2월 15일
0

LG CNS AM Inspire 1기

목록 보기
51/53

INTRO

이번 포스팅에서는 컨테이너 내부에서 생성되는 데이터들을 관리하는 방법에 대해서 정리해보려고 한다.

일반적으로 우리가 사용하는 컨테이너는 휘발성의 특징을 가지고 있다.

즉, 컨테이너가 죽으면 내부의 모든 내용이 사라지는 특성이 있다.

하지만, 우리는 컨테이너 내부에서 관리된 데이터를 외부에서 저장하고 사용해야하는 경우도 분명 존재할 것이다.

이번 포스팅에서는 컨테이너 외부에 데이터를 저장하여 관리하는 방법에 대해서 알아보자 👀


1. Volume 이해하기

INTRO에서 소개했다시피 일반적으로 컨테이너는 휘발성의 특징을 가지고 있다.

따라서, 컨테이너 어플리케이션은 일반적으로 stateless해야한다.

만약, 동일한 이미지를 기반으로한 컨테이너가 여러개 존재하고 우리가 그 여러개의 컨테이너에 동일한 요청을 보낸다면 당연히 동일한 Response가 넘어와야 한다.

즉, 컨테이너는 내부에서 상태를 관리해서는 안되는 것이다.

하지만, 어떤 컨테이너는 상태가 유지되어야하는 경우도 분명 존재한다.

💡 외부에 데이터가 저장되어야하는 컨테이너

가장 대표적인 예시로 DB를 생각할 수 있는데, DB는 데이터의 영속성이 보장되어야 하는 대표적인 예시이다.

MySQL과 같은 DB를 컨테이너로 실행한다고 가정해보자.

만약 컨테이너가 죽고 새로운 컨테이너가 실행된다면, 기존에 저장되어있던 모든 데이터가 날아가버릴 것이다.

이런 문제를 해결하기 위해 도커는 Volume이라는 개념을 제공한다.

💡 Volume 특징

Volume은 컨테이너의 데이터를 호스트에 저장하여 컨테이너의 생명주기와 상관없이 데이터를 유지할 수 있게 해준다.

큰 맥락은 위 사진과 같은데 여기서 bind mount와 volume에는 다음과 같은 차이가 있다.

Bind Mount

  • 호스트의 파일 시스템과 컨테이너의 특정 디렉토리를 직접 연결하는 방법을 의미한다.

Volume Mount

  • 도커가 직접 관리하는 영역인 Volume을 사용하는 방법을 의미한다.
  • 사진에서는 Docker area로 이해하면 된다.

tmpfs mount

  • 컨테이너가 사라지면 데이터도 같이 사라지는 것을 의미한다.

즉, 컨테이너와 Filesystem을 연결할 것인지 아니면 Docker area를 연결할 것인지에 따라 차이가 발생한다고 이해하면 될 것 같다!

💡 Volume Mount 사용하기

우선 간단하게 Volume을 한번 생성해보자

◉ 커맨드 - Volume 생성
docker volume create test_volume


◉ 커맨드 - Volume 확인
docker volume ls


Result View

사진과 같이 test_volume이 생성된 모습을 볼 수 있다.

이제 volume을 생성했으니 컨테이너의 디렉토리와 연결해보자

◉ 커맨드 - Volume과 컨테이너 디렉토리 연결
docker container run -it --name myvolumecontainer -v test_volume:/temp ubuntu


-v : 볼륨을 지정할 때 사용하는 옵션이다.

그러면 이제 /temp에 접속해서 파일을 생성하고 컨테이너를 종료시켜보자

Result View - /temp에 파일 생성


◉ 커맨드 - myvolumecontainer 삭제
docker container rm myvolumecontainer

이제 우리는 컨테이너가 죽었음에도 이전에 생성한 test_volume에 hello_volume 파일이 존재하는지를 확인해야 한다.

따라서, 새로운 컨테이너를 test_volume과 연결하고 hello_volume이 존재하는지 확인해보자

◉ 커맨드 - 새로운 컨테이너 생성 & test_volume 연결
docker container run -it --name newvolumecontainer -v test_volume:/temp ubuntu


Result View

정상적으로 hello_volume 파일이 확인되는 모습을 볼 수 있다.

여기서 한가지 더 알아두면 좋은 것은 -v 옵션으로 볼륨을 연결할 때, 기존에 없던 volume을 입력하면 컨테이너 실행과 동시에 새로운 볼륨이 생성된다는 것이다.

따라서, volume을 별도로 만들필요없이 한번에 연결 가능하다!


2. Bind mount 사용하기

위에서 볼륨을 연결하는 것과 비슷하게 사용할 수 있다.

이번에는 MySQL 이미지를 이용하여 데이터베이스 컨테이너를 실행해보자

이때, MySQL 컨테이너의 데이터를 확인하기 위해 wordpress 컨테이너도 사용할 예정이다.

wordpress 컨테이너를 띄울때는 DB와 연결을 해야 영속성 정보를 확인할 수 있기 때문에 link해서 띄워보자

💡 MySQL 이미지를 이용하여 DB 컨테이너 실행

우선, MySQL 이미지를 사용하여 bind mount할 DB 컨테이너를 띄워보자

◉ 커맨드 - DB 이미지 실행
docker container run -d --name wordpressdb -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress -v $(pwd)/mysql_data:/var/lib/mysql mysql


Result View

로컬 호스트의 현재 디렉토리/mysql_data과 mysql의 /var/lib/mysql을 bind mount 시킨 예시이다.

이때, mysql을 사용하기 위해서는 MYSQL_ROOT_PASSWORD와 MYSQL_DATABASE 등의 환경변수를 입력해야한다.
(MySQL Docker hub 참고)

사진과 같이 로컬에 mysql_data라는 디렉토리가 만들어지고 하위에 mysql 파일이 들어와있는 모습을 볼 수 있다.

💡 wordpress 컨테이너 실행

웹에서 접근하기 위해 이번에는 wordpress를 사용하려고 한다.

다음과 같은 커맨드를 입력해보자

◉ 커맨드 - wordpress 컨테이너 실행
docker container run -d --link wordpressdb:mysql -e WORDPRESS_DB_NAME=wordpress -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=password -p 80 wordpress


Result View

컨테이너의 80포트로 포트바인딩을 하여 wordpress 컨테이너를 실행시키는 커맨드이다.

이때, --link 로 이전에 생성한 db와 연결을 했는데, 실제로는 Docker network와 같은 방법을 더 권장한다고 한다.

그러면 본인의 포트로 접근해보자 (필자의 경우에는 62867이다.)

Result View


62867 포트로 접근하니 위와 같은 화면을 확인할 수 있었다.

그래서 계정을 생성하고 TEST라는 임시글을 하나 생성했다.

💡 컨테이너 삭제 후 다시 연결하여 접속해보기

임시글을 생성했을 때, 연결된 MySQL 컨테이너를 통해 내 디렉토리에 해당 파일이 저장되었을 것이다.

즉, mysql과 wordpress 컨테이너를 모두 다 삭제하고 기존과 동일한 호스트의 로컬 디렉토리와 MySQL 컨테이너를 bind mount 시켜주면 TEST 임시글이 확인되어야 한다.

Result View


커맨드쪽 사진은 컨테이너를 모두 삭제하고 다시 컨테이너 2개를 띄우는 과정이다.

실제로 진행해보면 새로운 컨테이너를 띄워서 새로운 포트번호(9090)를 할당받았음에도 그 포트번호로 접근하면 기존 포트번호(62867)로 디라이렉션 시키는 모습을 볼 수 있다.
(캐시 삭제를 해도 안되더라..)

그래서 새로운 컨테이너의 포트번호를 기존 포트번호(62867)로 설정하여 컨테이너를 띄우고 접속한 모습이다.

마찬가지로 TEST 글이 확인되는 모습을 볼 수 있다.


OUTRO

이번 포스팅에서는 컨테이너를 통해 관리되는 데이터를 외부에 관리하는 방법 2가지에 대해서 살펴봤다.

Volume은 도커가 관리하는 영역이고 Bind mount는 호스트가 관리하는 영역이라고 이해하면 될 것 같다.

둘다 컨테이너를 실행할 때, -v 옵션으로 설정할 수 있음을 기억하자 👊

profile
코린이

0개의 댓글

관련 채용 정보