들어가며

지난 글에서는 도커의 아키텍처에 대해서 알아보았다. 이번에는 도커의 샘플 애플리케이션을 실행시키면서 도커의 이미지 생성 방식을 알아보도록 하겠다.

애플리케이션 준비

https://docs.docker.com/get-started/02_our_app/, 데모 어플리케이션

도커에 동작시키기 위한 데모 애플리케이션을 확보해보자. nodejs로 동작하는 간단한 데모 애플리케이션을 docker getting-started github 저장소에서 다운로드할 수 있다. 

클론 된 getting-started에는 파일과 디렉터리가 있지만 우리가 원하는 nodejs 데모 애플리케이션은 getting-started/app 디렉토리 안에 있다.

https://docs.docker.com/get-started/02_our_app/

여기서 터미널을 열어 node src/index.js를 실행시킨다면 맨 처음 우리가 실행시킬 데모 애플리케이션을 실행시킬 수 있다. 하지만 지금 할 건 도커 이미지를 만든 다음 내부에 애플리케이션을 시작시키는 것이기 때문에 조금 참아보자.

도커 이미지 빌드

도커 이미지를 만들기 위해서는 이미지 빌드 명령어의 집합체인 Dockerfile이 필요하다. Dockerfile을 새로 만들어보자. 주의할 것은 해당 파일은 확장자명이 없다. 어떤 코드 에디터는 자동으로 .txt를 붙이거나 하는데 이럴 경우 에러가 발생하기 때문에 주의하도록 하자.

 

app 디렉토리 내부에 Dockerfile을 만든 다음 아래의 코드를 삽입한다. 주석은 생략해도 된다.

FROM node:12-alpine
# FROM은 베이스로 사용할 docker image를 의미한다.
# 이 이미지 위에 새로운 명령어나 패키지를 덧씌워 커스텀 이미지를 만들 수 있다.
# 지금은 node application을 위해서 node:12-alpine이미지를 베이스로 한다.
WORKDIR /app
# WORKDIR은 기본적인 작업공간을 의미한다. 
COPY . .
# COPY는 이미지에 파일을 추가하는것 을 의미한다.
# COPY <복사할 파일 경로> <이미지에서 파일이 위치할 경로>
# . . 으로 실행하면 dockerfile이 위치하는 컨텍스트의 파일들이 WORKDIR로 복사된다.

RUN yarn install --production
# RUN은 이미지를 빌드할 때 사용할 명령어를 설정할 수 있다.
CMD ["node","src/index.js"]
# CMD는 이미지를 빌드할 때가 아닌 컨테이너가 실행될 때 사용할 명령어를 정의할 수 있다.

추가적인 Dockerfile 명령어가 알고 싶다면 https://docs.docker.com/engine/reference/builder/#shell를 참고하자

이제 기본적인 준비가 끝났다. docker build를 사용해서 이미지를 만들어보자

 docker build -t getting-started .

-t는 따라오는 인자를 이미지의 태그로 정하겠다는 뜻이며, 마지막. 은 현재 디렉터리의 Dockerfile을 참조해서 빌드하겠다는 뜻이다.

빌드를 할 경우 Dockerfile에 명시해 둔 명령들이 차례로 실행하는 것 을 볼 수 있다.

이후 docker images를 실행하여 만든 이미지가 추가된 모습을 볼 수 있다.

그럼 바로 이미지를 컨테이너로 띄어보자.

컨테이너 실행

docker run -dp 3000:3000 getting-started

위 명령어를 해석해보자.

run은 말 그대로 컨테이너를 실행시킨다는 의미이다.

option으로 d와 p가 있다. d는 detach의 약자이며 실행한 컨테이너를 백그라운드에서 사용하도록 한다는 의미이다. p는 port의 약자로 3000:3000인자를 읽어 컨테이너의 3000번 포트와 Host OS의 3000번 포트를 매핑 하 준다는 의미이다. 만약 이를 해주지 않으면 컨테이너 애플리케이션에 접근할 수 없다.

 

위 명령어를 실행한뒤 로컬 컴퓨터에서 http://localhost:3000으로 접속하게 된다면 데모 애플리케이션에 접속할 수 있다. 도커 대시보드를 통해 해당 컨테이너에 접근해서 현재 프로세스를 실행시키면 Dockerfile에 정한 명령어가 잘 실행된 것을 볼 수 있다.

Reference

1. docs.docker.com/get-started/02_our_app/
2. docs.docker.com/engine/reference/builder/#shell

'Docker' 카테고리의 다른 글

[Docker] - Docker Architecture(도커의 구조)  (0) 2021.02.14
[Docker] - Docker란 무엇인가?  (0) 2021.02.14

들어가며

지난 시간에는 도커와 컨테이너의 정의 그리고 가상 머신과 비교한 장점에 대해서 알아보았다. 이번에는 도커가 어떻게 컨테이너를 만들고 관리하는 아키텍처에 대해서 알아보도록 하겠다.

도커 아키텍쳐

도커는 기본적으로 clinet - server로 나누어져 있다. 클라이언트에서 docker 커맨드를 사용하면 도커 서버는 REST API형식으로 명령을 전달받아 수행하게 된다. 이 때문에 원격으로 도커 서버에 명령을 전달하거나 여러 개의 도커 서버에 접근 할 수 있으며 하나의 서버 또한 여러개의 클라이언트에서 명령을 받을 수 있다. 이다음은 내부 구조에 대해서 하나씩 알아보도록 하겠다.

https://docs.docker.com/get-started/overview/#docker-architecture

Docker daemon(dockerd)

도커 데몬은 클라이언트의 명령을 REST API로 받아 컨테이너, 이미지, 네트워크 그리고 볼륨을 관리한다. (여기서 볼륨은 컨테이너에서 생성된 데이터들을 의미한다)

Docker client

위에서 언급했든 dockerd에 명령을 전달하기 위한 수단이다. docker명령어를 사용하면 Docker API가 REST API형식으로 dockerd의 소켓에 전달된다.

Images

도커 컨테이너를 만들기 위한 읽기 전용 템플릿이다. 이미지는 직접 제작, Registry에서 다운로드 그리고 기존 이미지를 확장하여 사용할 수 있다. 이미지는 이미지를 만들기 위한 커맨드가 집합된 Dockerfile을 통해서 만들어질 수 있으며 이미지는 레이어 단위로 만들어지게 되는데 만약 Dockerfile에 어떤 부분을 수정했다면 해당 부분의 레이어만 교체하므로 Rebuilding이 가볍게 되어 있는 구조이다. 

Container

컨테이너는 이미지의 instance이며 독립적으로 프로세스를 실행할 수 있는 공간이다. 역으로 컨테이너의 상태를 이미지로 저장하여 사용할 수 있다. 참고로 독립성은 기존에 있던 LUX의 namespace를 이용하여 제공한다. 

 

마치며

기본적인 아키텍처에 대해서 알아보았다. 이후에는 실제로 커맨드를 통해서 도커를 실습하여 익혀보자

'Docker' 카테고리의 다른 글

[Docker] - 도커 이미지 빌드(Dockerfile)  (0) 2021.02.18
[Docker] - Docker란 무엇인가?  (0) 2021.02.14

들어가며

최근 해커톤을 진행하면서 도커 형식으로 주최 측에서 개발환경을 제공해주었다. 도커에 대해서는 어렴풋이 들어봤지만 실제로 개발에 활용하면서 탁월한 유용성을 체감했다. 좀 더 잘 활용하기 위해 세세한 기초부터 도커에 대해 알아보자.

 

 

도커의 정의

도커란 컨테이너를 기반으로하는 가상화 플랫폼이자 이를 운영하는 회사명이다. 가상화 플랫폼이라는 말은 기존의 Virtual Machine처럼 일종의 가상 머신을 만들어 운영하는 것을 의미한다. 그렇다면 컨테이너는 무엇일까?

 

컨테이너

컨테이너는 코드와 코드 실행에 필요한 종속성들을 패키지로 만든 소프트웨어 단위이다. 그래서 기존의 애플리케이션을 다른 환경으로 빠르게 옮겨 실행시킬 수 있다고 한다. 기존에는 어떤 애플리케이션을 작성하고 이를 다른 컴퓨터에 옮기려고 하면 기초 설정들을 다시 세팅해야 했다. 예를 들어 pytorch를 사용한 인공지능 모델 학습을 다른 서버로 이전해야 한다고 하자. 그러면 pytorch를 설치하는 건 기본이고 파이썬, conda 등 여러 가지를 다른 서버에 설치한 다음에 애플리케이션을 실행시킬 수 있다. 이러한 세팅을 프로비저닝(provisioning)이라고 한다. 

 

즉 컨테이너는 기기의 인프라에 관계없이 어플리케이션을 실행시킬 수 있도록 하여 프로비저닝을 해소할 수 있는 소프트웨어이다. 

 

컨테이너 vs 가상머신 

 

얼핏 들어보면 가상머신과 별다른 게 없다고 생각할 수 있다. 가상 머신 또한 OS를 포함해서 통째로 개발환경을 옮길 수 있기 때문이다. 도커 홈페이지에서는 이와 관련해서도 자세히 설명이 되어있다. 영어로 되어있으므로 간단하게 한글로 인용하겠다.

https://www.docker.com/resources/what-container

가상 머신

가상 머신은 하이퍼바이저를 통해서 물리적 하드웨어 단위로 추상화하여 하나의 서버에 여러 개의 서버를 실행시키는 것처럼 할 수 있다. 가상 머신은 OS부터 기초적인 바이너리 파일과 라이브러리까지 포함하므로 이는 몇십 기가바이트 정도로 많은 용량을 차지하며 초기 부팅이 느리다는 단점이 있다.

 

컨테이너

컨테이너는 코드와 이에 필요한 종속성들만 포함하여 애플리케이션 단위로 가상화를 하여 하나의 OS 커널을 공유한다. 각각의 컨테이너는 독립적인 유저 프로세스이며 몇십 메가바이트 정도의 매우 작은 용량이 필요하므로 공유하는데 용이하다. 그리고 가상 머신에 비해서 빠른 속도를 가지고 있다.

 

 

마치며

기본적인 도커의 정의에 대해서 알아보았다 다음에는 개발자로서 도커의 아키텍처에 대해서 알아보도록 하자

 

'Docker' 카테고리의 다른 글

[Docker] - 도커 이미지 빌드(Dockerfile)  (0) 2021.02.18
[Docker] - Docker Architecture(도커의 구조)  (0) 2021.02.14

+ Recent posts