DockerFile 명령어 정리
도커를 이용하여 배포하고 있는데 Dockerfile이 어떻게 실행되는지 의문점이 들었다.
신규 프로젝트를 들어가기전 Docker에 대해서 공부하고 파일을 작성해보면서 공부해보고싶었다.
Dockerfile 명령어를 공부하고 어떻게 실행되어 만들어지는 확인해보고싶었다.
Dockerfile이란?
- 도커 이미지를 생성하기 위한 스크립트 파일이다.
- 여러가지 명령어를 통하여 Dockerfile을 작성 후 빌드하면 DockerFile은 작성한 순서대로 명령어를 실행하여 도커 이미지를 생성해준다.
- 그렇기에 Dockerfile을 분석할 수 있다면 해당 이미지가 어떻게 구성되어있고 빌드되는지 파악할 수 있다.
주의 사항
- Dockerfile은 순서대로 실행한다는 것을 항상 기억해야한다.
- Dockerfile은 프로젝트 최상위 디렉토리를 위치 해야한다.
명령어를 살펴보자
FROM 명령어
하나의 Docker 이미지는 베이스 이미지부터 시작해서 새로운 이미지를 쌓아가며 만들어 진다.
FROM 명령문은 이 base 이미지를 지정해주기 위해서 사용되는데, 보통 Dockerfile 내에서 최상단에 위치한다. base 이미지는 일반적으로 Docker Hub와 같은 곳에 오피셜 image을 주로 사용한다.
FROM <이미지>
FROM <이미지>:<태그>
# 자바 11버전 이미지를 베이스 이미지로 가져오겠다!
FROM openjdk11
WORKDIR 명령문
WORKDIR 명령문은 cd 명령문처럼 컨테이너 상에서 작업 디텍토리로 전환을 위해서 사용된다. WORKDIR 명령문으로 작업 디렉터리를 전환하면 그 이후에 등장하는 모든 RUN, CMD, ENTRYPOINT COPY, ADD 명령문은 해당 디렉터리를 기준으로 실행됩니다.
WORKDIR <이동할 경로>
# /usr/app 경로로 이동하여 다음 명령어를 수행한다.
WORKDIR /usr/app
RUN 명령문
RUN 명령어는 말 그대로 특정 명령어(커맨드)를 실행할 때 사용한다.
사용한다면 이미지 안에 특정 소프트웨어를 설치하고 싶을 때 사용할 수 있을거 같다.
RUN ["<커맨드>", "<파라미터1>", "<파라미터2>"]
RUN <전체 커맨드>
ENTRYPOINT 명령문
ENTRYPOINT명령문은 이미지를 컨테이너로 띄울 때 항상 실행되야 하는 커맨드를 지정할 때 사용합니다. DockerFile 내에서 1번만 정의할 수 있다.
ENTRYPOINT ["<커맨드<","<파라미터1>","<파라미터2>"]
ENTRYPOINT ["java","-jar","/app.jar"]
# $ java -jar app.jar 같은 의미이다.
EXPOSE 명령문
EXPOSE 명령문은 네트워크 상에서 컨테이너로 들어오는 포트와 프로토콜를 지정하기 위해서 사용됩니다. 프로토콜은 TCP와 UDP 중 선택할 수 있는데 지정하지 않으면 TCP가 기본값으로 사용된다.여기서 주의할 점은 EXPOSE 명령문으로 지정된 포트는 해당 컨테이너는 내부에서만 유효하며, 호스트 컴퓨터에서는 이 포트를 바로 접근할 수 있는것이 아니다. 호스트 컴퓨터로부터 해당 포트로의 접근을 허용하려면, docker run커맨드를 -p 옵션을 통해 호스트 컴퓨터의 특정 포트를 포워딩(forwarding) 시켜야 한다.
# tcp 80포트 설정
EXPOSE 80
#udp 9999 포트 설정
EXPOSE 9999/udp
# 만약 외부에서 접속하고 싶다면 이런식으로 사용할 수 있다.
$ docker run -p <원하는포트>:80
COPY/ADD 명령문
COPY 명령문은 호스트 컴퓨터에 있는 디렉터리나 파일을 Docker 이미지의 파일 시스템으로 복사하기 위해서 사용됩니다. 절대 경로와 상대 경로를 모두 지원하며, 상대 경로를 사용할 때는 이 전에 등장하는
WORKDIR명령문으로 작업 디렉터리를 어디로 전환을 해놨는지 고려해야 한다.
# 해당 app 폴더 밑에 모든 디렉터리를 컨테이너 디렉터리에 복사하겠다는 뜻
WORKDIR app/
COPY . .
ADD명령문은 좀 더 파워풀한 COPY명령문이라고 생각할 수 있습니다. ADD 명령문은 일반 파일 뿐만 아니라 압축 파일이나 네트워크 상의 파일도 사용할 수 있습니다. 이렇게 특수한 파일을 다루는 게 아니라면 COPY명령문을 사용하는 것이 권장된다.
ENV 명령문
ENV <키> <값>
ENV <키>=<값>
ENV 명령문은 환경 변수를 설정하기 위해서 사용한다.
쉽게 생각하면 application.yml 에서 데이터베이스 환경 설정하는 것처럼 이용하면 될 꺼 같다.
이미지 빌드 시에도 사용되고 해당 컨테이너에서 돌아가는 애플리케이션에서도 접근 가능하다.
ARG 명령문
ARG <이름>
ARG <이름>=<기본 값>
ARG 명령문은 docker build 커맨드로 이미지를 빌드 시--build-arg 옵션을 통해 넘길 수 있는 인자를 정의하기 위해 사용된다.
ARG port=8080
# docker build --build-arg port=8080 와 같은 뜻이다.
# 이름을 변수를 받아 올 수 있다. == ${port}
ENV 와 달리 ARG로 설정한 값은 이미지가 빌드되는 동안에만 유효하다는 점이다.
정리
| 명칭 | 특징 및 설명 |
| FROM | base 이미지 설정 |
| WORKDIR | 작업 디렉터리 설정 |
| RUN | 이미지 빌드 시 커맨드 실행 |
| ENTRTPOINT | 이미지 실행 시 항상 실행되야 하는 커맨드 설정 |
| CMD | 이미지 실행 시 디폴트 커맨드 또는 파라미터 설정 |
| EXPOSE | 컨테이너가 리스닝할 포트 및 프로토콜 설정 |
| COPY/ADD | 이미지의 파일 시스템으로 파일 또는 디렉터리 복사 |
| ENV | 환경 변수 설정 |
| ARG | 빌드 시 넘어올 수 있는 인자 설정 |
참고
Dockerfile에서 자주 쓰이는 명령어
Engineering Blog by Dale Seo
www.daleseo.com
'Infra' 카테고리의 다른 글
| Docker + 스프링부트 SSL 인증서 적용해보기 (0) | 2023.04.04 |
|---|---|
| EC2에 OpenVidu 서버 배포 (0) | 2023.04.04 |
| Docker로 개발서버 배포기 (0) | 2023.04.04 |