Docker Volume(Docker의 설계 방식)

0

TIL

목록 보기
186/195

Docker를 이용해 컨테이너로 특정 프로그램을 띄워 사용중이라고 하자.
그런데 만약 이 프로그램에 기능이 추가가되었고, 새로운 이미지를 이 컨테이너에서 실행해야하는데
Docker는 기존 컨테이너에서 수정하는 것이 아니라 새로운 컨테이너를 만들어서 통째로 갈아끼우는 방식이 효율적이라고 생각한다.

  • 볼륨 생성 명령어
    docker run -v [호스트의 디렉토리 절대경로]:[컨테이너의 디렉토리 절대경로] [이미지명]:[태그명]

컨테이너를 수정하지 않고 새로 만든다. Why?!
Docker의 철학과 설계 방식에 의해...

  1. 불변성(Immutability)의 원칙
  • 컨테이너는 불변(Immutable) 인스턴스로 간주된다.
    한 번 생성된 컨테이너는 변경하지 않고 새로 만드는 것이 기본 철학이다.
    버전 관리와 추적에 용이하고, 재현 가능한 배포를 가능하도록 한다.
  1. 일관성 유지와 안정성
  • 기존 컨테이너를 수정하게되면 버그나 오염이 생길 가능성이 있다.
    새 컨테이너를 만들면 항상 동일한 상태로 초기화되므로 일관성 있는 동작이 보장된다.
  1. 롤백(Rollback) 및 배포 전략이 쉬움
  • 새로 만든 컨테이너가 문제있다면 바로 이전의 이미지로 다시 만들기만 하면 된다.
    배포 전략을 쉽게 구현할 수 있다.

이렇기 때문에 컨테이너를 수정하기보다 새로 만들 수 있도록 데이터를 컨테이너 외부(볼륨)에서 관리하는 것이 중요하다.



Mysql로 Docker Volume 테스트해보기


1. Volume을 사용하지 않으면 어떤 불편함이 있을까?

  1. Mysql 이미지로 도커 컨테이너를 만들기
    docker run -e MYSQL_ROOT_PASSWORD=password123 -d -p 3306:3306 mysql

-d MYSQL_ROOT_PASSWORD 요녀석은 뭐지?
docker hub에 mysql을 검색해보면 설명이 나와있다.

대충 해석하면 "이걸 사용하려면 비밀번호를 환경변수로 설정해라" 라는 의미이다.


  1. 이제 설정한 환경변수가 컨테이너 안에서 잘 설정되어있는지 확인해보자
    컨테이너에 들어가보자

docker exec -it ~ bash

환경변수로 설정한 비밀번호를 확인하려면
$MYSQL_ROOT_PASSWORD
$ <- 요녀석은 리눅스에서 환경변수를 호출할 때 사용된다.


  1. 컨테이너 안의 MySQL에 접속해보자

컨테이너에 접속하고
docker exec -it ~ bash
mysql을 실행
mysql -u root -p
하면 비밀번호를 입력하라고 하는데 설정해둔 비밀번호를 입력하면 mysql에 접속해 명령어 사용이 가능하다.

여기에 mydb라는 새로운 db를 만들고

db가 생성되어있는 컨테이너를 삭제해보자
docker rm -f ~

그 다음은 위의 작업과 동일하게 새로운 컨테이너를 만들고 db를 확인해보면
아까 만들었던 db는 컨테이너 삭제와 함께 같이 삭제된 것을 확인할 수 있다.
-> 이것을 방지하기 위해 볼륨을 사용한다!


2. Docker Volume 설정하기

자신이 호스트의 저장하고자 하는 경로로 들어간다.

mkdir docker-mysql : docker-mysql 이라는 이름의 폴더를 생성

  • 호스트의 디렉토리 절대경로에 연동되어있는 볼륨을 생성
    docker run -e MYSQL_ROOT_PASSWORD=password123 -d -p 3306:3306 -v /Users/sangwoo/Documents/Develop/docker-mysql/mysql_data:/var/lib/mysql -d mysql

여기서 /Users/sangwoo/Documents/Develop/docker-mysql/mysql_data 이 부분은 호스트의 디렉토리 절대경로(파일 이름은 mysql_data),
/var/lib/mysql 이 부분은 컨테이너의 드렉토리 절대경로를 의미한다.

주의!

mysql_data 라는 폴더를 자동으로 생성하므로 터미널 명령어를 입력하고있는 경로의 위치는 /Users/sangwoo/Documents/Develop/docker-mysql이어야 한다.


컨테이너의 디렉토리 절대경로는 어떻게 아느냐?!
이것 또한 docker hub에서 알려주고있다.

아래로 쭉 내리다보면

사진 맨 아래에 예시로 경로가 적혀있다.


3. DB 생성후 컨테이너 삭제해서 Volume은 그대로인지 확인해보기

전에 해봤던대로 컨테이너에 접속해
docker exec -it ~ bash

MySQL로 db를 생성해보자
mysql -u root -p

mydb라는 이름의 DB를 생성하고

mysql과 컨테이너에서 호스트로 나온 뒤 이 컨테이너를 날려보자
docker rm -f ~

이제 예상대로라면 다시 컨테이너를 만들었을 때 DB안에 mydb라는 이름의 데이터베이스가 존재해야한다.

위 과정을 동일하게 진행하여 컨테이너를 다시 생성해준 뒤 mysql에서 db를 확인해보면

업로드중..

오우 mydb를 새로 만들어주지 않았는데 살아있다.


업로드중..

주의! : Volume을 생성할 때 설정했던 password123 이라는 비밀번호는 Volume에 저장되는 것이므로 새로운 컨테이너를 다른 비밀번호로 설정하면 연동되지 않는다.
비밀번호를 변경하고싶다면 Volume이 저장되어있는 경로에 들어가 수정하거나 데이터를 지우면된다.

0개의 댓글