본문 바로가기

DevOps/Docker

<Docker> 도커 컨테이너의 실전 사용법 : Volume

1. 소개

 - 도커 컨테이너는 일회용으로 동작하는 특징을 가지고 있어서 업데이트나 재시작 시 이전 컨테이너는 폐기되고 새로운 이미지로부터 새로운 컨테이너가 생성된다. 이 과정에서 기존에 편집한 파일이나 데이터는 사라진다. 따라서 컨테이너 밖에 데이터를 저장하고 마운트할 수 있는 기능이 필요하다.

 

2. 연결

* 파일 복사

 - 파일 복사는 도커 컨테이너와 호스트(도커 엔진을 실행 중인 PC) 사이에서 파일을 복사하는 방법이다. 파일 복사는 컨테이너에서 호스트로, 호스트에서 컨테이너로 양방향으로 가능하다.

 

# 컨테이너로 파일을 복사
docker cp <호스트 경로> <컨테이너 이름>:<컨테이너 경로>

# 호스트로 파일을 복사
docker cp <컨테이너 이름>:<컨테이너 경로> <호스트 경로>

 

 - 위의 명령어는 cp 커맨드를 사용하여 파일을 복사하는 방법이다. <원본 경로> <복사할 경로> 순서로 작성한다. 이를 실습하기 위해 필자 로컬에 /Users/harry/Documents/github/playground-devops/docker-basic/index.html 파일을 작성하였다.

 

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Docker Basic</title>
</head>
<body>
  <h1>Hello Docker!</h1>
  <p>Hi! I am Harry studying docker</p>
</body>
</html>

 

 - 위와 같이 직접 작성한 index.html 파일을 아파치 서버에서 적용할 것이다.

 

# 아파치 생성 및 실행
docker run --name apa000ex19 -d -p 8080:80 httpd

# html 파일 컨테이너로 복사
docker cp /Users/harry/Documents/Github/playground-devops/docker-basic/index.html apa000ex19:/usr/local/apache2/htdocs/

 

 - 위 명령어를 사용하여 cp 커맨드로 직접 작성한 index.html 파일을 컨테이너로 복사한다. 그리고 http://localhost:8089로 접속하면 기본 아파치 페이지 대신 직접 만든 페이지가 출력된다.

 

# html 파일 호스트로 복사
docker cp apa000ex19:/usr/local/apache2/htdocs/index.html /Users/harry/Documents/Github/playground-devops/

# 컨테이너 정리
docker stop apa000ex19
docker rm apa000ex19

 

 - 반대로 아파치 컨테이너 안에 있는 파일을 로컬로 복사하는 것도 가능하다. 위 명령어를 사용하여 아파치 컨테이너 내의 index.html 파일을 로컬로 복사한다. 실습이 끝났다면 컨테이너를 정리하자.

 

* 볼륨 마운트

 - 복사를 사용하면 호스트 파일을 컨테이너로 옮길 수 있지만, 컨테이너가 삭제되고 다시 생성되면 해당 컨테이너에는 파일이 존재하지 않는다. 이번 절에서는 볼륨을 마운트하여 컨테이너의 일부를 호스트 컴퓨터의 일부처럼 다루는 방법을 배울 것이다.

 - 볼륨은 스토리지의 영역을 분할한 것으로, 하드 디스크나 SSD를 분할한 하나의 영역이다. 알다시피 컨테이너 안에 중요한 데이터가 있다면 컨테이너와 함께 언젠가는 데이터가 소멸될 수 있다. 따라서 컨테이너 외부에 데이터를 보관해야 한다. 컨테이너의 생성 및 폐기가 빈번하게 일어나기 때문에 매번 데이터를 옮기는 방식보다는 컨테이너 외부에 데이터를 두고 접근하는 것이 일반적이다. 이를 data persistency라고 부른다.

 - 도커에서는 마운트에 두 가지 종류가 있다. 하나는 볼륨 마운트(volume mount)이고, 다른 하나는 바인드 마운트(bind mount)이다. 

 

 - 볼륨 마운트는 도커 엔진이 관리하는 영역 내에 만들어진 볼륨을 컨테이너에 디스크 형태로 마운트한다. 볼륨은 직접 조작하기 어려우며, 임시적인 목적이나 자주 사용하지 않는 파일을 저장하는 용도로 주로 사용된다.

 

볼륨 마운트

 

 - 볼륨 내의 데이터에는 컨테이너를 통하지 않고 직접 접근할 수 없으므로 주의해야 한다.

 

바인드 마운트


 - 바인드 마운트는 도커가 설치된 컴퓨터의 문서 폴더나 바탕화면 폴더 등 도커 엔진이 관리하지 않는 영역의 기존 디렉터리를 컨테이너에 마운트하는 방식이다.

 

 - 바인드 마운트는 컨테이너 외부에 있는 폴더에 파일을 직접 두고 열어볼 수 있어서 자주 사용하는 파일을 두는 데 적합하다. 기존에 컴퓨터를 통해 조작하던 방식과 동일한 방식으로 파일을 사용할 수 있어 편리하다.

 - 두 가지 마운트 방식을 사용해도 스토리지 마운트는 run 커맨드의 옵션으로 지정하며, 마운트되는 스토리지는 별도의 장소에 있지만 컨테이너 내부에서 사용하는 것처럼 설정한다.

 

 - 마운트되는 위치는 컨테이너의 소프트웨어가 데이터를 저장하는 경로를 따른다. 아파치의 경우 /usr/local/apache2/htdocs이며, MySQL은 /var/lib/mysql 등이 일반적이다. 데이터가 위치하는 경로는 도커 이미지의 문서를 확인하면 알 수 있다.

 

 

3. 실습

 - 스토리지를 마운트하려면 먼저 마운트 디렉토리에 스토리지를 생성해야 한다. 바인드 마운트는 원본이 될 폴더나 파일을 생성하는 것이고, 볼륨 마운트는 볼륨 커맨드를 사용하여 볼륨을 생성하는 것이다.

 

# 볼륨 생성
docker volume create <볼륨 이름>

# 볼륨 삭제
docker volume rm <볼륨 이름>

 

 - 볼륨을 생성하려면 위와 같이 명령어를 사용한다. 볼륨은 도커 엔진이 관리하는 위치에 생성되므로 신경 쓰지 않아도 좋다.

 - 바인드 마운트는 -v 옵션을 사용하여 생성한 스토리지 실제 경로나 볼륨 이름을 지정한 후, 컨테이너의 마운트 경로를 콜론 뒤에 작성한다.

 

# 바인드 마운트
docker run (생략) -v <스토리지 실제 경로>:<컨테이너 마운트 경로> (생략)

# 볼륨 마운트
docker run (생략) -v <볼륨 이름>:<컨테이너 마운트 경로> (생략)

 

 - 바인드 마운트는 위와 같이 -v 옵션을 사용하여 생성한 스토리지와 컨테이너의 마운트 경로를 지정한다. 볼륨 마운트의 경우도 -v 옵션을 사용하며, 볼륨 이름과 컨테이너의 마운트 경로를 지정한다.

 

# 아파치 생성 및 실행 (바인드 마운트)
docker run --name apa000ex20 -d -p 8080:80 -v /Users/harry/Documents/Github/playground-devops/docker-basic:/usr/local/apache2/htdocs httpd

 

 - 위와 같이 바인드 마운트를 사용하여 로컬에 있는 폴더를 아파치 컨테이너 내부의 디렉터리에 마운트시킨다. 이제 8080 포트로 접속하여 확인해보자. 제대로 출력된다면 컨테이너를 정리하자.

 - 볼륨 마운트의 경우 다음과 같이 작성한다.

 

# 볼륨 생성
docker volume create apa000vol1

# 아파치 생성 및 실행 (볼륨 마운트)
docker run --name apa000ex21 -d -p 8080:80 -v apa000vol1:/usr/local/apache2/htdocs httpd

 

 - 볼륨을 먼저 생성한 후, -v 옵션을 사용하여 생성한 볼륨과 컨테이너의 마운트 경로를 지정한다.

# 볼륨 확인
docker volume ls
docker volume inspect apa000vol1

docker container inspect apa000ex21

 

 - docker volume ls 명령어를 사용하여 볼륨을 확인하고, docker volume inspect로 볼륨의 상세 정보를 확인할 수 있다. docker container inspect를 사용하여 볼륨이 컨테이너에 마운트되었는지 확인할 수도 있다.

 

 


참고

 

 해당 포스팅은 그림과 실습으로 배우는 도커&쿠버네티스를 읽고 개인적으로 필요한 내용을 추가 및 정리한 글입니다.

 

 

 

그림과 실습으로 배우는 도커 & 쿠버네티스 - YES24

컨테이너나 도커를 도통 이해하기 어려운 분들을 위한 본격 도커 입문서!이 책은 컨테이너 기술이 어렵게 느껴지는 엔지니어나 백엔드 기술에 자신이 없는 분들을 위한 도커 입문서다. 자세한

www.yes24.com