본문 바로가기

Docker

[Docker] 도커 컨테이너 다루기 : 볼륨

도커 레이어 아키텍처

 

 

1. Image Layers

docker build -t app [경로] -> docker file을 기반으로 도커 이미지가 빌드됨 

이미지를 분석해보면 레이어 구조로 되어있음 

Docker file 내에 작성되어 있는 여러 명령어들이 순차적으로 layer가 쌓이듯이 저장됨 

= 도커 컨테이너 이미지의 경우 layer 구조를 가짐

장점 : 이미지에 특정 변경이 필요할 경우, 변경할 layer 부분만 변경하여 업데이트 하면 됨 

 

2. Container Layers

docker run app -> 컨테이너가 실행됨 

컨테이너의 경우 두가지의 레이어를 가짐

1) Image Layer : 이미지를 불러들여 사용하는것이기 때문엔 항상 동일. 읽기전용으로 사용되기 때문에 변경 불가능

2) Container Layer : 컨테이너 상에서 새로운 파일을 작성할때 Container Layer에 저장. 읽고 쓰기 가능. Container Layer의 경우 컨테이너 종료 시 삭제됨. 임시데이터저장소라고 생각하면 됨

 

 

 

 

 

[컨테이너 상에서 볼륨을 영구적으로 사용할 수 있는 방법]

 

1. 호스트 볼륨

: 호스트의 디렉토리를 컨테이너의 특정 경로에 마운트한다. 

 

ex) 호스트의 /opt/html 디렉토리를 Nginx의 웹 루트 디렉토리로 마운트

# docker run -d \

--name nginx \

-v /opt/html:/usr/share/nginx/html \

nginx

 

==> Host의 /opt/html 경로와 컨테이너의 /usr/share/nginx/html 경로를 서로 공유한다. 

==> 결국 Host 디렉토리에 있는 데이터는 삭제되지 않기 때문에 컨테이너를 삭제 후 재기동하여도 영구적으로 데이터를 보관할 수 있다. 

 

 

2. 볼륨 컨테이너

: 특정 컨테이너의 볼륨 마운트를 공유할 수 있다.

 

Data-only Container = 볼륨 컨테이너

볼륨을 특정 어플리컨테이너에서 마운트 시키는것이 아닌, 볼륨컨테이너에서 볼륨 마운트만 진행하고, 아무것도 하지 않은 컨테이너를 만들어둠

그 상태에서 어플리케이션 컨테이너는 Data-only Container를 참조하여 해당 컨테이너를 볼륨 컨테이너 같이 사용함

Data-only Container의 마운트 목록을 해당 어플리케이션 컨테이너가 공유 받을 수 있음.

 

 

# docker run -d \

--name my-volume \

-it \

-v /opt/html:/usr/share/nginx/html \

ubuntu:focal

 

 

my -volume 컨테이너의 볼륨을 공유 ( --volumes-from 옵션 사용)

# docker run -d \

--name nginx \

--volumes-from my-volume \

-p 80:80 \

nginx

 

 

 

3. 도커 볼륨 

: 도커가 제공하는 볼륨 관리 기능을 활용하여 데이터를 보존한다. 

생성된 볼륨은 도커가 관리하는 특정 호스트 경로에 데이터가 저장되는데, 기본적으로 /var/lib/docker/volumes/${volume-name}/_data 에 데이터가 저장된다. 

 

 

'db'라는 이름으로 도커 볼륨 생성

# docker volume create --name db

 

볼륨 목록 확인 

# docker volume ls

 

docker run 명령어로 mysql 실행 

# docker run -d \

--name fastcampus-mysql \  컨테이너 이름은 fastcampus

-e MYSQL_DATABASE=fastcampus \  최초로 생성될 데이터베이스의 이름 지정 

-e MYSQL_ROOT_PASSWORD=fastcampus \  mysql root 패스워드 입력 

-v db : /var/lib/mysql \  호스트 경로 대신 'db' 볼륨 이름을 작성하여 도커 볼륨 사용 

-p 3306:3306 \

mysql:5.7

 

 

 

읽기전용 볼륨 연결

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

보통 읽기 전용 마운트는 변경이 되면 안되는 디렉토리나 파일을 연결할때 해당 옵션을 사용하여 마운트를 진행한다. 

 

 

도커의 web-volume 볼륨을 Nginx의 웹루트 디렉토리로 읽기 전용 마운트

# docker run -d \

--name nginx

-v web-volume:/usr/share/nginx/html:ro \

-p 80:80 \

--name ro-nginx

nginx