Docker 볼륨

y_cat·2023년 2월 5일
0

Devops

목록 보기
3/3

Layer Architecture

docker는 Client-Server 아키텍처 기반

docker 명령어를 주는 주체인 client에서 docker 컨테이너를 빌드, 실행 및 배포하는 무거운 작업을 수행하는 docker daemon과 통신한다.

  • docker client와 daemon은 같은 시스템에서 실행하거나, docker client를 원격 docker daemon에 연결할 수 있다.

docker client와 daemon은 REST API, UNIX 소켓 또는 네트워크 인터페이스를 통해 통신한다.
또 Docker Compose로 docker client를 구성하여 컨테이너 세트로 구성된 애플리케이션으로 작업할 수 있다.

(*강의에서는 Docker objects - Containers와 Images만 다룸.)

Docker Daemon

Docker daemon(dockerd)은 Docker API 요청을 수신하고 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker Obejct를 관리한다. 또한 Docker 서비스를 관리하기 위해 다른 daemon과 통신할 수 있다.

Docker Client

Docker Client(docker)는 대다수 docker 사용자가 docker와 상호 작용하는 주요 방식이다. docker run과 같은 명령을 사용할 때, client는 이러한 명령을 dockerd로 보내 수행한다. docker 명령은 docker API를 사용한다.
docker client는 하나 이상의 데몬과 통신할 수 있다.

Docker registries

docker registry는 docker 이미지를 저장한다.
Docker Hub는 누구나 사용할 수 있는 public registry이며, Docker는 기본적으로 Docker Hub에서 이미지를 찾도록 구성되어 있다.
나만의 개인 레지스트리를 운영할 수도 있다.

docker pull 또는 docker run 명령을 사용할 때, 필요한 이미지는 구성된 registry에서 가져온다. docker push 명령을 사용하면 이미지가 구성된 registry로 push된다.

Docker objects

Image Layer

이미지는 docker 컨테이너를 만들기 위한 명령어들이 있는 읽기 전용 템플릿.
종종, 이미지는 커스터마이징된 다른 이미지를 기반으로 한다.
예를 들어 ubuntu 이미지를 기반으로 하는 이미지를 빌드하게 되면, Apache 웹 서버와 응용 프로그램을 설치하고 응용 프로그램을 실행하는 데 필요한 구성 세부 정보를 설치할 수 있다.

자신만의 이미지를 만들 수도 있고 다른 사람들이 만들고 레지스트리에 게시된 이미지만 사용할 수도 있다.
자신만의 이미지를 만들려면, 이미지를 만들고 실행하는 데 필요한 단계를 정의하기 위한 간단한 구문으로 Dockerfile을 만든다.
Dockerfile의 각 명령은 이미지에 레이어(layer)를 만든다. Dockerfile을 변경하고 이미지를 다시 만들 때, 변경된 레이어만 다시 빌드된다. 이것은 다른 가상화 기술과 비교할 때 이미지를 가볍고, 작고, 빠르게 만드는 것의 일부이다.


Container Layer

컨테이너(Container)는 이미지의 실행 가능한 인스턴스이다. Docker API 또는 CLI를 사용하여 컨테이너를 생성, 시작, 중지, 이동 또는 삭제할 수 있다.
컨테이너를 하나 이상의 네트워크에 연결하거나, 스토리지를 연결하거나, 현재 상태를 기반으로 새 이미지를 만들 수도 있다.
기본적으로, 컨테이너는 다른 컨테이너와 호스트 머신으로부터 비교적 잘 분리되어 있다. 컨테이너의 네트워크, 스토리지 또는 기타 기본 하위 시스템이 다른 컨테이너나 호스트 머신에서 어떻게 분리되는지 제어할 수 있다.
컨테이너는 이미지를 만들거나 시작할 때 제공하는 모든 구성 옵션에 의해 정의된다.
컨테이너가 삭제되면, persistent storage에 저장되지 않은 상태의 변경 사항은 사라진다. (즉, 컨테이너에서 만들어지는 데이터들은 임시적으로 저장됨)


Persistent Volume

컨테이너 상에서 Volume을 영구적으로 사용할 수 있는 방법들을 알아보자.

host volume

호스트의 디렉토리를 컨테이너 특정 경로에 마운트
가장 간단하고 직관적인 방법

# 호스트의 /opt/html 디렉토리를 nginx의 웹 루트 디렉토리로 마운트
$ docker run \
  -d \
  -v /opt/html:/usr/share/nginx/html \
  -p 80:80 \
  nginx

volume container

특정 컨테이너의 볼륨 마운트를 공유

Data-only container가 Volume container
Volume container를 올려서 볼륨 마운트만 진행
App Container가 Data-only container를 참조하여 Data-only container의 볼륨과 공유할 수 있다.

예시

$ docker run -d \
--name my-volume \
-it \
-v /opt/html:/usr/share/nginx/html \
ubuntu:focal

# nginx 컨테이너의 볼륨을 my-volume 컨테이너의 볼륨과 공유
$ docker run -d \
--name nginx \
--volumes-from my-volume \
nginx

docker volume

docker가 제공하는 볼륨 관리 기능을 활용하여 데이터를 보존
기본적으로 /var/lib/docker/volumes/${volume-name}/_data에 저장

# db docker volume 생성
$ docker volume create --name db

# docker의 db 볼륨을 nginx의 웹 루트 디렉토리로 마운트
$ docker run -d \
--name ycat-mysql \
-v db:/var/lib/mysql \
-p 3306:3306 \
mysql:5.7

생성한 docker volume을 docker volume inspect 명령을 확인해보면 해당 url을 들어가면 안된다?
=> macOS는 /var/lib/docker/volumes의 볼륨에 액세스할 수 있는 리눅스와는 다른 가상 머신(VM)을 사용한다. macOS의 경우 볼륨을 찾으려면 VM에 연결해야 한다.


그리고 볼륨 연결 시에 :ro 옵션을 통해 읽기 전용 마운트 옵션을 설정할 수 있다.

# docker의 web-volume 볼륨을 nginx의 웹 루트 디렉토리로 읽기 전용 마운트
$ docker run \
  -d \
  -v $(pwd)/html:/usr/share/nginx/html:ro \
  -p 80:80 \
  --name ro-nginx \
  nginx

$ docker exec ro-nginx touch /usr/share/nginx/html/hello
touch: cannot touch '/usr/share/nginx/html/hello': Read-only file system

출처

profile
토이 프로젝트와 기술들 정리하는 블로그

0개의 댓글