파일 복사 및 스토리지 마운트

변현섭·2023년 12월 20일
0

도커란 무엇인가

목록 보기
6/8

1. 호스트 파일을 컨테이너에 복사하기

아파치 서버에 접속했을 때 원하는 화면이 나타나게 하려면, index.html 파일을 만들면 된다. 먼저 메모장을 열어 아래의 내용을 입력하자.

<html>
<meta charset="utf-8"/>
<body>
<div>안녕하세요. 크롬입니다.</div>
</body>
</html>

여기서는 index.html 파일을 바탕화면에 저장해두기로 한다. 이제 호스트의 index.html 파일을 복사해 컨테이너에 붙여 넣는 방법에 대해 실습해보자. 파일을 복사 붙여넣기 하기 위해 사용하는 명령은 아래와 같다.

docker cp {원본 경로} {컨테이너 이름}:{컨테이너 경로}

① 아파치 컨테이너 생성

docker run --name apa000ex19 -d -p 8080:80 httpd

② 웹 브라우저를 통해 아파치 서버에 접근

  • 주소 창에 localhost:8080을 입력한다.
  • 아직 index.html 파일을 붙여넣기 전이므로 아파치의 초기화면이 나타나게 된다.

③ index.html 파일 복사 붙여넣기

  • 상대 경로를 이용해 index.html에 접근한다.
  • 컨테이너의 경로는 도커 이미지의 참조 문서를 통해 알아낼 수 있다.
cd Desktop // 바탕화면으로 이동
docker cp ./index.html apa000ex19:/usr/local/apache2/htdocs/

④ 웹 브라우저를 통해 아파치 서버에 접근

  • 주소 창에 localhost:8080을 입력한다.
  • 아파치의 초기화면이 아닌 index.html 파일의 내용이 나타나는 것을 확인할 수 있다.

2. 컨테이너 파일을 호스트에 복사하기

이번에는 반대 방향으로 복사를 진행해 볼 것이다. 원활한 실습을 위해 기존에 작성했던 호스트의 index.html 파일을 삭제한다.

① 컨테이너 파일을 호스트에 복사하기

  • 컨테이너 경로에 있는 index.html 파일을 현재 디렉토리(.)로 복사한다.
Desktop>docker cp apa000ex19:/usr/local/apache2/htdocs/index.html .

② 바탕화면에서 index.html 파일 확인하기

  • 잘 복사되었음을 알 수 있다.

③ 컨테이너 종료 및 삭제

docker ps -a
docker stop apa000ex19
docker rm apa000ex19

3. 볼륨과 마운트

1) 개념

리눅스 환경에 이미 익숙한 사람들은 볼륨과 마운트의 개념을 이미 잘 알고 있을 것이므로, 간단하게만 설명하고 넘어가겠다.

① 볼륨

  • 분할된 스토리지의 한 영역을 의미한다. (분할하지 않고, 스토리지 자체를 볼륨으로 사용하는 경우도 있다.)
  • 즉, HDD나 SSD를 마치 케이크 자르듯이 분할하며, 이 때 각각의 조각이 볼륨에 해당한다고 이해할 수 있다.

② 마운트

  • 마운트는 기본적으로 연결한다는 의미를 갖는다.
  • 컨테이너를 사용하려면 데이터를 가지고 있는 스토리지에 마운트해야 한다.
  • 컨테이너 속에 데이터를 저장하지 않고 스토리지를 마운트하는 이유는, 컨테이너는 언젠가 삭제되어야 하기 때문이다.
  • 컨테이너가 삭제될 때 데이터가 함께 삭제되는 것을 방지하기 위해선, 데이터를 컨테이너 외부에 배치하고 컨테이너가 해당 데이터에 접근하는 방식을 사용해야 한다.
  • 즉, 마운트는 데이터의 Persistency(영속성)를 보장하기 위해 사용된다.

2) 스토리지 마운트

도커에서 스토리지 마운트의 종류네는 크게 두 가지가 있다. 바로 볼륨 마운트와 바인드 마운트이다.

① 볼륨 마운트

  • 도커 엔진 위에 만들어진 볼륨을 컨테이너에 디스크 형태로 마운트한다.
  • 도커 엔진에서 데이터를 관리하므로, 디렉토리 및 파일 작업이 어렵다.
  • 임시로 사용하는 파일이나, 자주 사용하지는 않지만 삭제되면 안 되는 파일을 저장하기에 적합하다.
  • 파일의 위치를 신경 쓸 필요가 없으며, 운영체제와 무관하게 항상 동일한 경로를 갖는다는 것이 장점이다.
  • 컨테이너를 경유하지 않고 볼륨에 직접적으로 접근할 수 있는 방법이 없고, 백업이 어렵다는 것이 단점이다.

② 바인드 마운트

  • 도커가 설치된 컴퓨터의 폴더를 컨테이너에 마운트하는 방식이다.
  • 파일을 이동하거나 열어보기 쉽기 때문에 자주 사용하는 파일을 저장하기에 적합하다.
  • 기존에 하던 방식 그대로 파일 작업을 할 수 있고, 파일 편집에 다른 소프트웨어를 사용하는 것도 가능하다.

3. 스토리지 마운트 커맨드

비록 스토리지는 컨테이너 외부에 위치하지만, 컨테이너를 실행할 때에는 마치 컨테이너 안에 스토리지가 있는 것처럼 동작해야 한다. 그러므로 스토리지의 경로가 컨테이너의 경로와 연결되도록 설정하는 것이 필요하다. 이는 바탕화면의 바로가기 아이콘을 통해 다른 곳에 위치한 프로그램을 마치 바탕화면에 프로그램이 있는 것처럼 사용하는 원리와 비슷하다.

스토리지를 마운트할 때에는 마운트할 볼륨(또는 스토리지)을 먼저 생성해야 하며, docker run 커맨드에 -v 옵션을 사용하여 스토리지를 마운트할 수 있다.

1) 바인드 마운트

바인드 마운트에 사용되는 커맨드는 아래와 같다.

docker run -v {스토리지 경로}:{컨테이너 마운트 경로}

바인드 마운트를 하려면, 바인드 마운트에 사용할 폴더를 먼저 생성해주어야 한다.

① 폴더 생성

  • C 드라이브 안에 new_folder라는 이름의 폴더를 생성한다.
  • 바탕화면처럼 실수로 건드리게 될 수 있는 경로는 최대한 피해야 한다.

② 아파치 컨테이너 실행

  • 먼저 cd 명령을 이용해 new_folder로 이동한다.
  • 스토리지의 경로(.)와 컨테이너 마운트 경로를 연결하여 스토리지를 마운트한다.
cd /new_folder
docker run --name apa000ex20 -d -p 8080:80 -v .:/usr/local/apache2/htdocs/ httpd

③ 웹 브라우저를 통해 아파치 서버에 접근

  • 주소 창에 localhost:8080을 입력한다.
  • 폴더(디렉토리)는 있는데 그 안에 index.html이나 index.php 파일이 없을 때, Index of / 라는 내용의 화면이 나타난다.

④ new_folder 안에 index.html 파일 배치

⑤ 웹 브라우저를 통해 아파치 서버에 접근

  • 주소 창에 localhost:8080을 입력한다.
  • index.html 파일의 내용으로 웹 페이지의 내용이 변경된 것을 확인할 수 있다.

⑥ 컨테이너 종료 및 삭제

docker ps -a
docker stop apa000ex20
docker rm apa000ex20

2) 볼륨 마운트

볼륨 마운트에 사용되는 커맨드는 아래와 같다.

docker volume create 볼륨 이름 // 볼륨 생성
docker volume inspect 볼륨 이름 // 볼륨 상세 정보 확인
docker volume rm 볼륨 이름 // 볼륨 삭제
docker run -v {볼륨 이름}:{컨테이너 마운트 경로} // 볼륨 마운트

볼륨 마운트를 하려면, 볼륨 마운트에 사용할 볼륨을 먼저 생성해주어야 한다. apa000vol1이라는 이름의 볼륨을 생성하기로 하자.

① 볼륨 생성

docker volume create apa000vol1

② 아파치 컨테이너 실행

docker run --name apa000ex21 -d -p 8080:80 -v apa000vol1:/usr/local/apache2/htdocs/ httpd

③ 볼륨 상세 정보 확인

  • 볼륨의 마운트를 실제로 확인하는 과정은 매우 까다로우므로 docker inspect 명령을 이용해 간접적으로 확인한다.
docker volume inspect apa000vol1
docker container inspect apa000ex21


  • Mountpoint는 도커 볼륨이 호스트 파일 시스템에 마운트된 경로를 의미한다.
  • Name은 마운트된 볼륨의 이름을 의미한다.
  • Source와 Destination은 각각 마운트된 볼륨의 경로와 컨테이너 경로를 나타내므로, 볼륨이 컨테이너에 잘 마운트되었는지 확인하는 용도로 사용할 수 있다.

④ 컨테이너 종료 및 삭제

docker ps -a
docker stop apa000ex21
docker rm apa000ex21

⑤ 이미지 삭제

docker image ls
docker rmi httpd

⑥ 볼륨 삭제

docker volume ls // 볼륨 이름 확인
docker volume rm apa000vol1

profile
Java Spring, Android Kotlin, Node.js, ML/DL 개발을 공부하는 인하대학교 정보통신공학과 학생입니다.

0개의 댓글