ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Docker] Dockerfile 작성하기!
    Docker 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
    반응형
Designed by Tistory.