애증의 도커...
배포한번 해보겠다고 덤벼들었다가 어제 거의 네시에 잠들었다.
왜 안될까를 반복하면서 하다가, 오늘 아침에 일정이 있어 어쩔 수 없이 누웠는데
너무 열이 받은 상태라 잠도 안왔다. 어찌어찌 잠을 잤는데 꿈에서도 도커라이징 중이었다.
꿈에서는 됐다. 꿈에서 됐으니까 이제 그걸 현실화해보자... :(
열받아서 작성하는 포스팅이다.
도커 마스터는 아니더라도 도커 일반인으로 승격해보자!
해당 포스팅은 유데미 Docker & Kubernetes : 실전가이드 강의를 바탕으로 작성되었습니다.
가장 중요한 질문이다.
도커(Docker)란 무엇인가?
도커는 컨테이너 기술로, 컨테이너를 생성하고 관리하기 위한 도구이다.
자. 그래서 이게 뭔데?
하시는 분들(=나) 를 위해 좀 더 자세하게 파고 들어가보겠다.
우선 위의 문장을 이해하기 위해서는 컨테이너가 어떤 것을 의미하는지 아는 것이 중요하다.
소프트웨어 개발에서 컨테이너란, 표준화된 소프트웨어 유닛이다.
코드 패키지 이며, 해당 코드를 실행하는데 필요한 종속성과 도구가 포함되어 있다.
이러한 컨테이너를 생성, 관리해주는 것이 도커인 것이다!
이렇게 이해하면, 참 심플하다.
사실 컨테이너 하면 많은 사람들이 아래 이미지를 떠올릴 것이다.
사실 강의에서는 이렇게 비유하는 것도 나쁜 것만은 아니라고 설명한다.
우리는 저 컨테이너안에 코드와 실행환경, 패키지 등등을 담을 수 있고, 각각의 컨테이너들은
서로 섞이지 않는다.
즉, standardalone 한 상태를 유지하며 우리는 이를 통해 소프트웨어 유닛, 코드가 포함된 패키지 및 코드를 실행하는 종속성을 보관할 수 있고 도커가 실행되는 모든 곳에서 이를 가져올 수 있다.
만약 이렇게 된다면, 동일한 환경에서 동일한 애플리케이션을 실행할 수 있게 되는 것이다.
모든 것이 컨테이너 안에 위치하기 때문에, 내가 현재 실행하는 위치와 상관이 없어진다.
따라서 실행하려는 위치에 추가 도구를 설치하려 할때, 걱정할 필요가 없어지는 것이다.
컨테이너, 써도 그만 안써도 그만?
자, 여기까지는 잘 알겠다.
컨테이너를 사용하면 뭐 독립적이고 표준화된 애플리케이션 패키지를 사용하는 것이나 마찬가지인 것이다.
근데 이게 진짜 중요한것인가? 에 대한 질문이 남는다.
도커의 주요 사용 사례를 들어 이 의문을 해소해보자.
# Case 1.
A 개발자는 NodeJS 버전 14.3을 이용해서 애플리케이션을 만들었다.
A 개발자는 이 애플리케이션에서 성공적으로 수행되는 코드를 몇가지 만들었고, 그 코드는 await 기능이 들어있다.
그렇지만 await 는 이전 버전의 NodeJS에서 돌아가지 않는다.
A 개발자는 이 점을 간과한 상태에서 배포를 했는데, A개발자의 로컬 환경, 개발환경, 로컬 머신에서만
버전 14.3이 설치되어 있었다면?
이 애플리케이션을 호스트 서버에 배포하여 전 세계 사람들이 사용할 수 있도록 했는데,
해당 서버에는 이전 버전의 NodeJS가 존재하여 애플리케이션이 동작하지 않는다는 끔찍한 상황을 쉽게 예상할 수 있다.
그리고 이 A 개발자는 '이게 왜 안돼' 루프에 빠지게 되는 것이다. 로컬에서는 잘 돌아가니까!
여기서 우리는 동일한 환경의 가치를 느낄 수 있다.
내 개발환경과 배포환경이 동일하다면, 위 예시와 같은 시간낭비는 없을 것이다.
이것이 바로 도커와 컨테이너가 개발자들에게 주는 이점이다.
# Case 2.
다른 예시를 들어보겠다.
A 개발자는 아주 큰 회사에 입사하여 개발중이다.
여러 사람들이 하나의 애플리케이션을 개발 중인데, 시스템 환경이 동일하지않아
A 개발자는 await가 돌아가는 환경, 다른 개발자는 돌아가지않는 환경이 되었다.
코드 공유할때도 상당히 불편하고, 또 문제 해결에 힘을 쏟아야한다.
이럴 경우에도 동일한 환경이 큰 이점이 된다.
# Case 3.
혼자 개발할때도 동일한 환경은 중요하다.
A 개발자는 파이썬 프로젝트를 작성을 하는데, 여러가지의 프로젝트를 동시에 진행한다.
a프로젝트는 파이썬 2.x 버전을, b프로젝트는 파이썬 3.x 버전을 사용한다.
각각의 프로젝트 환경은 완전히 분리되어있고 독립적이어야한다.
이럴 경우에도 컨테이너는 도움이 되는 것이다.
호스트 컴퓨터가 아닌, 컨테이너에 모든 것이 있기 때문에 가능한 일이다.
이러한 문제는 가상머신으로도 해결할 수 있는거 아닌가?
나는 보안공부를 할때, Virtual Box와 VMWare 가 항상 켜져있었다.
서버를 돌릴때, 혹은 시스템해킹 공부를 할때는 리눅스 환경이 기본이었고, 내 호스트 OS 는 Windows 였기 때문에
리눅스가 설치되어 있는 가상머신을 거의 항상 돌렸다.
그렇지만 불행하게도 내 노트북은 사무용 노트북으로, 성능이 그닥 좋지 못해
마우스 포인터가 실제 내 움직임을 따라가지 못했다.
그때의 내 노트북 상황을 그림으로 나타내자면 아래와 같다.
정말,, 노트북이 고생했던 것 같다.
Kali 는 해킹툴이 기본적으로 많이 있었기 때문에 주로 공격하는 머신으로,
CentOS 나 Ubuntu 같은 경우 타겟이 되는 사용자 머신으로 사용했었다.
해당 머신은 하나로 묶어져 있기 때문에 친구들과 공유하고, 배포가 가능했다.
당연히 공유된 머신은 동일한 환경이 구축되어 있고, 따라서 컨테이너를 사용했을때의 이점과 같은 이점을 가지게 된다.
그렇지만, 가상머신을 이용한 방법은 몇가지 문제들이 있다.
가장 큰 것은 Host OS 위에 얹어진 가상 OS 에서 발생하는 오버헤드다.
가상머신 한대는 하나의 컴퓨터와 같다. 모든 컴퓨팅 환경을 전부 마련해야한다.
위 그림같은 경우 하나의 컴퓨터 안에서 컴퓨터 세대가 돌아가는 꼴이다.
이는 메모리와 CPU, Disk 공간을 낭비하게 되는 큰 요인이 된다.
그렇기 때문에 동시에 돌아가는 가상머신이 많아지면 많아질수록 문제가 커질 것이다.
가상머신의 장단점을 요약해보자면 아래와 같다.
장점 | 단점 |
분리된 환경 생성 가능 | 중복 복제(낭비되는 공간) 발생 |
환경별 구성 가질 수 있음 | 호스트 시스템 위에 추가 시스템 실행으로 성능이 나쁨 |
안정적으로 공유, 재생산 가능 | 설치되는 가상머신 설정도 동일해야함 |
도커는 가상머신과 다른 구조를 가지고 있다!
도커는 가상머신과는 다르게 하나의 머신에 몇대를 설치하지않는다.
대신 운영체제가 기본적으로 포함하거나 컨테이너 에뮬레이트를 지원하는 내장 컨테이너를 활용한다.
이러한 내장 컨테이너, 컨테이너 에뮬레이트가 동작하도록 처리하는 것이 도커이다.
내장 컨테이너 위에 도커 엔진을 실행하고,
이 도커 엔진 위에서 컨테이너를 가동시키는 것이다.
그림으로만 봤을때는 가상머신과 도커 시스템이 큰 차이가 없어보이지만,
가상 OS로 인해 발생했던 중복된 OS 부분과 계속해서 재설치되어야했던 많은 도구들에서 차이가 많이 벌어진다.
가상머신과는 다른 컨테이너의 장점 중 또 하나는 설정파일이 존재한다는 것이다.
우리는 config 파일을 사용해서 컨테이너를 구성하게 되는데, 이 설정 파일이 컨테이너를 설명할 수 있다.
이 파일을 공유하여 다른 사람들이 컨테이너를 다시 만들 수도 있고,
컨테이너를 이미지라 불리는 것에 새로 빌드할 수도 있게된다.
이 이미지를 공유하여 모든 사람이 자신의 시스템에서 내 시스템에 있는 컨테이너와 동일한
컨테이너를 돌릴 수 있도록 할수도 있다.
해당 포스팅을 작성하면서, 애매하게 알고있던 컨테이너와 도커의 개념을 정확하게 잡은 것 같다.
다음 포스팅에서 다룰 도커가 기대된다!
'Archive > Develop' 카테고리의 다른 글
파이썬 의존성 관리 Poetry 란 무엇인가 (0) | 2022.06.08 |
---|---|
[ Django ] Django App 이름 변경 하는 방법 (+ 수동 설정) / MYSQL ver. (0) | 2022.05.25 |
[Diagram] 시퀀스 다이어그램(Sequence Diagram) (0) | 2022.05.16 |
[ Django ] SerializerMethodField (0) | 2022.04.18 |
[ Django ] Serializer / Form (0) | 2022.04.04 |