계속 말하지만 이미지는 컨테이너의 청사진으로 컨테이너는 이미지의 모든 레이어위에 컨테이너 레이어가 올라간다.
이미지일때는 읽기 전용
컨테이너일 때는 읽기-쓰기 가능
볼륨은 하나의 폴더로써 호스트 머신위에서 존재하며, 하디디스크는 컨테이너에 의해서 마운트 된다. 도커에 의해 관리된다.
호스트 머신이란, 내 PC 를 뜻한다.
두 볼륨의 공통점: 도커는 호스트 머신의 데이터가 저장 될 폴더와 경로를 설정한다. 하지만 구체적인 경로는 알 수 없다.
실제 공간인 디스크를 사용하기 위해서 현재 사용하고 있는 운영체제에 연결하는 것
위 그림처럼 위에서부터 익명, 네임드, 바인드 마운트 순이다.
docker run -v /app/data
도커 이미지/컨테이너의 파일 시스템 상에서 호스트 머신에 마운트 할 경로를 지정한다. 익명이기에 이름은 없다
docker run -v volume-name:/app/data
도커 이미지/컨테이너의 파일 시스템 상에서 호스트 머신에 마운트 할 경로를 지정한다. 이름을 경로앞에 [이름:경로] 와 같이 입력한다.
docker run –v /path/to/code:/app/code …
호스트 머신에서 마운트될 저장공간의 절대 경로를 입력한다.
node.js 예시이다.
FROM node:14
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE $PORT
CMD [ "npm", "start" ]
한번 이미지로 부터 실행된 컨테이너는 원본 소스코드가 변경되도 컨테이너의 소스코드는 변경되지 않는다.
하지만 바인드 마운트를 사용하여 컨테이너에서 사용될 어플리케이션 소스코드를 호스트 머신의 원본 소스코드가 존재하는 저장공간에 바인딩 마운트하여 컨테이너에서 어플리케이션을 실행하고자 하는 소스코드가 호스트 머신의 마운트된 저장공간에서 존재하기 때문에 호스트 머신에서의 소스 코드 수정이 컨테이너에 반영이 된다.
위의 Dockerfile 을 사용하여 아래의 docker run 을 하게 될 경우 node module 이 없다는 에러가 발생한다.
docker run -p 3000:8000 -d --rm --name 컨테이너이름 -v feedback:/app/feedback -v "D:\docker-study\섹션3\data-volumes-02-added-dockerfile\data-volumes-02-added-dockerfile:/app" feedback-node
위의 명령어에 -v /app/node_modules 옵션을 추가한다.
FROM node:14
ARG DEFAULT_PORT=80
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
ENV PORT ${DEFAULT_PORT}
EXPOSE $PORT
CMD [ "npm", "start" ]
ARG 로 Docker 파일 내에서 사용할 변수를 설정하는데 사용한다.
ENV 로 소스코드에서 사용할 환경변수를 설정하며 Dockerfile 내에서 CMD 를 제외하고 사용가능 하다.
Dockerfile 내부에서 ENV를 사용하지 않고 설정할 수 있다.
프로젝트 내부에서 .env 파일을 생성 후 위와 같이 작성한다.
Docker run --env-file .env
로 대체 가능하다.
Docker run --env PORT=8000
ENV 명령어 .env 파일이 없어도 위와 같이 설정할 수 있다!