-
[Docker] Dockerfile 작성하기!Docker 2024. 1. 15. 21:28728x90
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반응형'Docker' 카테고리의 다른 글
[Docker] docker-compose 작성하기! (0) 2024.01.16 [Docker] open /Users/사용자/.docker/buildx/activity/desktop-linux: permission denied 해결 방법 (mac) (0) 2024.01.10