Dockerfile 명령어 메모
FROM
FROM <이미지>
FROM <이미지>:<태그>
하나의 Docker 이미지는 base 이미지부터 시작해서 기존 이미지위에 새로운 이미지를 중첩해서 여러 단계의 이미지 층(layer)을 쌓아가며 만들어지며 최상단의 FROM절이 이미지의 base가 된다.
- Ubuntu 최신 버전을 base 이미지로 사용
FROM ubuntu:latest
- NodeJS 12를 base 이미지로 사용
FROM node:12
- Python 3.8 (alpine 리눅스 기반)을 base 이미지로 사용
FROM python:3.8-alpine
WORKDIR
WORKDIR <이동할 경로>
쉘(shell)의 cd 명령문처럼 컨테이너 상에서 작업 디텍토리로 전환을 위해서 사용되며 WORKDIR 명령문으로 작업 디렉터리를 전환하면 그 이후에 등장하는 모든 RUN, CMD, ENTRYPOINT, COPY, ADD 명령문은 해당 디렉터리를 기준으로 실행된다.
RUN
RUN ["<커맨드>", "<파라미터1>", "<파라미터2>"]
RUN <전체 커맨드>
RUN은 이미지 빌드 과정에서 필요한 커맨드를 실행하기 위해서 사용되며, 보통 npm등 패키지 설치에 사용하게 된다.
- npm 패키지 설치
RUN npm install --silent
- pip 패키지 설치
RUN pip install -r requirements.txt
ENTRYPOINT
ENTRYPOINT ["<커맨드>", "<파라미터1>", "<파라미터2>"]
ENTRYPOINT <전체 커맨드>
이미지 실행시 항상 실행되야 하는 커맨드를 지정할 때 사용한다.
- npm start 스크립트 실행
ENTRYPOINT ["npm", "start"]
- Django 서버 실행
ENTRYPOINT ["python", "manage.py", "runserver"]
CMD
CMD ["<커맨드>","<파라미터1>","<파라미터2>"]
CMD ["<파라미터1>","<파라미터2>"]
CMD <전체 커맨드>
이미지 실행시 default 명령어나, ENTRYPOINT에 넘길 기본 값을 정의한다.
ENTRYPOINT ["node"]
CMD ["index.js"]
- node index.js 실행
$ docker run test
- node main.js 실행
$ docker run test main.js
EXPOSE
EXPOSE <포트>
EXPOSE <포트>/<프로토콜> (default : TCP)
네트워크 상에서 컨테이너로 들어오는 트래픽(traffic)을 리스닝(listening)하는 포트와 프로토콜를 지정하기 위해서 사용된다. 지정하더라도 호스트에서 접근시에는 -p를 이용하여 publish 해주어야 한다.
COPY/ADD
COPY <src>... <dest>
COPY ["<src>",... "<dest>"]
호스트 컴퓨터 파일을 이미지로 복사할 때 사용한다. WORKDIR 지정 시 상대경로로는 WORKDIR에 위치한 상태로 지정되는 것을 유의해야 한다.
ADD 명령문은 COPY와 동일하나, 일반 파일 뿐만 아니라 압축 파일이나 네트워크 상의 파일도 사용할 수 있다.
ENV
ENV <키> <값>
ENV <키>=<값>
이미지 환경 변수를 설정할 때 사용한다. 빌드 할 때와, 컨테이너 내에서도 사용 가능하다.
- NODE_ENV 환경 변수를 production으로 설정
ENV NODE_ENV production
ARG
ARG <이름>
ARG <이름>=<기본 값>
docker build 커맨드로 이미지를 빌드 시, –build-arg 옵션을 통해 넘길 수 있는 인자를 정의하기 위해 사용한다.
예를 들어, Dockerfile에 다음과 같이 ARG 명령문으로 port를 인자로 선언해주면,
ARG port # port=8080 (기본값 지정시)
다음과 같이 docker build 커맨드에 –build-arg 옵션에 port 값을 넘길 수가 있다.
$ docker build --build-arg port=8080 .
설정된 인자 값은 다음과 같이 ${인자명} 형태로 읽어서 사용할 수 있다.
CMD start.sh -h 127.0.0.1 -p ${port}
ENV와의 차이점은 빌드 내에서만 유효한 값이라는 점이다.
요약
명령어 | 용도 |
---|---|
FROM | base 이미지 설정 |
WORKDIR | 작업 디렉터리 설정 |
RUN | 이미지 빌드 시 커맨드 실행 |
ENTRYPOINT | 이미지 실행 시 항상 실행되야 하는 커맨드 설정 |
CMD | 이미지 실행 시 디폴트 커맨드 또는 파라미터 설정 |
EXPOSE | 컨테이너가 리스닝할 포트 및 프로토콜 설정 |
COPY/ADD | 이미지의 파일 시스템으로 파일 또는 디렉터리 복사 |
ENV | 환경 변수 설정 |
ARG | 빌드 시 넘어올 수 있는 인자 설정 |
기타
Window Docker Desktop과 WSL2 통합하기
wls -l -v # 사용중인 버전 확인
ex)
NAME STATE VERSION
* Alpine Running 1
docker-desktop Running 2
Ubuntu-22.04 Running 1
docker-desktop-data Running 2
wsl --set-version Alpine 2 # 2버전으로 변경
wsl --set-version Ubuntu-22.04 2 # 2버전으로 변경
Docker-desktop > General > Use the WSL 2 based engine
Docker-desktop > Resources > WSL Integration > Enable intergration with my defauilt distro
위에서 변경한 2버전 항목들이 목록으로 노출되며, 설정 포함시 통합된다.