컨테이너와 도커

HOJIN JUNG·2023년 4월 3일
0

Docker

목록 보기
1/1
post-thumbnail

본 포스팅은 Introduction to Docker 를 번역한 내용입니다. 이해를 쉽게 하기 위해 의역하였고 생각을 덧붙였습니다. Happy Docker! ☺️

🚪 들어가기에 앞서

도커를 다운로드 받아 백과 프론트 환경을 컨테이너로 만들어보았지만, 컨테이너가 무엇인지에 대한 이해는 부족했다. 무언가를 제대로 이해하기 위해서는 그 무언가가 어떤 의미와 맥락을 가지는지 이해하는 것이 먼저라고 생각했다. 그래서 차근차근 컨테이너와 도커가 무엇인지, 왜 필요한 것인지와 관련해 파헤쳐 보고자 한다.



✓ 컨테이너란 무엇인가?

컨테이너는 프로젝트를 실행하기 위한 모든 요소가 들어있는 박스이다. 다음과 같은 요소가 표함될 수 있다.

  • 실행 환경
  • 데이터베이스 설정
  • 프로젝트 운영을 위한 환경설정 파일
  • 프로젝트 의존성(라이브러리)
  • 프로젝트 소스 코드


✓ 도커 이미지와 도커 파일 구분하기

도커는 컨테이너를 관리하기 위한 소프트웨어이다. 도커파일을 정의하기 위해서는 일단 도커 이미지가 무엇인지를 알아야한다.

🖼️ 도커 이미지

도커이미지는 컨테이너의 구조를 정의한다. 도커이미지를 하나의 평면도라고 생각해본다면 평면도로 많은 집을 똑같이 만들 수 있듯, 하나의 도커 이미지로 많은 컨테이너를 만들 수 있는 것이다. 그리고 그러한 도커 이미지를 쉽게 만들기 위한 가장 유명한 방법은 도커 파일이다.


📃 도커파일

어떻게 도커이미지를 만들 것인가에 대한 명령어(지시사항)를 가지고 있는 텍스트 파일이다. 도커 이미지를 만들기 위해서 도커는 도커파일에 쓰인 명령어를 실행한다.

FROM openjdk: 11
ADD target/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

위와 같은 도커파일이 있다고 가정할 때, 명령어 하나하나를 파헤쳐 보도록 하자.



1단계) 도커 파일 만들기

FROM openjdk: 11

도커 파일을 실행하기 위해서는 이미 존재하고 있던 이미지 Base image가 필요하다. 이러한 Base image에는 자바, 우분투가 있다. 그래서 어떤 환경 위에 이 도커이미지를 실행시킬 것인가에 대한 정의가 도커파일의 맨 윗단에 위치해야 한다. 가령 위 도커파일에서는 FROM openjdk:11Base 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이다. 어떤 애플리케이션을 실행시키기 위한 두 가지 명령이 있다. ENTRYPOINTCMD이다.



2단계) 앱을 컨테이너화 하기

위 단계에서 도커 파일이 무엇인지를 정의하였다. 정의한 도커 파일을 빌드(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
profile
근거를 가지고 앞으로 나아가는 엔지니어

0개의 댓글