[Docker] Dockerfile 만들어보기
비전공자도 이해할 수 있는 Docker 입문/실전 (박재성)
📢 Dockerfile이란?
도커 허브를 통해서 이미지를 다운 받아 컨테이너를 구성할 수 있다. 이 때 이미지를 만들기 위한 설계도와 같은 역할을 하는 것이 Dockerfile이다.
이미지 자체를 공유하는 것이 아닌 이미지를 생성하기 위한 스크립트를 공유함으로써 배포에 용이하다.
🎈 도커 이미지 생성
✅ Dockerfile을 통해서 이미지를 생성할 수 있는데 명령어는 다음과 같다.
docker build -t [이미지명][태그명] Dockerfile경로
- 태그명을 작성하지 않으면 자동적으로 latest 로 생성된다.
⚙ 명령어
1️⃣ FROM
베이스 이미지를 생성하는 역할을 한다. 컨테이너를 구성할 시 필요한 초기 이미지를 기반으로 셋팅을 하게 된다.
✅ 다음과 같이 FROM 뒤에 이미지 정보를 작성하면 된다.
FROM [이미지명]:[태그명]
- 멀티스테이지 빌드 구현시 여러 이미지를 사용할 수 있다고 한다.
✨ alpine 태그는 핵심적인 내용만 남겨놓고 나머지는 모두 제거된 이미지이다. alpine 태그를 많이 사용한다.
2️⃣ 파일 복사
호스트 컴퓨터에 있는 파일을 복사해서 컨테이너로 전달이 가능하다.
✅ 명령어는 COPY를 사용한다.
COPY [호스트 컴퓨터 경로]:[컨테이너 경로]
✅ 컨테이너의 디렉토리로 복사하는 경우 경로 끝에 / 를 붙여야 한다.
COPY my-directory /my-directory/
- 경로 뒤에 / 를 붙이지 않는 경우 해당 이름의 파일로 복사가 된다.
- 디렉토리가 존재하지 않으면 생성도 해준다.
✅ 와일드카드 표현을 통해서 한번에 여러개의 파일을 복사할 수 있다.
COPY *.txt /files/
- 해당 경로에 있는 txt 확장자 파일들 모두 /files 디렉토리로 복사하게 된다.
✅ 특정 폴더/파일을 제외하고 복사할 땐 .dockerignore 파일을 사용하면 된다.
readme.txt
test1.txt
- 위와 같이 한줄에 하나씩 제외할 폴더/파일을 추가해주면 된다.
3️⃣ RUN
이미지를 생성하는 과정에서 명령어를 실행시켜야할 때 사용한다. docker build 할 때 한번 호출된다.
✅ 명령어는 RUN을 사용한다.
RUN [명령문]
RUN npm install
- RUN은 이미지 생성과정에서 필요한 명령어를 실행시킬 때 사용
- RUN은 FROM에서 설정한 이미지 위에서 명령어를 실행시킨다.
- ENTRYPOINT와 헷갈리지 않도록 주의!
✅ 아래는 사용 예시이다.
FROM ubuntu
RUN apt update && apt install -y git
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
- ubuntu 이미지를 베이스 이미지로 사용한다(해당 이미지 설치).
- ubuntu에서 git을 설치한다.
4️⃣ WORKDIR
WORKDIR으로 작업 디렉토리를 전환하면 그 이후에 등장하는 모든 명령문은 해당 디렉토리를 기준으로 실행하게 된다.
✅ 즉, 작업하려는 디렉토리를 변경할 때 사용된다.
WORKDIR [작업 디렉토리로 사용할 경로]
WORKER /my-dir
5️⃣ ENTRYPOINT
해당 이미지를 사용하는 컨테이너를 시작할 때 실행되는 명령어이다.
✅ 명령어는 ENTRYPOINT을 사용한다.
ENTRYPOINT [명령문...]
ENTRYPOINT ["node", "dist/main.js"]
- ENTRYPOINT는 컨테이너가 시작될 때 실행되는 명령문이다.
- RUN과 헷갈리지 말자!
✅ CMD와 함께 사용해서 CMD에 명령문의 인자를 설정할 수 있다.
ENTRYPOINT ["node"]
CMD ["dist/main.js"]
- 명령문과 인자를 분리할 수 있다.
✅ 컨테이너에 이미지가 정상적으로 작동되는지 확인하기
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
- 컨테이너 내부에 실행중인 서비스가 존재하지 않으면 실행 후 종료된다.
- 컨테이너가 정상적으로 설치되는지 확인하기 위해 logs 명령어를 통해서 확인이 가능하다.
- 하지만, 직접 컨테이너 내부로 진입해서 확인하고 싶은 경우가 존재한다.
- 종료된 컨테이너에는 exec를 통해 접근이 불가능하다.
- 이때 위와 같은 명령어를 통해 일정시간동안 컨테이너가 실행중이 되도록 만들 수 있다.
- 위의 명령문은 500초 동안 컨테이너를 실행시켜준다.
6️⃣ EXPOSE
컨테이너 내부에서 어떤 포트에 프로그램이 실행중인지를 문서화만 해준다.
✅ 말그대로 문서역할만 하기 때문에 해당 명령어가 동작에 영향을 주지는 않는다. -p 옵션과 같은 역할을 하는게 아니다.
EXPOSE [포트 번호]
EXPOSE 3000