[Docker] 7. 파일 복사와 볼륨 마운트

sorzzzzy·2022년 5월 5일
0

Docker&Kubernetes

목록 보기
7/12
post-thumbnail
post-custom-banner

🏷 컨테이너와 호스트 간에 파일 복사하기

파일 복사는 컨테이너➡️호스트 호스트➡️컨테이너양방향 모두 가능하다.

docker cp [원본경로][복사할경로]

문자열 "안녕하세요!" 를 보여주는 index.html 파일을 만들어 바탕화면에 두고, 이를 양방향 복사하는 실습을 진행해보도록 하겠다.

호스트 ➡️ 컨테이너로 파일 복사

✔️ 아파치 컨테이너 생성

아파치 컨테이너를 생성한다.

웹 브라우저에서 http://localhost:8089 로 접속해 초기화면을 확인한다.


✔️ 파일 복사

docker cp 커맨드를 사용해 호스트에서 컨테이너로 index.html 파일을 복사한다.


✔️ 아파치 초기 화면 확인

다시 http://localhost:8089 로 접속하면, 아파치의 초기 화면이 index.html 파일의 내용으로 바뀐 것을 확인할 수 있다.


컨테이너 ➡️ 호스트로 파일 복사

이번에는 앞서 복사한 아파치 컨테이너의 index.html 파일을 호스트 쪽으로 다시 복사할 것이다.
새로 복사한 파일을 구별할 수 있도록, 호스트 파일의 이름을 index2.html 로 변경했다.

✔️ 파일 복사

docker cp 커맨드를 사용해 컨테이너에서 호스트로 index.html 파일을 복사한다.

ls 커맨드를 통해 확인해보면, 위와 같이 복사된 index.html 파일을 확인할 수 있다.


✔️ 뒷정리

컨테이너를 삭제한다.


🏷 볼륨 마운트

볼륨과 마운트

볼륨이란 스토리지의 한 영역을 분할한 것이다.
간단히 말하면, 하드디스크나 SSD를 분할한 하나의 영역이다.

마운트는 '연결하다' 라는 의미 그대로 대상을 연결해 운영체제 또는 소프트웨어의 관리하에 두는 일을 말한다.

볼륨을 마운트하면 컨테이너의 일부를 호스트 컴퓨터의 일부와 같이 다룰 수 있어 편리하다.

지금까지 여러번 컨테이너를 생성하고 삭제해왔는데, 실제로 컨테이너를 사용하려면 스토리지 영역을 마운트해야한다. 데이터가 이 스토리지 안에 있기 때문이다.
(컨테이너를 종료해도 바로 삭제되지는 않지만, 성격상 '쓰고 버려야' 하기 때문에 소프트웨어 업그레이드 등의 이유로 언젠가는 삭제됨)

이런 상황에서 컨테이너 속에 데이터가 있다면 이 역시 컨테이너와 함께 소멸된다.
쉽게 예를 들면 컴퓨터나 스마트폰을 샀을 때 데이터를 다른 곳에 미리 저장하고 옮겨서 사용하는 것과 같이, 컨테이너 역시 외부로 데이터를 대피시키는 것이다.

다만, 컨테이너는 생성 및 폐기가 매우 빈번하기 때문에 매번 데이터를 옮기는 것 대신 처음부터 컨테이너 외부에 둔 데이터에 접근해 사용하는 것이 일반적이다.

이를 데이터 퍼시스턴시(data persistency)라고 하며, 이 때 데이터를 두는 장소가 마운트 된 스토리지 영역이다.

스토리지 마운트라고 하면 의미가 모호하기 때문에 관례적으로 '볼륨 마운트' 라는 용어를 사용하는데,
마운트 대상이 되는 스토리지는 볼륨 이외에도 디렉토리나 파일, 메모리가 될 수도 있다.


스토리지 마운트의 종류

도커에서 스토리지 마운트의 종류에는 두 가지가 있다.
하나는 볼륨 마운트이고 다른 하나는 바인드 마운트이다.

1. 볼륨 마운트

볼륨 마운트도커 엔진이 관리하는 영역 내에 만들어진 볼륨을 컨테이너에 디스크 형태로 마운트한다.

이름만으로 관리가 가능하므로 다루기 쉽지만 직접 조작하지 어렵기 때문에,
'자주 쓰지는 않지만 지우면 안 되는 파일' 이나 '임시 목적의 사용'을 목적으로 많이 사용한다.


2. 바인드 마운트

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

폴더(디렉토리) 속에 파일을 직접 두거나 열어볼 수 있기 때문에 '자주 사용하는 파일을 두는 데 사용' 한다.


두 가지 방식의 차이점

두 가지 마운트 방식의 차이점은 '간단한지 복잡한지', '호스트 컴퓨터에서 파일을 다룰 필요가 있는지', '환경의 의존성을 배제해야 하는지' 세 가지가 포인트이다.

  • 간단한지 복잡한지
    • 볼륨 마운트 : 보다 복잡함
    • 바인드 마운트 : 보다 간단함
  • 호스트 컴퓨터에서 파일을 다룰 필요가 있는지
    - 볼륨 마운트 : 도커 엔진의 관리하에 있으므로 사용자가 파일 위치를 신경 쓸 필요가 없음
    - 바인드 마운트 : 도커 엔진과 무관하게 파일을 다룰 수 있음
  • 환경의 의존성을 배제해야 하는지
    • 볼륨 마운트 : 의존성 문제 일어나지 않음
    • 바인드 마운트 : 의존성을 고려해야 함

정리하자면,
파일을 직접 편집해야 할 일이 많다면 바인트 마운트를, 그렇지 않다면 볼륨 마운트를 사용하면 된다.


스토리지 영역을 마운트하는 커맨드

어느 마운트 방식을 사용하든 스토리지 마운튼는 run 커맨드의 옵션 형태로 지정한다.

마운트하려는 스토리지의 경로가 컨테이너 속 특정 경로와 연결되도록 설정하는 형태이다.

💡 바탕화면에 있는 소프트웨어 단축 아이콘
실제 실행되는 프로그램은 바탕화면이 아닌 다른 곳에 있지만 단축 아이콘을 사용해 마치 바탕화면에 프로그램이 있는 것처럼 사용할 수 있다!

스토리지 영역의 마운트도 위와 마찬가지이다.
마운트되는 스토리지는 본래 별도의 장소에 있지만, 마치 컨테이너 안에 있는 것처럼 설정하는 것이다.
바탕화면에 비유하면, 컨테이너에 스토리지를 가리키는 단축 아이콘을 만드는 것과 같다!


스토리지를 마운트하는 절차

스토리지를 마운트하려면 먼저 마운트 될 스토리지를 생성하고 그 이후에 스토리지를 마운트 해야 한다.

1. 스토리지 영역 생성

볼륨 마운트의 경우, 마운트와 동시에 볼륨(스토리지 영역)을 생성할 수 있지만, 권장하지 않는 방법이다.

바인드 마운트는 원본이 될 폴더(디렉토리)나 파일을 먼저 만들고,
볼륨 마운트는 볼륨 상위 커맨드를 사용해 먼저 볼륨을 생성한다.

  • 볼륨 생성(볼륨 마운트)
    ➡️ docker volume create [볼륨이름]
  • 볼륨 삭제(볼륨 마운트)
    ➡️ docker volume rm [볼륨이름]

2. 스토리지 마운트

-v 옵션 뒤에 [스토리지 실제 경로] 또는 [볼륨 이름], [컨테이너 마운트 경로] 순서대로 기재한다.
이들 경로는 : 을 사용해 구분한다.

  • 바인드 마운트 커맨드
    ➡️ docker run -v [스토리지_실제_경로]:[컨테이너_마운트_경로]
  • 볼륨 마운트 커맨드
    ➡️ docker run -v [볼륨_이름:[컨테이너_마운트_경로]

실습 - 볼륨 마운트해보기

파일 복사에 이어 아파치 컨테이너를 소재로 사용한다.
app_folder 라는 이름으로 마운트 원본이 될 디렉토리를 생성하고,
그 안에 index.html 파일을 둔다.

✔️ 볼륨 생성

apa000vol1 이름으로 마운트할 볼륨을 생성한다.
볼륨 마운트는 직접적인 확인이 까다로우므로 volume inspect 명령을 사용해 간접적으로 확인한다.


✔️ 아파치 컨테이너 실행

run 커맨드로 아파치 컨테이너를 실행한다.


✔️ 볼륨의 상세 정보 확인

docker container inspect apa000ex21 커맨드로 볼륨이 컨테이너에 마운트됐는지도 확인한다.


✔️ 뒷정리

컨테이너, 이미지, 볼륨을 모두 삭제한다.

profile
Backend Developer
post-custom-banner

0개의 댓글