Docker

[Docker] Dockerfile 작성하기!

deep__sea 2024. 1. 15. 21:28
728x90

Dockerfile이란?

  • Dockerfile은 사용자가 docker image를 조합하기 위해 CLI에서 호출할 수 있는 모든 명령이 포함된 텍스트 문서입니다. 일종의 스크립트 파일입니다.
  • Dockerfile을 작성하기 위해서는 다양한 명령어들이 존재합니다.

Dockerfile 기본적인 명령어

# 기본 이미지를 지정합니다.
FROM ubuntu:latest
# 이미지를 유지보수하는 담당자의 정보를 제공합니다.
MAINTAINER Your Name <your.email@example.com>
# 명령어를 실해앟여 이미지를 빌드합니다.
RUN apt-get update && apt-get install -y \
    package1 \
    package2 \
    && rm -rf /var/lib/apt/lists/*
# 작업 디렉토리를 설정합니다.
WORKDIR /app
# 파일이나 디렉토리를 복사합니다.
COPY . /app
# 로컬 파일, URL, 또는 압축 파일을 이미지에 추가합니다.
ADD http://example.com/file.tar.gz /tmp/
# 컨테이너가 사용하는 포트를 노출합니다.
EXPOSE 80
# 컨테이너가 시작될 때 실행되는 명령어를 지정합니다.
CMD ["executable", "param1", "param2"]
# 컨테니어가 시작될 때 실행되는 실행 파일을 지정합니다.
ENTRYPOINT ["executable", "param1", "param2"]
# 환경 변수를 설정합니다.
ENV ENV_VARIABLE_NAME=value
# 볼륨을 마운트합니다.
VOLUME /data

저는 프론트엔드 개발자이기에 다음과 같이 작성해보았습니다.

FROM node:latest
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .

EXPOSE 3000

CMD ["npm", "run", "dev"]

위의 예시를 가지고 설명을 보충하자면 다음과 같습니다.

# node 버전 중 가장 최신 버전의 이미지를 가지고 오겠다.
FROM node:latest
# 컨테이너 내에서 app 디렉토리를 작업 디렉토리로 지정하겠다.
WORKDIR /app
# package.json을 WORKDIR(app)에 복사한다.
# 아래에 상세히 설명하였습니다.
COPY package.json .
# 의존성들을 설치한다.
RUN npm install
# 그러면 node_modules 디렉토리가 생성이 되었겠죠? 모든 파일을 전부 복사해줍니다.
COPY . .
# 노출 포트 3000
EXPOSE 3000
# 저희가 흔히 사용하느 개발서버 시작 명령어입니다. 규칙에 맞게 작성하면 됩니다. 아, 참고로 저는 vite로 quick start를 하여서 dev가 개발서버 실행 스크립트 명령어입니다. 따로 수정하지 않았거든요..ㅎ
CMD ["npm", "run", "dev"]

COPY package.json .

“좌(package.json)에서 우(.)로 복사하겠다”를 의미합니다.
여기서 package.json은 dockerfile 기준으로 같은 레벨에 위치한 package.json 파일을 의미합니다. 즉 ./package.json이랑 같은 의미입니다.
그리고 .은 복사할 위치인데, 이렇게 아무것도 명시하지 않고 .으로 표기할 경우 WORKDIR 를 의미합니다.
다시 말해 COPY package.json . = COPY package.json /app입니다.


자 작성이 끝났습니다. 이제 무엇을 해야할까요?
이미지를 생성하기 위한 dockerfile 작성이었으니 이미지를 이제 생성 해야겠죠?!

터미널을 엽니다. Dockerfile이 있는 경로까지 이동 후 아래 명령어를 실행합니다.

docker build -t react_sample .

구두점은 현재 디렉토리를 의미합니다.

  • -t : docker image 이름을 생성하기 위함

여기서 든 의문!

왜 굳이 현재 디렉토리에 빌드를 하는 것인가?
그 이유는 일반적으로 Dockerfile이나 빌드 컨텍스트의 위치를 지정하기 위한 것입니다. 이렇게 함으로써 Docker는 해당 디렉토리를 빌드 컨텍스트로 사용하고, Dockerfile 및 빌드에 필요한 모든 파일을 해당 디렉토리에서 찾습니다.
디렉토리 경로를 변경하고 싶다면 그렇게 해도 됩니다.

Container 생성 및 실행

docker run -d -p 3001:3000 --name {container_name} {image_name}
  • -d: 백그라운드 실행 여부
  • -p HostPort:ContainerPort : 포트 포워딩 - 3001번 포트로 접근하는 모든 트래픽을 3000번 포트로 보낸다.
  • —name : 생성할 컨테이너 이름 지정

Volume / Bind Mount

Docker Container 내에 쓰여진 데이터는 컨테이너가 삭제될 때 함께 사라집니다. 허나 Container의 생명 주기와 상관없이 데이터를 영속적으로 저장 해야하는 경우가 있습니다. 이럴 경우 사용할 수 있는 옵션이 있습니다.

바로 Volume과 bind mount 입니다.

다음은 예시입니다.

VOLUME /app/data

위의 예시는 호스트의 /var/lib/docker/volumes/<volume_id>/_data 디렉토리에 해당하는 볼륨을 생성합니다. 이 위치에는 컨테이너 내부의 /app/data 경로와 연결되는 호스트 머신의 볼륨 데이터가 저장됩니다.

호스트에서는 컨테이너의 데이터를 직접 확인하고 수정할 수 있습니다. 또한 컨테이너가 재시작 되거나 업데이트 되어도 이 데이터는 영향을 받지 않습니다.

728x90
반응형