freakyfrog98
code.log
freakyfrog98
전체 방문자
오늘
어제
  • 분류 전체보기 (17)
    • TIL (7)
    • 시스템프로그래밍 (3)
    • 알고리즘 코드블럭 (2)
    • Udemy-Docker-Kuberne.. (3)
    • Udemy-Hadoop (1)
    • Cloud (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Profile.

인기 글

태그

  • ARG
  • BFS
  • bindmount
  • Bucket
  • CloudStorage
  • cp명령어
  • cs
  • defaultdict
  • deque
  • Dijkstra

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
freakyfrog98

code.log

Udemy/Docker-Kubernetes-2022/볼륨 & ARG & ENV
Udemy-Docker-Kubernetes-2022

Udemy/Docker-Kubernetes-2022/볼륨 & ARG & ENV

2023. 1. 5. 19:34

섹션3

볼륨 종류와 개념

  • VOLUME [”도커내부저장소”]
  • 호스트 머신에 있는 미러링된 저장소를 알 수 있는 방법은
    • docker volume
  • 익명 볼륨
    • 익명 볼륨을 관리하는 것은 컨테이너. 컨테이너가 존재하는 동안에만 실제로 존재한다.
    • 컨테이너에 이미 존재하는 특정 데이터를 잠그는데 유용하다.
  • 명명된 볼륨
    • 컨테이너 종료후에도 살아있다. 영구적이어야하는 데이터이거나 편집하거나 직접 볼 필요가없는 중요한 데이터에 적합
    • 실질적으로 호스트 머신의 폴더에 엑세스하지 않을 것이기 때문
    • 도커파일 내부에 named volume 생성 불가
    • docker run …. -v [volume_name]:[컨테이너내부저장소]
  • docker volume ls
  • docker rmi [imagename]

Bind mount

  • 소스코드가 변경되어도 이미지를 다시 빌드 하지 않는 이상 실행중인 컨테이너에 반영되지 않는다.
  • 볼륨이 실제로 호스트머신에 위치한 경로를 모른다.
    • 하지만 바인드 마운트는 호스트 머신 상 매핑될 컨테이너의 경로를 설정하기 때문에 안다.
    • 우리가 그 폴더에서 수정을 가하면 컨테이너는 스냅샷(도커파일이 위치한 경로)에서 복사하지 않고 여기(바인딩 마운트)에서 카피한다.
    • 영구적이고 편집 가능한 데이터에 적합
  • docker run ….-v [호스트머신상의폴더]:[매핑될컨테이너내부]
    • sharing resource상의 상위폴더가 포함되어있어야한다.
  • macOS / Linux: -v $(pwd):/app → 현재폴더

문제해결

  • 로컬폴더에 종속성이 없기 때문에 오류가 생긴다.
  • 컨테이너에 이미 파일들이 있다고 가정
    • 외부 볼륨에도 파일이 존재 할것
  • 컨테이너 내부에 파일들이 아직 없고 로컬호스트시스템에는 존재할때
  • 컨테이너 내부 app 폴더에 copy 명령으로 파일들을 갖고있다.
  • 호스트머신의 dockerfile 있는 폴더에도 이 파일들과 폴더들이 있다.
    • 도커가 호스트머신의 로컬 파일을 덮어쓰지않는다. 대신 로컬호스트폴더안의 내용들이 도커 컨테이너에 있는 내용을 덮어쓴다.
    • 그때문에 node_modules 등의 종속성들이 제거된 것
    • 그렇다면 도커에게 컨테이너 내부에 덮어쓰면 안되는 폴더와 파일들이 있다고 알려야 한다.
    • 그것을 또다른 익명 볼륨을 이용해서 해결할 수 있다
      • docker run -d -p 3000:80 —name feedback-app -v [localPath]:/app -v /app/node_modules [imagename]
        • # 도커파일에서 VOLUME ["/app/node_modules"] 와 동일한 효과
      • 볼륨들이 중첩되어 충돌이 일어날 경우 더 긴 내부 경로를 가진쪽을 우선한다.
        • 따라서 npm install 이후 컨테이너에 설치된 node_modules을 익명볼륨에 마운트 → 이후 상위 폴더 바인딩마운트(컨테이너가호스트상태와동일하게유지) but 이미 node_modules가 마운트되어있기때문에 상위폴더에 맵핑된 호스트머신의 폴더 상태를 다시 카피해오지 않는다.
          • i.e.e 컨테이너내부경로 with 호스트머신경로
            /app/node_modules with [somewhere] : 익명볼륨(따라서 숨겨진경로)
            /app with . #도커파일위치한현재경로 : bind mount
          • 경로가 더 긴 익명볼륨 먼저 마운트 → 따라서 상위폴더의 bind mount로 호스트머신의 파일들을 /app으로 카피해올때 /app/node_modules는 예외가 된다.

Read Only Volume

  • BindMount 사용하는 이유는 호스트머신 상태를 컨테이너가 유지하는것이고, 실행중인 컨테이너가 호스트머신의 상태를 변경시키면 안된다. 하지만 default 상태는 RW이기때문에 읽기전용으로 바꾸어주어야 이러한 위험에서 완전히 벗어날 수 있다.
    → 따라서 ReadOnlyVolume의 필요성
  • -v [호스트경로]:[내부경로]:ro
    • 위에서와 동일하게 상위폴더와 하위폴더의 권한이 다르다면, 경로가 더 긴 하위폴더의 권한을 우선하고 그 외의 것들은 상위폴더의 권한을 따른다.

Dockerfile COPY vs Bind Mount

  • docker run 은 개발중에 사용하는 명령이다.
  • 프로덕션 환경에선 항상 코드의 스냅샷을 갖고 싶어 한다. 따라서 COPY를 사용

.dockerignore

  • COPY 명령으로 복사되면 안되는 폴더와 파일을 지정할 수 있다.
  • 만약에 로컬에 node_modules가 존재했고 이것에 종속성이 누락되거나 old 버전일 경우 COPY되면 npm install로 만들어진 폴더를 덮어쓰기 때문에 무시해야한다.

ARG & ENV

  • ENV
    • 도커파일에 추가
    • ENV PORT 80
    • 이후 도커파일에서 이 변수를 사용 가능
      • EXPOSE $PORT
    • 또한 다른 소스코드에서 process.env.PORT와 같은 형태로도 사용 가능
    • 디폴트 값이 아닌 다른 값을 사용하고자 하면 docker run 커맨드에 옵션을 추가
      • --env PORT=8000
      • -e PORT=3000 -e NAME=”John”
    • .env 파일 생성해서 해줘도 된다.
      • PORT=8000
      • docker run 커맨드에서는 --env-file ./env
    • 보안 주의
  • ARG
    • 같은 이미지에 여러개의 다른 ENV 디폴트 값을 갖게해 실행하고 자 한다면
    • 도커파일에서
      • ARG DEFAULT_PORT=80
      • ENV PORT $DEFAULT_PORT 이런 느낌으로 사용
      • 이것은 소스코드에서는 사용불가하다. 도커파일에서만 사용가능하고 컨테이너가 시작될 떄 시작되는 런타임 명령이기 때문에 도커파일에서도 사용불가한 곳(CMD)도 있다.
    • 디폴트값 아닌 것을 사용하고 싶을 때
      • docker run 커맨드에서 --build-arg DEFAULT_PORT=8000
  • ENV와 ARG 모두 레이어이며 이것이 변경될 경우 후속 레이어들도 리빌드 되기 때문에 도커파일에서 아래쪽에 위치시키는 것이 효율적이다.

'Udemy-Docker-Kubernetes-2022' 카테고리의 다른 글

Udemy/Docker-Kubernetes-2022/네트워크,컨테이너간통신  (0) 2023.01.19
Udemy/Docker-Kubernetes-2022/도커 기본 커맨드 & 도커 이미지  (0) 2023.01.05
    'Udemy-Docker-Kubernetes-2022' 카테고리의 다른 글
    • Udemy/Docker-Kubernetes-2022/네트워크,컨테이너간통신
    • Udemy/Docker-Kubernetes-2022/도커 기본 커맨드 & 도커 이미지
    freakyfrog98
    freakyfrog98

    티스토리툴바