본 포스팅은 Introduction to Docker 를 번역한 내용입니다. 이해를 쉽게 하기 위해 의역하였고 생각을 덧붙였습니다. Happy Docker! ☺️
도커를 다운로드 받아 백과 프론트 환경을 컨테이너로 만들어보았지만, 컨테이너가 무엇인지에 대한 이해는 부족했다. 무언가를 제대로 이해하기 위해서는 그 무언가가 어떤 의미와 맥락을 가지는지 이해하는 것이 먼저라고 생각했다. 그래서 차근차근 컨테이너와 도커가 무엇인지, 왜 필요한 것인지와 관련해 파헤쳐 보고자 한다.
컨테이너는 프로젝트를 실행하기 위한 모든 요소가 들어있는 박스이다. 다음과 같은 요소가 표함될 수 있다.
도커는 컨테이너를 관리하기 위한 소프트웨어이다. 도커파일을 정의하기 위해서는 일단 도커 이미지가 무엇인지를 알아야한다.
도커이미지는 컨테이너의 구조를 정의한다. 도커이미지를 하나의 평면도라고 생각해본다면 평면도로 많은 집을 똑같이 만들 수 있듯, 하나의 도커 이미지로 많은 컨테이너를 만들 수 있는 것이다. 그리고 그러한 도커 이미지를 쉽게 만들기 위한 가장 유명한 방법은 도커 파일이다.
어떻게 도커이미지를 만들 것인가에 대한 명령어(지시사항)를 가지고 있는 텍스트 파일이다. 도커 이미지를 만들기 위해서 도커는 도커파일에 쓰인 명령어를 실행한다.
FROM openjdk: 11
ADD target/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
위와 같은 도커파일이 있다고 가정할 때, 명령어 하나하나를 파헤쳐 보도록 하자.
FROM openjdk: 11
도커 파일을 실행하기 위해서는 이미 존재하고 있던 이미지 Base image
가 필요하다. 이러한 Base image
에는 자바, 우분투가 있다. 그래서 어떤 환경 위에 이 도커이미지를 실행시킬 것인가에 대한 정의가 도커파일의 맨 윗단에 위치해야 한다. 가령 위 도커파일에서는 FROM openjdk:11
이 Base image
이다.
공통된 규격은 다음과 같다.
FROM <baseImagaName>:<tag>
첫줄을 실행시키기 위해서 docker registry
(도커 저장소)에서 이미지를 불러온다. docker registry
는 깃헙과 같은 것인데, 가장 흔히 쓰이는 도커 저장소에는 docker Hub
가 있다.
<tag>
가 의미하는 것은?<tag>
는 Base image
의 버전을 구체화한다. 만약 <tag>
를 정의하지 않으면 도커는 가장 최신화된 버전을 베이스 이미지로 불러온다.
ADD target/*.jar app.jar
베이스 환경이 갖추어 졌으면, 프로그램을 실행하기 위한 소스 파일을 불러올 필요가 있다. 일명 코드파일이라고 하는 것들인데, java
의 경우 jar
로 의존성과 프로그램을 실행시키기 위한 코드가 압축되기 때문에 ADD [파일이 위치한 곳] [하나의 jar로 압축하기 위한 이름]
이라는 명령어를 사용할 수 있다.
node.js
의 경우 어떤식으로 환경을 구성할까?필요한 코드들을 불러온다고 할 때, ADD
대신 COPY
라는 명령어를 사용할 수 있다. node.js
를 예로 들어보자. 참고로 COPY
밑줄은 이 소스코드를 실행시키기위한 의존파일들을 설치하기 위한 것이다.
FROM node:17-alpine
WORKDIR /app # 새로운 디렉토리를 만든다.
COPY src/ . # 소스 파일 아래에 있는 소스코드들을 현재 파일로 복사한다.
RUN npm install
CMD ["node", "app.js"]
ENTRYPOINT ["java","-jar","app.jar"]
Java 애플리케이션을 실행하기 위한 명령어이다. 한 줄로 명령어를 정리하자면, java -jar appname.jar
이다. 어떤 애플리케이션을 실행시키기 위한 두 가지 명령이 있다. ENTRYPOINT
와 CMD
이다.
위 단계에서 도커 파일이 무엇인지를 정의하였다. 정의한 도커 파일을 빌드(build)하여 도커 이미지를 만든다. 그리고 도커라는 소프트웨어를 통해서 만들어진 도커 이미지를 실행(Run)하면 도커 컨테이너가 만들어진다. 명령어는 다음과 같이 수행할 수 있다.
docker build -t <imageName>:<tag> <dockerfilePath>
# -t 플래그는 이미지의 이름이나 태그를 주기위해 사용된다.
# 도커 파일이 존재하는 경로는 보통 root directory(.)로 설정한다.
위 단계를 통해 도커 이미지를 만들었다면 이제 실행하여 컨테이너화해주면 된다. 처음 도커 이미지를 빌드할 때, 수행 시간이 소요되는데 이는 Base image
를 다운로드하기 위한 것이다. 이미지를 만들고 난 후 이미지를 실행하면 컨테이너를 운영할 수 있다.
docker run --name <containerName> <imageName>:<tag>
# <containerName>을 주지 않으면 도커는 랜덤으로 이름을 배정한다.
도커이미지가 컨테이너가 되었는지를 확인한 뒤, 다음과 같은 명령어를 통해 실행, 중단할 수 있다.
docker start containerName
docker stop containerName
실행 중인 도커를 보는 명령어이다.
docker ps
실행 여부와 관계 없이 존재하는 모든 컨테이너를 보는 명령어이다.
docker ps -a