CS + 인프라/Docker

[Docker] 기초 : 컨테이너란? + Docker란?

공대키메라 2025. 4. 16. 00:47

 

요즘 어딜가나 두들겨 맞는 우리의 키메라! 

 

이제 좀 더 내가 공부한 것을 자세히, 꿀리지 않게(?) 정리해서 외우고 써먹으려고한다.

 

대충 명령어 쳐서 하는건 다 할 수 있다고 생각한다.

 

이러면 공부를 했는데 설명하라면 말을 못하니 결국 거짓말을 치게 된 것이다.

 

ㅠㅠ...

 

이제 눈으로 흘깃 대충 보지말고 좀... 제대로 정리하자...

 


 

1. 컨테이너란? (+ 탄생 배경)

 

물건을 담아서 상하차 할 때 쓰이는 그 컨테이너? 컨테이너가 뭐지?

 

 

과거 어플리케이션들은 한 컴퓨터에서 운영이 되었는데 보통 한 대의 컴퓨터를 하나의 용도로만 사용했다.

 

이러면 문제가 있는데, 남는 서버 공간을 그대로 방치하게 되는 것이다. 

 

 

이것이 아깝다고 같이 사용을 한다면 어떻게 될까?

 

한 서비스에서 문제가 생기면 다른 서비스에도 문제를 끼치는 말도안되는 현상이 발생한다.

 

그 이유는 OS를 공유하고 있기 때문이다.

 

 

그래서 처음에는 OS를 독립적으로 사용할 수 있는 가상화 플랫폼이 등장한다.

 

이를 하이퍼바이저(Hypervisor)라는 소프트웨어 기술을 가지고 가상화된 컴퓨터 위에 독립적으로 어플리케이션들을 운영하기 시작한다.

 

이것은 호스트 시스템에서 다수의 게스트 OS를 구동할 수 있게 하며 하드웨어를 가상화하면서 하드웨어와 각각의 VM을 모니터링 하는 중간관리자의 역할을 한다.

 

이제 논리적으로 공간을 분할하여 VM이라는 독립적인 가상 환경의 서버 이용이 가능해진 것이다!

 

 

 

하이퍼바이저에 의해 구동되는 VM은 각각 VM마다 독립된 가상 하드웨어 자원을 할당받는데 논리적으로 분리되어 있기 때문에 한 VM에 오류가 발생해도 다른 VM에 퍼지지 않는다.

 

하지만 또 다른 문제가 하나 더 있는데,

 

각 서비스의 독립성은 유지되지만 VM을 띄우고 자원을 할당한 다음 OS위에 또 다른 OS가 설치되는 구조,

즉 HostOS 위에 Guest OS를 부팅하는 구조라 무겁고 복잡하다.

 

* Host OS? Guest OS? 이게뭐야?

OS는 말 그대로 운영 체제(Operating System)이다.

호스트(Host) 의 뜻은 주인, 게스트(Guest) 는 손님인데,

보통 하나의 PC엔 하나의 OS가 있는데, 필자는 Window OS를 사용중이다.

그런데 한 컴퓨터에 두 개 이상의 운영체제가 필요할 경우 기존의 운영체제에 별도의 OS를 추가적으로 설치하게 된다. 

즉, Host OS에 Guest OS를 설치하게 된다.

 

이러한 시대의 흐름을 반영해서 Container 플랫폼이 등장한다.

 

Container는 최소한의 필요한 환경 요소만으로 묶어서 서비스를 제공하기 때문에 독립성도 유지시켜주고 작은 용량으로도 운영이 가능하다.

 

컨테이너는 커널을 공유하는데, 이미 실행 중인 호스트 OS의 커널을 같이 쓰는것을 말한다.

 

다만 이것을 linux의 namespace와 cgroups같은 기능을 사용해서 격리된 환경을 제공한다.

 

겉으로는 정말 다른 환경같지만, 알고보면 공유된 커널 위에서 돌아가는 것이다.

 

* 커널?
커널이란 모든 프로그램이 사용하는 시스템 자원을 직접 제어하는 핵심 시스템이다.

 

이 컨테이너 플랫폼중 하나가 Docker이다.

 

 

결국, 컨테이너란 코드와 모든 종속성을 패키지화하여 응용 프로그램이 한 컴퓨팅 환경에서 다른 컴퓨팅 환경으로 빠르고 안정적으로 실행되도록 하는 소프트웨어의 표준 단위라고 한다.

 

말이 좀 너무 딱딱하긴 하다.

 

생각해보면 화물선 컨테이너 처럼 무언가를 패키지화해서 이동이 용이하다는 점에서 착안한 것 같다.

 

2. 그래서 Docker가 뭔데?

공식 사이트에서 도커가 뭔지 찾아보았다.

 

번역하면...

Docker는 애플리케이션을 개발하고, 배포하고, 실행할 수 있도록 해주는 오픈 플랫폼입니다.
Docker를 사용하면 애플리케이션과 인프라를 분리 해서 더 빠르게 소프트웨어를 전달할 수 있습니다.
Docker를 활용하면 애플리케이션을 관리하듯 인프라도 동일한 방식으로 관리할 수 있습니다.
또한 Docker가 제공하는 **배포, 테스트, 코드 실행 방식(methodology)**을 활용하면,
코드를 작성하고 실제 운영 환경에서 실행하는 데 걸리는 시간을 크게 줄일 수 있습니다.

 

Docker는 컨테이너를 사용해 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼이다.\

 

여기서 앱과 인프라를 분리한다는 말은 어디서 많이 들어본 것 같은데...

 

우리는 컨테이너라는 것이 어떻게 출현했는지 알아보면서 컨테이너가 어떤 구조이며 장점을 가지는지 위에서 살펴보았다.

 

즉, docker는 컨테이너생성을 도와주며 운영환경(인프라) 와 개발환경(앱)을 완전히 독립시킬수 있다.

 

application 을 한 번만 docker image로 빌드하면 다양한 클라우드 환경에서도 일관되게 적용 가능하다.

 

3. Docker Image와 Container 생성 과정

그러면 도대체 Docker에서 Container는 어떤 과정을 거쳐서 만들어지는지 알아보자.

 

이를 알기 위해서는 Image 에 대해 먼저 알아야 한다.

 

* 이미지(image)?

Docker image는 파일로 어플리케이션 실행에 필요한 독립적인 환경을 포함하며, 런타임 환경을 위한 일종의 템플릿이다.

 

아주 간단하게 말하면 컨테이너를 생성하기 위한 템플릿 역할을 하는것이 image이다.

 

이미지는 응용 프로그램을 실행하는데 필요한 모든 것을 포함하고 있다. 

 

다시 말해, 특정 프로세스를 실행하기 위한 모든 파일과 설정값을 지닌 것으로, 더 이상의 의존성 파일을 컴파일하거나 설치할 필요 없는 상태의 파일을 말한다.

 

 

그래서 필요한 게 뭔데? 그건 바로... 시작 시 실행될 명령어와 파일 스냅샷이다.

 

우선 이미지에 시작시 실행될 명령어 를 세팅한다.

 

그리고 파일 스냅샷으로 실행할 파일도 넣어둔다.

 

파일을 우리가 container를 시작할 때 할당받은 하드디스크로 복사한다.

 

그다음 컨테이너에서는 이미지에 세팅한 명령어를 가지고 파일을 실행한다.

 

*레이어(Layer)?

여기서 레이어가 있는데 이것은 이미지의 구성 요소중 하나로 

 

각 레이어는 이미지의 변경 사항을 포함하며, 이는 새로운 파일을 추가하거나 기존 파일을 수정하거나 삭제하는 것을 의미한다.

 

Docker는 이러한 레이어들을 효율적으로 관리하여 이미지 빌드 속도를 향상시키고, 저장 공간을 절약한다.

 

레이어에는 세 가지 특성이 있는데, 불변성, 캐싱 그리고 공유성이다.

 


 

이렇게 간단하게 cotainer가 나오게 된 배경과 Docker에 대해 알게 되었다.

 

다음 시간에는 Docker에 대해 더 공부할 예정이다.

 

인프런 : 따라하며 배우는 도커와 CI환경

https://www.youtube.com/watch?v=bFxCKPIgvxk

https://www.youtube.com/watch?v=IiNI6XAYtrs

https://blog.naver.com/chjinho2030/222323437160

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

[Docker] 도커의 레이어(Layer) 란?