본문 바로가기

DevOps/도커(Docker)

도커 바인드 마운트(Bind mount)와 볼륨(Volume)

# 바인드 마운트로 호스트와 컨테이너 연결하기

현재 정상적으로 노출된 nginx 컨테이너의 구조를 살펴보면 처음 접속할 때 노출되는 페이지는 /usr/share/nginx/html/index.html 이다. 따라서 수정해야하는 파일이 index.html이며, 이러한 경로 설정은 /etc/nginx/nginx.conf에 존재한다.

 

1. 컨테이너의 /usr/share/nginx/html/ 디렉터리와 호스트의 /root/html/ 디렉터리를 연결

$ sudo mkdir -p /root/html
$ docker run -d -p 8081:80 -v /root/html:/usr/share/nginx/html --restart always --name nginx-bind-mounts nginx

컨테이너 내부에 연결할 /root/html/ 디렉터리를 호스트에 생성하고 docker run 명령으로 nginx-bind-mounts 라는 이름의 컨테이너를 구동하고, 컨테이너의 /usr/share/nginx/html/ 디렉터리와 호스트의 /root/html/ 디렉터리를 연결한다. -v (volume)는 호스트 디렉터리와 컨테이너 디렉터리를 연결하는 옵션으로 -v < 호스트 디렉터리 경로 >:[컨테이너 디렉터리 경로] 형식으로 사용된다.

이때 앞서 사용한 8080번 포트와 중복되지 않게 호스트의 포트 번호는 8081번으로 지정해 컨테이너 내부의 80번 포트와 연결한다. 바인드 마운트의 한가지 특성은 호스트 디렉터리의 내용을 그대로 컨테이너 디렉터리에 덮어쓴다는 점이다. 따라서 컨테이너 디렉터리에 어떠한 내용이 있더라도 해당 내용은 삭제된다.

 

 

2.  /root/html/ 디렉터리 확인

$ sudo ls /root/html

현재는 빈 디렉터리가 컨테이너와 연결됐기 때문에 현재 컨테이너의 nginx는 초기화면으로 보여 줄 파일이 없다.

 

 

3. 192.168.56.10:8081 접속 확인

볼륨은 바인드 마운트와 다르게 index.html을 삭제하지 않았기 때문에 index.html의 내용이 그대로 표시된다. 호스트 디렉터리를 컨테이너 디렉터리에 덮어쓰는 구조가 아니라 양쪽을 서로 동기화시키는 구조이기 때문에 비어있는 볼륨을 연결하는 경우에는 컨테이너 디렉터리 파일이 보존된다. 하지만 볼륨에 컨테이너 디렉터리와 동일한 파일이 존재한 상태로 연결하는 경우에는 덮어쓰기가 된다.

 

 

 

4. /root/html/index.html 작성하기

$ sudo vi /root/html/index.html

 

 

5. 192.168.56.10:8081 재접속 확인

 

 

# 볼륨으로 호스트와 컨테이너 연결하기

볼륨(volume)은 도커가 직접 관리하며 컨테이너에 제공하는 호스트의 공간이다. 바인드 마운트와는 어떤 차이가 있는지 알아보자.

 

 

1. 볼륨 생성

$ docker volume create nginx-volume
$ docker volume inspect nginx-volume

Mountpoint 행의 /var/lib/docker/volumes/nginx-volume/_data/ 디렉터리가 볼륨 디렉터리임으로 확인할 수 있다. 컨테이너 내부와 연결할 때 전체 디렉토리 경로를 사용하지 않고 nginx-volume이라는 볼륨 이름만으로 간편하게 연결할 수 있다.

 

 

 

2. 볼륨으로 생성된 디렉토리 확인

$ sudo ls /var/lib/docker/volumes/nginx-volume/_data

디렉터리는 현재 비어있다.

 

 

3. 컨테이너 구동

$ docker run -d -v nginx-volume:/usr/share/nginx/html -p 8081:80 --restart always --name nginx-volume nginx

컨테이너에 연결한 볼륨을 호스트에 생성했으니 호스트와 컨테이너의 디렉터리를 연결할 컨테이너를 구동한다. 컨테이너 내부의 /usr/share/nginx/html/ 디렉터리와 호스트의 nginx-volume 볼륨을 연결한다. 사용하는 옵션은 -v [볼륨이름]:[컨테이너 디렉터리] 이다.

 

 

4. 볼륨 디렉토리 내용 확인

$ sudo ls /var/lib/docker/volumes/nginx-volume/_data

바인드 마운트와 달리 볼륨은 빈 디렉터리를 덮어쓰지 않고 컨테이너 내부에 있는 50x.html과 index.html 파일을 보존하는것을 확인할 수 있다. 참고로 50x.html 파일은 웹사이트에서 내부 오류가 발생했을 때 오류 화면으로 노출하는 파일이다.

 

 

5. 192.168.56.10:8082 접속 확인

볼륨은 바인드 마운트와 다르게 index.html을 삭제하지 않았기 때문에 index.html의 내용이 그대로 표시된다. 호스트 디렉터리를 컨테이너 디렉터리에 덮어쓰는 구조가 아니라 양쪽을 서로 동기화시키는 구조이기 때문에 비어있는 볼륨을 연결하는 경우에는 컨테이너 디렉터리 파일이 보존된다. 하지만 볼륨에 컨테이너 디렉터리와 동일한 파일이 존재한 상태로 연결하는 경우에는 덮어쓰기가 된다.

 

 

 

6. index.html 내용 변경

$ sudo cp index.html /var/lib/docker/volumes/nginx-volume/_data

nginx-volume 에 cp 명령어로 바꿀 파일을 볼륨 디렉터리로 복사해 볼륨에서 변경한 내용이 컨테이너 디렉터리에 동기화 시킨다.

 

 

7. 192.168.56.10:8082 재접속 확인

이처럼 볼륨을 사용하면 컨테이너에 존재하는 파일을 그대로 보존할 수 있고, 필요할 때 변경해서 사용할 수 있다. 또한, 사용중인 볼륨을 docker volume ls 명령으로 조회 가능하고 docker volume rm 명령으로 삭제 가능하기 때문에 바인드 마운트보다 관리하기 쉽다.

 

 

 

 

 

 

 

출처:

"컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 - 조훈,심근우,문성주 지음/길벗출판사" 책을 기반으로 실습한 내용입니다.