Getting Started: 도커 볼륨을 이용하여 애플리케이션 컨테이너 만들기

d4v1d·2022년 2월 28일
0

Docker & Kubernetes

목록 보기
6/8

개요

시작하세요! 도커/쿠버네티스의 내용을 공부하여 정리한 포스트입니다! 🌈

예제 따라하기

데이터베이스와 웹 서버가 분리된 애플리케이션 컨테이너 만들기

MySQL과 Wordpress, 그리고 도커 볼륨을 이용하여 데이터베이스와 웹 서버가 분리된 애플리케이션 컨테이너를 만드는 예제입니다.

MySQL 컨테이너 생성하기

docker run -d \ # 백그라운드로 도커 컨테이너 실행 (터미널에 띄우지 않음)
--name wordpressdb \ # 컨테이너 이름은 wordpressdb
-e MYSQL_ROOT_PASSWORD=password \ # 컨테이너에서 사용될 환경변수를 설정
-e MYSQL_DATABASE=wordpress \ # MYSQL_ROOT_PASSWORD와 MYSQL_DATABASE라는 환경변수가 컨테이너 내에 설정됨
mysql:5.7 # mysql 5.7 이미지로 컨테이너를 생성

Wordpress 컨테이너 생성하기

docker run -d \ # 백그라운드로 도커 컨테이너 실행
-e WORDPRESS_DB_HOST=mysql \ # 컨테이너에서 사용될 환경변수 설정
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=password \
--name wordpress \ # 컨테이너 이름은 wordpress
--link wordpressdb:mysql \ 이 컨테이너에서 wordpressdb라는 컨테이너에 접근할 때 mysql이라는 호스트 이름으로 참조할 수 있게 link
-p 80 \ # 호스트의 임의의 빈 포트를 컨테이너의 80번 포트와 bind
wordpress # wordpress 이미지로 컨테이너를 생성

위의 --link 옵션에 의해, 웹 서버 컨테이너(wordpress)에서 데이터베이스 컨테이너(wordpressdb)에 접근할 때, 데이터베이스 컨테이너의 IP를 모르더라도 mysql이라는 이름으로 참조할 수 있습니다.
단, --link로 연결한 컨테이너끼리는 의존성이 생기기 때문에 --link로 연결하려고 하는 컨테이너가 실행 중이 아니라면 이 컨테이너도 실행할 수 없습니다. 따라서 위와 같은 경우에는 데이터베이스 컨테이너인 wordpressdb가 먼저 실행 중이어야 웹 서버 컨테이너인 wordpress를 실행할 수 있는 것이죠!
그런데 --link 옵션은 현재 deprecated이므로, 대신 도커 브리지(bridge)를 사용하는 것을 권장합니다.

Output

도커 볼륨 Docker Volume

도커 이미지는 read-only이고, 이미지를 이용해 생성한 컨테이너는 변경 사항만 별도로 저장하여 각 컨테이너의 정보를 보존합니다. 따라서 컨테이너를 삭제하면 컨테이너 계층에 저장되어 있던 데이터가 모두 사라져 복구할 수 없게 됩니다. 이를 방지하여 컨테이너의 데이터를 영속적(persistent) 데이터로 활용할 수 있는 방법은 다음과 같습니다.

  • Volume (권장) Docker(Linux에서는 /var/lib/docker/volume/)가 관리하는 host file system의 일부에 데이터가 저장되고, non-Docker 프로세스가 이 데이터를 수정할 수 없음
  • Bind Mount 데이터가 host file system 내 임의의 위치에 저장될 수 있고, non-Docker 프로세스가 이 데이터를 수정할 수 있음
  • tmpfs Mount 데이터가 file system이 아닌 memory에만 저장됨

도커 공식 홈페이지에서는 volume을 이용할 것을 적극 권장하고 있습니다. Volume의 장점은 다음과 같습니다!

  • Volume은 bind mount보다 백업과 마이그레이션이 쉽습니다.
  • Docker CLI 또는 Docker API로 volume을 관리할 수 있습니다.
  • Linux, Windows 컨테이너에서 모두 작동합니다.
  • 여러 컨테이너 간 데이터를 더 안전하게 공유할 수 있습니다.
  • 원격 호스트나 클라우드 제공자에 volume을 저장할 수 있고, volume의 내용을 암호화하거나 다른 기능을 추가할 수 있습니다.
  • 새 volume의 콘텐츠는 컨테이너에 의해 미리 채워질 수 있습니다.
  • Docker Desktop의 volume은 Mac과 Windows 호스트의 bind mount보다 성능이 뛰어납니다.

도커 볼륨을 사용하는 방법은 다음과 같습니다.

  • docker run-v(--volume) 옵션으로 호스트 볼륨을 컨테이너와 공유
  • docker run--volumes-from 옵션으로 볼륨을 사용하는 다른 컨테이너와 볼륨을 공유
  • docker volume 명령어 활용

호스트 볼륨 공유 예제

다음 볼륨 예제를 통해 컨테이너 삭제 이후에도 데이터를 보존하는 방법을 알아봅시다.

MySQL 데이터베이스 컨테이너 생성하기

docker run -d \ # 컨테이너를 백그라운드에서 실행
--name wordpressdb_hostvolume \ # 컨테이너 이름은 wordpressdb_hostvolume
-e MYSQL_ROOT_PASSWORD=password \ # 컨테이너에서 사용할 환경변수 설정
-e MYSQL_DATABASE=wordpress \ 
-v ~/wordpress_db:/var/lib/mysql \ # 호스트의 ~/wordpress_db 디렉토리와 컨테이너의 /var/lib/mysql 디렉토리를 공유!
mysql:5.7

Wordpress 컨테이너 생성하기

docker run -d \ # 컨테이너를 백그라운드에서 실행
--name wordpress_hostvolume \ # 컨테이너 이름은 wordpress_hostvolume
-e WORDPRESS_DB_PASSWORD=password \ # 컨테이너에서 사용할 환경변수 설정
--link wordpressdb_hostvolume:mysql \ # 이 컨테이너에서 wordpressdb_hostvolume 컨테이너를 접근할 때 mysql이라는 호스트 이름으로 참조할 수 있습니다!
-p 80 \ # 호스트의 사용 가능한 임의의 포트와 컨테이너의 80번 포트를 bind
wordpress

볼륨 공유를 지정한 호스트 디렉토리를 살펴보면 MySQL 관련 파일이 설치되어 있는 것을 확인할 수 있습니다.

컨테이너를 모두 삭제한 후에도 호스트 볼륨에는 파일이 그대로 남아있습니다!

도커 이미지에 따라 컨테이너 내의 특정 경로에 파일이 이미 존재할 수 있습니다. 이때, 파일이 들어있는 컨테이너 내 경로와 호스트의 볼륨을 공유하는 경우, 컨테이너 내 해당 경로는 호스트 볼륨에 덮어 씌워집니다!

볼륨 컨테이너

볼륨을 사용하는 두 번째 방법은 --volumes-from 옵션을 통해 이미 볼륨을 사용하는 컨테이너로부터 볼륨을 공유받는 것입니다.

동일한 컨테이너에 여러 컨테이너가 --volumes-from 옵션을 사용하여 공유할 수 있습니다. 이를 활용하여 호스트 볼륨을 공유하는 역할만을 담당하는 '볼륨 컨테이너'를 만들 수도 있습니다!

docker volume 명령어 활용

# docker volume create --name <새로운 볼륨 이름>
docker volume create --name volume-test

컨테이너에서 이 볼륨을 활용할 때는 다음과 같이 명령어를 입력하면 됩니다.

docker run -it --name volume-container1 \ # 컨테이너 이름은 volume-container1
-v volume-test:/root \ # 도커 볼륨 volume-test를 컨테이너의 /root에 공유
ubuntu:14.04 # 사용할 도커 이미지는 ubuntu

volume-container1 생성 결과

이제 다른 컨테이너를 만들어 위에서 만든 볼륨을 공유해볼까요?

docker run -it --name volume-container2 \ # 컨테이너 이름은 volume-container2
-v volume-test:/root \ # 도커 볼륨 volume-test를 컨테이너의 /root에 공유
ubuntu:14.04 # 사용할 도커 이미지는 ubuntu

volume-container2 생성 결과

docker volume으로 생성한 볼륨은 하나의 디렉토리에 상응하는 단위로, 도커 엔진에서 관리합니다. 도커 볼륨도 호스트 볼륨 공유와 마찬가지로 호스트에 데이터를 보존하는데, 파일이 실제로 어디에 저장되는지 사용자가 알 필요가 없으므로 더 간편합니다!

docker inspect 명령어로 볼륨 정보 보기

docker volume create 명령을 입력하지 않아도 -v 옵션으로 도커 볼륨을 생성할 수 있습니다.

docker run -it --name volume-auto \ # 생성할 컨테이너의 이름은 volume-auto
-v /root \ # 컨테이너의 /root 경로에 대한 볼륨을 자동으로 생성!
ubuntu:14.04

volume-auto 컨테이너 생성 전 volume list

volume-auto 컨테이너 생성 후 volume list
이름이 6861b4d98... 인 볼륨이 생성된 것을 확인할 수 있습니다.

docker container inspect volume-auto로 컨테이너 정보 확인하기
Mounts > Source에서 6861b4d98...인 볼륨을 사용하고 있음을 확인할 수 있습니다.

docker volume prune으로 사용하지 않는 볼륨 정리하기

Stateless vs. Stateful

데이터가 컨테이너 외부에 저장되고 컨테이너는 이 데이터로 동작하도록 설계하는 것을 stateless라고 하고, 반대로 컨테이너가 자체적으로 데이터를 가지고 있어서 상태가 있는 경우를 stateful이라고 합니다. Stateless 컨테이너가 삭제되어도 데이터가 보존되지만, statefule 컨테이너가 삭제되면 데이터를 잃으므로 stateless 컨테이너로 설계하는 것이 바람직합니다. 🌼

profile
데이터 엔지니어/백엔드 개발자 d4v1d의 개발 일지🐯

0개의 댓글