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를 사용하여 볼륨이 컨테이너에 마운트되었는지 확인할 수도 있다.
참고
해당 포스팅은 그림과 실습으로 배우는 도커&쿠버네티스를 읽고 개인적으로 필요한 내용을 추가 및 정리한 글입니다.
'DevOps > Docker' 카테고리의 다른 글
<Docker> 도커 이미지 만들고 올리기 (0) | 2023.07.19 |
---|---|
<Docker> 도커 컨테이너의 연동 사용법 : Network (0) | 2023.06.07 |
<Docker> 도커 컨테이너의 기본 사용법 : Run (0) | 2023.05.31 |
<Docker> 도커 사용을 위한 준비 (0) | 2023.05.24 |
<Docker> 도커의 구조와 장단점 (0) | 2023.05.18 |