docker

Docker와 Container

코드모헨 2024. 1. 2. 14:10
이번 글에서는 도커란 무엇인지 가볍게 햝고 가보자 한다.

 

 

1. 도커(docker)란 무엇인가?

도커는 컨터이너 기반의 가상화 플랫폼이다.

 

2. 그럼 container란 무엇인가?

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

 

위의 그림을 보면 인프라(서버 혹은 클라우드) 위에 OS시스템이(Linux) 올라가고 그 위에 도커가 컨테이너를 관리하는 플랫폼역활을 하게 되고 각 앱들은 컨테이너화 되어 있다.

 

각 앱별로 앱만의 공간의 독립성을 유지시키는 공간을 컨터이너(container)라고 부른다.

 

도커는 이 컨터이너들을 활성화(active) 하거나 비활성화(deacitve) 혹은 생성(build), 삭제(remove) 하는 것을 관리해 준다.

혹은 컨터이너에서 만들어진 자료를 외부에서 백업 할 수 있게 저장공간을 관리해준다.

 

즉 도커는 컨테이너를 관리하기 쉽게 해주는 플랫폼이라 생각하면된다!

 

 

3. 왜 도커를 사용하게 되었나?

얼핏보면 기존의 방법보다 복잡하고 불필요해 보인다.

기존의 방식

 

왜 도커를 사용하는지 이해를 높이기 위해 간략한 개발방식의 변화를 보고자 한다.


개발방법의 변화
가볍고, 충돌이 없고, 쉽게 바꿀수 있고, 전체 시스템엔 영향을 안주는...

 

 

문제의 시작 

우리가 만드는 앱은 다양한 라이브러리, 프레임워크, 프로그래밍 언어, 서드파티 프로그램으로 이루어져 있다.
이러한 것들이 전체 서버에 설치가 된다면, 앱마다 모두 같은 버전의 언어, 서드파티, 라이브러리, 프레임워크를 써야 할것이다.

 

이는 미친짓이다. 앱마다 업데이트 주기도 다를것이며 앱에 있는 필수기능이 다른 모듈과 맞지않거나 보안을 위해 옛버전을 써야 할수도 있기 때문이다.

 

"그럼 과거의 버전을 계속 유지" 하자 라는 결정을 하면 앞으로 만들 새로운 앱은?

 

더 좋은 기능과 코드작성 환경을 포기할 수 있는가?

 

이런 문제를 해결하고자 나온 방법이 가상환경이다.


 

가상환경

가상환경은 서버내의 독립적 환경을 만들어준다.

 

가상환경을 이용하면 서버전체에 영향을 주지않고 앱마다 특정 라이브러리, 프레임워크의 버전을 관리 할 수 있도록 해준다!

가상환경을 통해 우리는 독립적인 개발 환경을 만들었다.

 

하지만 배포를 해야한다면 어떨까. 혹은 공동으로 작업을 하게 된다면 어떨까?

 

venv
anaconda
pipenv

 

파이썬의 대표적인 가상환경 관리 툴들이다. 이런것들을 써본사람이라면 알겠지만

 

생각외로 다른 컴퓨터, 다른서버에 내가 만든 가상환경이 잘 이식되지 않는다.

 

특히 venv는 anaconda, pipenv같이 패키지매니저가 아닌 순수한 가상환경 툴이기에 각 라이브러리의 버전을 개발자가 일일이 체크해줘야 한다.

 

이로 인해 defendency 문제, 충돌이 자주 발생한다...

 

또한 가상환경은 같은 OS내에서만 가능하다는 것 또한 문제점이다.

 

Linux에서 만든 가상환경이 window에서 별탈없이 돌아갈 것이란 착각을 하지 말 것.

 


가상머신

 

여기 또다른 가상의 존재가 있다.

 

가상머신은 한 책상(컴퓨터, 서버 등등)위에 여러 책상(OS가 다른 일종의 작은 서버)을 올려 놓는다.

 

가상머신의 목적은 가상환경과 조금 다르다. 

가상머신의 일종의 에뮬레이터로도 쓰이며 이 방법의 대표주자가 JVM 자바 가상머신이다.

 

그럼 가상머신의 목적은 무엇일까?

간단하다. 새로 물리적(현실의) 컴퓨터를 사서 Linux, window, mac os를 돌릴 수 없으니 컴퓨터 내부를 쪼개 컴퓨터 내부에 가상의 컴퓨터를 만드는 것이다.

 

이 방법을 통해 우린 어느 서버에서든 우리가 만든 가상환경 기반의 앱을 실행 할 수 있다!

심지어 가상환경을 굳이 쓸 필요도 없다 완벽히 분할된 컴퓨터나 마찬가지인데 굳이 가상환경을?

그냥 다 root로 깔고 또 다른 가상환경이 필요하면 다시 또 가상머신을 만들면 된다!!

 

완벽하다.

 

단, os를 설치하기 위해 엄청난 양의 자원을 잡아먹고 컴퓨터의 본래 성능 다 깍아먹는 사소하고 앙증맞은 단점이 있으나

이런들 어떠하리 저런들 어떠하리

 

미친짓이다 절대 저렇게 하지말자, 가상머신의 목적은 가상환경과 명백히 다르다. 


도커의 시작

위에 나온 가상환경, 가상머신의 단점들 그리고 목적은 다르지만 독립된 환경, 일관된 환경 유지라는 공통점을 살리는 방법이 무엇일까?

도커 그리고 컨테이너

 

이제 저 둘의 장점을 살리고 단점을 최소화한 컨테이너 기술이 나온다.

 

컨터이너는 가상머신보다 훨씬 가볍다.

 

"가볍다" 라는것은 컴퓨터 즉, 서버의 자원을 크게 잡아먹지 않는다는 의미이다.

 

가상머신을 직접 설치해본 사람이라면 알것이다 가상머신이 얼마나 많은 자원을 먹어치우는지, 특히 mac에서 window를 써본 유저라면 뼈저리게 느낄 것이다.

 

도커 컨테이너는 host OS의 커널을 공유해서 사용한다.

 

즉 가상머신이 새로운 OS를 통째로 설치한다면, 도커 컨테이너는 공유할수 있는 부분은 host와 공유하고 필요한 일부분만 설치를 하는 것이다.

컨터이너는 자신이 필요한 라이브러리, 프레임워크 그리고 서드파티를 설치만 하면된다.

 

컨테이너는 도커 이미지 파일을 이용해서 만들어(build)지는데 이미지란 일종의 가상환경의 정보를 보관한 *.yml같은 파일이다.

 

 

image - 이미지 파일이란 컨테이너를 만들때(build) 사용되는 파일이다. 이미지 파일에는 가상환경 구성 파일(ex *.yml) 처럼 필요한 라이브러리, os, 프레임워크의 정보가 들어간다.
보통 배포할때 우린 이미지 파일을 만들어 배포한다.

 

 

 

 

 

'docker' 카테고리의 다른 글

Docker-linux-ubuntu 리눅스 우분투설치  (3) 2024.11.13