Docker - volume

Linda·2023년 4월 25일
0

Docker

목록 보기
5/6

이미지를 빌드할 때 도커파일을 사용하여 코드가 이미지에 복사된다.
이미지 기반으로 컨테이너 실행할 때 컨테이너는 제공된 환경에서 우리의 코드를 사용한다.
이미지에 코드가 복사되면 코드는 고정되고 이미지가 빌드되면 데이터 , 소스코드 및 이와 관련된 모든것들 변경 될 수 없다. <- 변경하려면 이미지 리빌드해야한다.

파일시스템은 컨테이너 내부에 존재하기 때문에 컨테이너를 중지하고 다시 시작해도 파일시스템이 삭제되지는 않지만 컨테이너를 제거하면 모든 데이터가 지워진다.
새컨테이너를 실행해도 이전모든 데이터가 지워진다.
(이미지는 READ ONLY 이기 때문에)
따라서 컨테이너 파일 생성할 때 이 파일을 이미지에 쓰지 않는다.
상단에 추가되는 자체 read-write 레이어에 저장한다.
그래서 컨테이너가 제거되면 변경되지 않는 이미지만 남게된다.
즉 새 컨테이너를 시작하면 동일한 이미지상에서 실행되어진 이전컨테이너에 의해 변경된것이 없는 동일한 기본 파일 시스템으로 시작한다. (이것이 도커의 핵심 아이디어)
-- 동일한 이미지에 기반한 다수의 컨테이너가 서로에게 완전히 격리된다는것.

volume

도커에는 데이터유지를 돕는 볼륨이라는 내장기능이있다.
컨테이너 외부의 특정폴더에 연결된 도커 컨테이너 내부의 폴더 파일이다.
볼륨은 호스트머신의 폴더.
컨테이너나 이미지에 있는것이아니라, 호스트컴퓨터에 장착된 하드드라이브에 존재하여 사용가능하거나 컨테이너로 매핑되는것을 의미한다.
즉, 볼륨은 도커가 인식하는 호스트머신인 컴퓨터에있는 폴더로서 도커컨테이너내부폴더에 매핑된다.
컨테이너에 볼륨을 추가하는 경우 컨테이너가 제거되어도 해당볼륨이 유지되므로 그 볼륨의 데이터가 유지된다.
컨테이너는 볼륨에 데이터 읽고 쓸 수 있다.
도커에의해 삭제되지 않아서 명명된볼륨 사용하면 컨테이너 종료된 후에도 볼륨유지가 된다.
새컨테이너 시작될 때 해당폴더에 저장된 모든 데이터를 계속 사용할수있다 .
(익명볼륨은 컨테이너가 생성될 때 마다 익명볼륨이 다시 생성되기 때문에 삭제된다.)
실질적으로 호스트머신의 폴더에 엑세스하지 않을 것이기 때문에 영구적이어야 할 데이터나 , 편집하거나 직접 볼 필요가 없는 중요한 데이터에 적합한 방법이다.

COPY명령과 voulume의 차이점

  • COPY명령은 지속적인 관계나 연결없이 이미지에 복사하는게 전부일 뿐.
    일회성인 스냅샷이다.
  • volume은 컨테이너 내부 폴더를 호스트머신상의 컨테이너 외부 폴더와 연결할 수 있고, 두 폴더의 변경사항은 다른 폴더에 반영된다.
    호스트머신에 파일을 추가하면 컨테이너 내부에서 엑세스 할 수 있고 컨테이너가 매핑된 경로에 파일을 추가하면 컨테이너외부 , 호스트머신에서도 사용할 수 있다.
    위와 같은 매커니즘을 통해 데이터 유지 가능하고 컨테이너가 종료된 후에도 지속되며 존재한다.

바인드마운트와 voulume의 차이점

  • 볼륨은 정확한 위치를 모른다.
    영구데이터에 도움이 되지만 호스트머신의 어디에 저장되어있는지 모르기때문에 편집은 실제로 불가능하다.
  • 바인드마운팅은 호스트머신상에 매핑될 컨테이너의 경로를 설정하기 때문에 정확한 위치를 알 수 있다.
    영구적이고 편집 가능한 데이터에 적합하다.
    하나의 특정 컨테이너에 국한되지않아 다수에 연결가능하고 중지시에도 연결되어있다.
    바인드마운트 데이터 지우려면 실제 호스트머신에서 삭제해야한다.

바인드마운트 추가하는 방법 -

docker stop 현재실행중인 컨테이너이름
실행중인 컨테이너가 있다면 컨테이너 먼저 중지 후

바인딩마운트 공유중인 폴더에 실행중인 도커서비스를 사용해서 도커의 preferences 에 엑세스하여 이를 수행할 수 있다.
위치 : resource - file sharing (없다면 윈도우에 있을 가능성이 있음)

다른볼륨과 결합 / 병합

컨테이너와 볼륨 또는 바인드마운트를 가지고 있다면 -v 를 통해서 컨테이너에 둘 다 마운트 할 수 있다.
컨테이너 내부의 어떤 폴더가 호스트머신의 폴더에 마운트되거나 연결된다.
도커는 로컬호스트 폴더를 덮어쓰진 않는다 .

docker run --v 옵션을 사용할 때 기본적인 세가지 방식이 있다.
docker run --v /경로 <- 익명볼륨생성 :
컨테이너가 제거되면 볼륨도 같이 제거되고 rm 을 추가하면 컨테이너 중지 시 익명볼륨도 사라진다.
익명볼륨을 사용하여 컨테이너 간에 데이터 공유 할 수 없다.

docker run --v 이름:/경로 <- 명명된볼륨생성 :
호스트머신에 폴더 생성된다.
(특정컨테이너에 연결되어있지 않아서) 컨테이너 제거되면 폴더도 제거되지만 컨테이너 실행되는 동안에는 존재한다.
도커가 컨테이너 내부에 모든 데이터를 저장할 필요가 없으며 도커가 이 컨테이너의 read-write 레이어 내부의 모든 데이터를 관리할 필요가 없다는 것을 의미한다.
대신 특정 에이터를 호스트머신 파일 시스템에 아웃소싱할수있다. <-성능과 효율성에 도움된다
도커파일에서 생성안되고 -v명령어를 통해 생성가능 하다.

docker run --v /path/tp/code:/경로
실제로 호스트머신의 폴더를 가지키는 절대경로

볼륨관리

docker volume --help 도커볼륨과 함께 사용할수있는 명령어들 표시됨.
바인딩마운트 아닌 볼륨들은 도커에 의해 관리된다. 이것은 컨테이너를 실행할 때 볼륨이 존재하지않으면 생성한다는 의미이기도하다.
docker volume create 이름 수동으로 볼륨생성
docker volume ls 목록확인
docker volume inspect feedback 볼륨조사
docker volume rm 이름 볼륨제거

COPY명령어 사용하는 이유

실행되는동안 실시간으로 업데이트되는 연결코드가 없기때문에 바인딩마운트 사용하지않고, dokerfile에서 copy 명령어 사용한다.

.dockerignore

copy명령은 도커파일이있는 폴더의 모든항목을 복사하기 때문에 .dockerignore파일을 추가해서 제한걸수있다.

ARGuments 는 도커파일에서 특정 도커파일명령으로 다른값을 추출하는데 사용할수있는 유연한 데이터비트, docker build 를 실행할 때 --build-arg 옵션과 함께 제공되는 인수를 기반으로해서 변수를 설정할 수 있다.

ENVironment는 도커파일 내부에서 사용가능하다.
도커파일 내부의 ENV옵션으로 설정해서 이 환경변수가 존재한다고 도커에 알린 다음 docker run 에서 --evn 옵션 사용하여 구체적인 값을 제공한다.
인수와 환경변수를 사용하면 컨테이너와 이미지에 모든것을 하드코딩 할 필요가 없기 때문에 보다 유연한 이미지와 컨테이너 만들 수 있다.
ENV을 쓰기때문에 이미지 re-build 할 필요 없고 docker run 명령에서 처리가능하다
.env 라는 파일 따로 만들어서 PORT=8000 따로 설정도 가능하다.

컨테이너는 도커의 핵심이며 데이터를 읽고 쓸 수 있다.
이미지위에 READ-WRITE 레이어를 추가한다.

0개의 댓글