기존의 가상머신(VM) 서버
컨테이너 서버
도커가 가진 컨테이너는 독립적이고, 동적이다.
FROM
베이스 이미지를 지정한다. 반드시 지정해야 하며 어떤 이미지도 베이스 이미지가 될 수 있다. tag는 될 수 있으면 기본값보다 구체적인 버전(16.04등)을 지정하는 것이 좋다. 이미 만들어진 다양한 베이스 이미지는 Docker hub에서 확인할 수 있다.
MAINTAINER
Dockerfile을 관리하는 사람의 이름 또는 이메일 정보를 적는다. 빌드에 딱히 영향을 주지는 않는다.
COPY
파일이나 디렉토리를 이미지로 복사한다. 일반적으로 소스를 복사하는 데 사용한다. target 디렉토리가 없다면 자동으로 생성한다.
ADD
COPY명령어와 매우 유사하나 몇가지 추가 기능이 있습니다. src에 파일 대신 URL을 입력할 수 있고 src에 압축 파일을 입력하는 경우 자동으로 압축을 해제하면서 복사됩니다.
RUN
가장 많이 사용하는 구문입니다. 명령어를 그대로 실행합니다. 내부적으로 /bin/sh -c 뒤에 명령어를 실행하는 방식입니다.
CMD
도커 컨테이너가 실행되었을 때 실행되는 명령어를 정의합니다. 빌드할 때는 실행되지 않으며 여러 개의 CMD가 존재할 경우 가장 마지막 CMD만 실행됩니다. 한꺼번에 여러 개의 프로그램을 실행하고 싶은 경우에는 run.sh 파일을 작성하여 데몬으로 실행하거나 supervisord, forego와 같은 여러 개의 프로그램을 실행하는 프로그램을 사용합니다.
WORKDIR
RUN, CMD, ADD, COPY등이 이루어질 기본 디렉토리를 설정합니다. 각 명령어의 현재 디렉토리는 한 줄마다 초기화되기 때문에 RUN cd /path를 하더라도 다음 명령어에선 위치가 초기화 됩니다. 같은 디렉토리에서 계속 작업하기 위해서 WORKDIR을 사용합니다
EXPOSE
도커 컨테이너가 실행되었을 때 요청을 기다리고 있는(Listen) 포트를 지정합니다. 여러개의 포트를 지정할 수 있습니다.
VOLUME
컨테이너 외부에 파일시스템을 마운트 할 때 사용합니다. 반드시 지정하지 않아도 마운트 할 수 있지만, 기본적으로 지정하는 것이 좋습니다.
ENV
컨테이너에서 사용할 환경변수를 지정합니다. 컨테이너를 실행할 때 -e옵션을 사용하면 기존 값을 오버라이딩 하게 됩니다.
여기까지 Dockerfile에서 가장 많이 사용하는 명령어에 대해 알아보았습니다. 모든 명령어가 궁금하신 분은 공식문서를 참고하시면 됩니다.
도커 이미지는 컨테이너를 실행하기 위해 필요한 파일들의 모음이다.
이미지를 만들기 위해서 Dockerfile이라는 이미지 생성 파일이 필요하다.
FROM openjdk:8-jdk-alpine #베이스 이미지 파일
COPY build/libs/demo-0.0.1-SNAPSHOT.jar app.jar #컨테이너 내부로 파일 복사
ENTRYPOINT ["java","-jar","/app.jar"] #컨테이너 생성되면서 실행
ENTRYPOINT와 CMD 차이점
ENTRYPOINT와 CMD의 가장 큰 차이점은 바로 컨테이너 시작 시 실행 명령에 대한 Default 지정 여부이다.
만약 ENTRYPOINT를 사용하여 컨테이너 수행 명령을 정의한 경우,
해당 컨테이너가 수행될 때 반드시 ENTRYPOINT에서 지정한 명령을 수행되도록 지정된다.
하지만, CMD를 사용하여 수행 명령을 경우에는,
컨테이너를 실행할 때 인자 값을 주게 되면 Dockerfile에 지정된 CMD 값을 대신 하고 지정한 인자 값으로 변경하여 실행되게 된다.
docker build -t {이미지명}:{태그} {Dockerfile 파일 위치}
docker build -t my-springboot .
-t는 이름 옵션이다.
docker images
docker rmi {이미지id}
docker run --name {컨테이너 이름} -p {호스트 포트}:{컨테이너 포트} -d {이미지명}:{이미지태그}
docker run --name run-my-springboot -p 8080:8080 -d my-springboot
8080:8080에서 앞에 8080은 호스트 포트, 뒤에 8080은 컨테이너 포트다.
8081:8080이면 호스트에 8081포트로 접속하는 것을 컨테이너에 8080포트로 연결해준다는 뜻이다.
-d는 이미지를 백그라운드로 실행시킨다는 옵션이다. -d를 생략하면 터미널에서 Ctrl + C를 눌러서 빠져나오는 순간 해당 컨테이너는 종료된다.
생성된 컨테이너 확인
docker ps
컨테이너 정지
docker stop {컨테이너명}
정지된 컨테이너 확인
docker stop {컨테이너명}
정지된 컨테이너 삭제
docker rm {컨테이너명}
참고
우노! 최운호. “[Kubernetes] 도커와 쿠버네티스 간단 비교.” 우노!, TISTORY, 7 July 2021, https://wooono.tistory.com/109.
[Docker] 개념 정리 및 사용 - Cultivo-Hy.github.io. https://cultivo-hy.github.io/docker/image/usage/2019/03/14/Docker%EC%A0%95%EB%A6%AC/.
클쏭 . “Dockerfile Entrypoint 와 CMD의 올바른 사용 방법.”, TISTORY, 14 June 2019, https://bluese05.tistory.com/77.