[Docker] 이미지와 컨테이너

jonghyuck’s velog·2023년 1월 22일
0
  1. 도커 이미지
  2. 도커 컨테이너
  3. 도커가 왜 필요하죠?

1. 도커 이미지

지난 시간에 도커가 세상에 나온 배경에 대해 알아보았다. 하지만 도커 이미지에 대한 설명은 하지 않았는데 도대체 이미지란 무엇인가?

나역시 여러개의 글을 참고하고 따라해봤지만 결국 나를 납득지키진 못했던것 같다.

따라서 나역시 다른 글들을 참고하기보단 내가 이해한 세상의 도커 이미지 개념을 정리해 보려고 한다.

Image 라는 단어에 집중해보자.

이미지라는 말은 특정 순간의 모습을 담은 사진을 의미한다. 도커에서 image라는 말을 사용하는 것이 우연일까? 당연히 그렇지 않다.

우리가 처음 컴퓨터에 운영체제를 설치한 직후, 우리는 모든 프로그램을 설치할 수 있는 상태가 된다. 만약 어떤 카메라로 이 직후 상태를 찍어서 저장할 수 있다면? 그리고 우리가 그 사진을 통해 언제든 그 상태로 돌아갈 수 있다면? 현실에선 불가능하지만 프로그램의 세계에서는 가능하다.

그럼 이 이미지만 있다면 구동에 필요한 파일들을 누구나 쉽게 구축하고 누구나 쉽게 컨테이너를 만들 수 있는 것이다.

Container를 다시 복습해보자.

컨테이너는 어떤 OS 또는 프로그램이 실행되는데 필수적인 요소들을 묶어서 chroot 디렉토리 안에 저장시켜놓은 상태라고 표현했었다.

어? 그런데 이미지 안에는 구동에 필요한 모든 파일들의 상태가 어떤 형식으로 저장되어 있다.

그렇다면 이미지를 통해 컨테이너를 만들면 어쩌면 간단한 명령어 하나만 이용하면 언제든 편하게 컨테이너를 만들수도 있지 않을까?

이부분이 내가 생각하는 도커의 핵심이다.

2. 도커 컨테이너

도커는 이처럼 원하는 상태를 이미지로 찍어두고 다시 이미지를 활용하여 쉽게 컨테이너를 생성하는데 아주 편리한 명령어들을 제공하는 서비스이다.

도커의 컨테이너는 아주 간단하다.

  1. 이미지를 가져온다.
    이미지들은 직접 찍을수도, 누군가 찍은 사진을 dockerhub에서 가져올 수도 있다.
  2. 이미지를 통해 컨테이너를 생성한다.
    docker run 과 같은 명령어를 통해 손쉽게 만들 수 있다.

크게 이 두가지 과정을 통해 이루어진다.

chroot와 내가 돌리려고 하는 시스템에 대한 이해가 없이도 저 두가지 개념만 알고 있으면 누구나 손쉽게 컨테이너를 만들 수 있게 되는 것이다.

3. 도커가 왜 필요하죠?

도커가 컨테이너를 쉽게 만들도록 도와준다는 것은 이해가 된다. 근데 그래서 도커를 왜써야하고 컨테이너는 왜 써야할까? 난 도커 없이도 잘 살고있는데??

정답은 [시간]

내가 내린 답은 시간이었다.

나역시 도커를 공부하며 도커의 사용 이유에 대한 명확한 답을 찾지 못하였었고 실제로 도커없이도 서버를 돌리고 여러 환경을 구축하는데 아무런 문제 없이 잘 살고 있었다.

하지만 서비스의 규모가 커지고 서버가 분리되고 분리된 서버가 동일한 환경을 갖춰야하기 때문에 ubuntu 설정, 환경 설정과 같은 동일한 작업들의 반복이 계속되자 해결법을 찾게 되었고 자연스럽게 도커의 필요성에 대한 의문을 해결할 수 있었다.

  1. aws에서 ec2 서버를 만든다.
  2. 네트워크와 포트 설정을 해준다.
  3. ec2 서버안에 필요한 환경 설정을 해준다.
  4. 이 작업을 서버의 수만큼 해준다.
  5. 때에 따라서 필요없는 서버는 삭제하고 필요한 서버를 만들어 동일한 작업을 반복한다.

서버가 한개, 두개였을때는 별것 아니던 일들이 5개 10개가 되면 하루종일 해당 작업만 하게 되는 모순적인 일들이 일어났다.

또한 문제는 더 있었다.
ec2가 하나라면? 즉, 하나의 PC안에서 여러가지 다른 환경설정을 사용해야 한다면?
A,B,C라는 Spring환경이 있다고 가정해보자.

A,B,C는 각각 독립된 서버환경이다. 따라서 다른 secrets key를 가지고 있으며 이는 코드가 아닌 환경 변수에 저장되어 있어야 한다.

ec2와 같이 클라우드 pc를 이용하여 편리하게 물리적인 서버를 여러개 만들 수 있다면 다행이지만 그럴 수 없는 환경이라면?

결국 해결법은 컨테이너로 독립적인 환경을 만들어 주어야 하며 이 경우에도 도커를 쓰게되면 모두 해결 된다.


오늘은 이렇게 도커의 이미지, 컨테이너, 필요성에 대한 내용을 다루었다. 그렇다면 어떻게 이런 일들을 편하게 해준다는 걸까?

이에 대한 정리는 다음 글에서 다루고자 한다.

profile
백엔드 개발자 Jayden입니다!

0개의 댓글