[Docker] 도커란 무엇일까?

9 분 소요

서론

저는 현재 공부도 할겸 저번 학기에 단장으로 활동했던 봉사동아리의 웹사이트를 AWS에 올려서 만들어보고 있는데요, 그 와중에 도커의 존재에 대해서 알게되었습니다.
사실 지금 프로젝트 단계에서는 굳이 도커 없이도 배포 하는데 아무 문제가 없지만, 항상 새로운 기술을 알게 되고 그게 편리한 것이라면 굳이 나중에 공부하기보다는 바로바로 공부해보며 적용해가는 성격이기에 바로 적용해보려 합니다. 개념이 조금 이해하기 어려워서 애를 먹긴 했지만 막상 이해하고 나니 이게 왜 어려웠을까 싶기도 하는 마음에 제가 이해한 내용을 공유해보려합니다.

Docker란?

image1

도커(Docker)는 리눅스 응용프로그램들을 프로세스 격리 기술들을 사용해서 컨테이너로 실행하고 관리하는 오픈소스입니다.

도커 웹페이지는 다음과 같은 내용이 나와있는데요.

도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싼다. 여기에는 코드, 런타임, 시스템 도구, 시스템 라이브러리 등 서버에 설치되는 무엇이든 아우른다. 이는 실행 중인 환경에 관계 없이 언제나 동일하게 실행될 것을 보증한다.

맨 처음 이 내용을 읽은 사람들은 이게 무슨의미인지 이해가 잘 안될 것입니다. 저도 마찬가지로 그랬구요… 하지만 이해하고 나면 크게 어려운 개념은 아니니 함께 알아보도록 합시다.

만약 우리가 집에서 목공일을 한다고 가정해 봅시다.

목공을 하는데는 여러가지 장비들이 필요할 겁니다. 예를들어서 망치, 못, 그라인더등이 필요할거에요. 실제로는 몇십가지의 도구가 필요하겠지만, 여기서는 간단하게 3가지의 도구가 필요하다고 가정해보겠습니다.
image1

그럼 위와같이 작업실에는 3가지의 도구가 위치하게 됩니다. 우리는 지금 망치, 못, 그라인더가 있고 모두 통일해서 A사의 제품을 쓰고있다고 가정하고, 망치-못-그라인더 순으로 항상 놔둔다고 생각해볼게요.

우리는 이미 이 구조에 너무나도 익숙해져서,

  • 모든 제품이 A사의 제품일 것
  • 순서는 망치-못-그라인더 순으로 놓여져 있을 것

위 두가지 조건을 충족시켜야만 최고의 효율로 일을 할 수 있다고 해봅시다. 심지어는 만약 A사의 그라인더가 아니라면, 사용법을 몰라 며칠을 목공 작업을 진행하지 못할 수도 있습니다.

이렇게 익숙해진 상태에서 이제 만약 새로운 작업실을 하나 더 만드려면 어떻게 해야할까요? **이 구조를 동일하게 다음 작업실에도 구성해주어야 원활하게 이전 방식대로 일을 진행 할 수 있을겁니다. **

하지만, 만약 미리 작업실로 주문을 해놓았는데 주문 실수로 B사의 그라인더가 배송된다거나, 동일한 작업 환경을 재현하지 못해서 망치-못-그라인더 순으로 배치하지 못하고 못-그라인더-망치의 순으로 배치되었다면요??

물론 세가지 물건의 브랜드와 순서를 기억하여 배치하는건 어려운일이 아니지만, 100가지 장비가 있다고 하면 이걸 일일히 기억해서 모든 브랜드를 원래 익숙하던 브랜드로 맞추고, 모든 장비의 배치를 기억해서 동일하게 재현하는 것은 너무나 어려운 일일 것입니다.

하지만 만약 이를 사진으로 찍어서 보내기만 하면 동일한 물건을 모두 대신 구매해주고 배치도 똑같이 해주는 서비스가 존재한다고 가정해봅시다. 그러면 우리는 직접 물건의 브랜드를 알아봐서 일일히 주문하고 배치를 애써 기억하려 하지않아도, 이전 작업실을 카메라로 찍어서 업체에 보내기만 하면 새로운 작업실에서도 이전 작업실과 동일하게 최고의 효율로 일할 수 있게될 것입니다.

image1

그림은 제가 그린거라 조금 조잡합니다…

이것이 바로 ‘도커(Docker)’가 하는 일입니다.

도커는 우리의 작업환경을 카메라로 찍어 도커허브에 업로드하면, 우리는 새로운 컴퓨터나 서버에서 도커허브에서 업로드한 이미지를 내려 받는것 만으로 한치의 오차도 없는 동일한 작업환경을 구성 할 수가 있습니다. 이렇게 찍은 사진을 도커에서는 이미지라고 합니다.

뿐만 아니라, 하나의 작업환경에서 두가지의 아예 다른 작업을 할 수 있게도 해주는데요, 다음과 같이 이해해 봅시다.

우리는 이제 새로 작업실도 차렸으니, 새로운 목수를 채용하려고 합니다. 새로운 목수의 장비는 다음과 같다고 해보겠습니다.

image1

이 목수는 B사의 브랜드들을 애용하고, 도구의 배치도 그라인더-망치-못 순으로 사용합니다. 이 목수가 우리가 새로 꾸린 작업실에 이주해 온다고 가정해볼게요.

image1
그럼 이렇게 복잡한 환경이 완성 될 것입니다. 아무래도 혼자서 일하려다가 이렇게 일하려니까 자꾸 손도 부딪히고, 도구들도 헷갈려서 A브랜드 그라인더인줄 알았는데 B인 그라인더여서 잘못 물건이 만들어지는 경우도 있겠죠??

그래서 이를 방지하기 위해서 또 다시 그 업체에게 의뢰를 합니다. 이 업체는 사진만 있다면 그대로 작업도구들을 구매해서 배치해주는 것 뿐만아니라, 이미지를 두개 따로 보내면 칸막이까지 쳐서 독립된 두개의 공간을 만들어주는 서비스까지 제공하기 때문이죠.

그렇다면 의뢰 후 저희가 입주할 작업실은 어떤 모양일까요?

image1
아마도 이런 모습일 것입니다.

이렇게 하면 서로 동선도 부딪히지 않고 장비도 섞이지 않을 뿐더러, 만약에 다른집으로 한명만 이사를 간다거나, 아님 동일한 작업환경에 한명이 더 온다고 해도, 우리는 이미 각각의 작업실을 사진으로 갖고있기 때문에, 회사에 사진만 보내면 우리가 원하는 작업 환경을 무궁무진하고 정확하게 구현할 수 있을 것입니다. 심지어는 장비 하나씩을 각각 사진을 찍어서 A와 B브랜드를 섞어서 사용하는 작업자가 와도 이를 구성 해줄 수도 있겠죠.

따라서 도커는 위에서 언급한 동일한 작업환경 구성 뿐만 아니라, 작업환경을 나눌수도 있도록 해줍니다. 이것을 도커에서는 컨테이너라고 합니다.

그림이 조잡하긴 했지만, 어떻게 이해가 좀 되셨나요? 그럼 본격적으로 도커에 대해 알아 보겠습니다.

도커의 특징

혹시 m1 맥북에서 ‘페러렐즈’라는 앱을 이용해서 윈도우를 실행해보셨나요? 옛날 인텔 맥북의 경우, 부트캠프를 사용해서 파티션을 두개로 나누어 다른 파티션에는 윈도우를 깔 수 있었지만, m1맥북이 나오면서 arm 아키텍처 기반의 m1은 윈도우를 설치 할 수 없게 되었습니다. 아무래도 증권 프로그램이나 게임의 경우는 윈도우를 사용하는 것이 압도적으로 편리하니까요. 그래서 m1에서도 비슷한 기능으로, 부트캠프를 사용한 인텔맥을 사용하는 만큼의 성능을 내지 못하지만, 패러렐즈를 사용해서 윈도우를 돌릴 수 있습니다. 맥 os안에서 가상 머신을 구성하여, 또 하나의 컴퓨터를 맥 Os위에서 구동하여 윈도우를 사용하게 하는 것이지요.

위의 페러렐즈의 기능, 익숙하지 않으신가요? 바로 도커가 하는 두번째 기능과 같은 일을 하는 것을 알 수 있습니다. 작업 환경을 두개로 나누게 되어, 가상머신(윈도우)라는 작업 환경과 맥북(맥 OS)의 두가지 작업환경이 공존하는 환경이 만들어진 것입니다. 이렇게 하면 밖에서는 이것을 각각의 컴퓨터로 인식하게 됩니다.

그럼 이렇게 사용했을때는 어떠한 단점이 있을까요? 아무래도 맥 OS자체가 컴퓨터를 하나 돌리면서 그 안에서 또 다른 작업을 진행하려고 하니, 맥북의 성능을 윈도우가 어마어마하게 잡아먹게 될 것입니다. 윈도우도 사용할 수 있는 자원이 한정 되어 있으므로 아무래도 제 성능을 못내게 되어, 두 컴퓨터 모두 이도저도 아닌 상태가 될 것입니다.

하지만, 윈도우라는 OS 전체를 설치하는게 아니라, 윈도우 프로그램 하나가 돌아갈 만큼의 구성만큼만을 돌린다면, 훨씬 쾌적하게 사용할 수 있겠죠? 예를 들어 윈도우가 켜지고 실행된 윈도우에서 증권 프로그램을 켜는게 아니라 증권 프로그램이 돌아갈만큼의 구성만 사용해서 증권 프로그램만을 돌리게 된다면, 맥북도 메모리를 덜 윈도우에게 주고, 윈도우도 한정된 자원이지만 프로그램 하나만 돌리게 되는 셈이니, 한정된 자원마저도 차고 넘치게 될 것입니다.

이처럼 도커는 별도의 운영체제(Guest OS)없이 도커엔진(DockerEngine) 위에서 동작하기 때문에, 메모리 용량도 적게 차지하고, 성능적으로 매우 개선되도록 도와줍니다. 우리가 원하는 작업 환경을 내려받아 컨테이너로 구성하여 작동하게 되면, 내 컴퓨터 안에서는 새로운 컴퓨터가 돌아가게 되는 셈인거죠. 그것도 우리가 원하는 작업환경과 100% 일치하는 상태로요.

image1

왼쪽의 기존 가상 머신으로 돌리는 운영체제는 GuestOS라는 짐도들고 있지만, 도커를 사용한 오른쪽에서는 GuestOS 없이 환경과 프로그램이라는 짐만 들고 있는것을 볼 수 있습니다.

그럼 자꾸 이미지컨테이너니 어떤의미인지 알아야 도커에 대해서 완벽하게 알 수 있겠죠? 아마 이미지나 컨테이너가 정확히 뭘 가르키는 지는 몰라도, 위의 내용을 통해 기능을 이해했다면 아래 실습을 보기만 해도 도커가 무엇인지 이해할 수 있을겁니다.

그럼 이제 실제로 도커를 어떻게 사용하는지 알아보고, 저는 도커를 어떻게, 왜 사용했는지를 보며 도커에 대해 알아봅시다.

도커 사용법

저는 맥을 사용하고 있기에, 맥 환경에서 설명하도록 하겠습니다. 물론 윈도우에서도 크게 다르지 않아서, 사용하는 명령어나 방식은 동일합니다.

도커 다운로드 주소

위 주소로 가서 각자 OS에 맞는 도커 데스크탑 앱을 다운받아줍니다. 저의 경우는 m1 맥북을 사용하고 있으니, Apple Chip버젼을 다운 받아주면 되겠네요.

image1

물론 Brew로 도커를 받는 방법도 있지만, 아무래도 UI가 있는 도커 데스크탑이 터미널 환경보다 편리하니까 여기서는 도커 데스크탑 기준으로 설명하도록 하겠습니다.

다운 받은 도커 데스크탑을 열면, 다음과 같은 화면이 뜨게 됩니다.
image1

저는 현재 컨테이너를 하나 만들어서 구성해본 상태라 컨테이너가 하나 있지만, 처음 설치했다면 아무것도 없는 상태 일 것입니다.

자 그럼 컨테이너는 나중에 이야기하도록 하고 아까 설명에서 다뤘던, 이미지에 대해 설명해 볼게요. 이미지 탭으로 이동해봅시다.

image1
마찬가지로 새로 도커를 다운받았다면, 아무 이미지가 없는 상태일거겠죠? 저는 이미 제 작업환경을 사진을 찍어서 이미지로 보관해놨기 때문에 이미지가 있는 상태입니다.

image1
여기서 만약, 다음과 같이 해당 이미지에 있는 Run 버튼을 누르게 되면, 이미지를 보고 도커가 그대로 뚝딱 뚝딱 동일한 작업 환경을 만들어 이를 실행하는 컨테이너를 만들어 실행 시키게 되는 것이죠.

그러면 여러분의 컴퓨터 안에는 해당 작업환경으로 구성된 작업 환경만을 구동시킬 정도로 아주 간소화된 또 하나의 컴퓨터가 돌아가게 되는 것입니다.

도커 데스크탑에서는 컨테이너와 이미지를 관리하는 기능, 실행, 중지, 삭제 정도를 지원하고, 결국 터미널에서 어느정도 설정 해주어야 하는 부분이 있기 때문에 나머지는 터미널에서 진행 해보도록 할게요.

먼저 이미지를 다운받기 위해선 DockerHub에 가서 원하는 이미지를 찾아봐야 합니다. 여기에는 해당 환경의 개발사에서 배포한 공식 이미지를 내려받을 수 있고, 또 클라우드 기능을 지원하여 자신의 환경을 그대로 이미지로 저장해놓고 이를 내려 받을 수도 있습니다. 심지어는 다른사람이 올린 환경도 그대로 내려 받을 수 있죠.

그러면 한번 실제로 이미지를 내려받아보고 환경을 구성해볼까요?

도커 실습 1 - 파이썬 이미지 내려 받아보기

먼저, 공식이미지를 내려받아서 환경을 구성해보겠습니다. 여기서는 간단하게 파이썬 이미지를 내려받아서 파이썬 하나만 설치된 컨테이너를 구성함으로써 대략 이미지와 컨테이너가 어떻게 동작하는지 알아봅시다.

DockerHub에 파이썬을 검색해 줍니다.
image1

그러면 Official Image, 파이썬에서 만든 공식이미지가 나오는 것을 볼 수 있습니다.

이를 들어가보면 다음과 같은 화면이 나오는것을 볼 수 있죠.
image1

오른쪽에 보시면 다음과 같은 명령어가 있습니다.

1
docker pull python

이를 터미널에 입력해주면, 우리는 docker에 해당 이미지를 내려받게 되는것이죠.
pull이라는 명령어로 도커는 이미지를 내려받는다는 걸 알 수 있습니다.

그럼 터미널에 해당 명령을 입력해주어 봅시다.
image1

혹시 docker 명령어가 작동하지 않는다면, 환경변수 설정이 제대로 안된 것 이기 때문에 환경변수 설정에 대해 검색해보시고 docker를 환경변수 설정에 추가해주세요.

명령어를 입력하고 잠시 기다리면, Python 이미지가 내려 받아졌습니다. 만약 버젼을 설정하고 싶다면,

1
docker pull python 3.11-rc-bullseye

이런식으로 해당 버젼을 입력해주면 됩니다. 공백으로 두면 도커가 알아서 최신버젼을 다운 받습니다.

그럼 이제 다시 도커 데스크탑으로 가면 Python의 이미지가 다운되어 있는 것을 확인 할 수 있습니다.
image1

간단하게 이 이미지를 실행시켜볼까요? 터미널로 실행시키고 싶다면

1
docker run python

을 사용해주면 됩니다. 하지만 여기서는 데스크탑으로 실행시켜 볼게요.

그냥 파이썬 이미지를 Run 해주기만 하면 됩니다.
image1

그럼 아래와 같이 세부 설정을 해줄 수 있습니다.

image1

지금은 파이썬이 깔린 환경이 구동되는지만 확인할거니까, 간단하게 이름만 설정해주도록 할게요. 만약 이름도 설정 안하고 공백으로 컨테이너를 만들면, 랜덤으로 알아서 이름을 생성해주긴합니다. 그러나 관리를 편하게 하려면 이름을 지정하는게 편하겠죠??

간단하게 Python이라고 이름 붙인 후 컨테이너를 Run 해봅시다.

그러면 아래와 같이 컨테이너가 작동하는 것을 볼 수 있습니다.
image1

우리는 지금 파이썬만 설치되어 돌아가는 아주 간소화 된 컴퓨터를 현재 사용하는 컴퓨터 안에 하나 작동하도록 만들게 된것입니다.

그것도 파이썬을 인터넷에서 찾아서 설치한게 아닌, 전문가가 설치한 파이썬과 동일한 환경으로요!
image1

컨테이너를 클릭해서 들어가보면 위와 같은 화면을 볼 수 있습니다. linux라고 써있죠? 이를 통해 도커는 리눅스 환경에서 실행되고 있다는걸 알 수 있습니다. 도커가 어떤 방식으로 작동하는지에 대해서는 자세히 설명하지는 않도록 할게요.

그럼 여기서 우측 상단에 있는 >_ 모양 버튼을 눌러볼까요? 마우스를 올려보면, CLI라고 적혀있는 걸 볼 수 있습니다.

CLI는 Command Line Interface의 준말로, 말그대로 명령인터페이스 입니다. 이 안에 컴퓨터에서 무슨 작업을 하려면 이 컴퓨터에 접속해야겠죠? 만약 윈도우가 깔려있다면 GUI를 지원해주기 때문에 마우스로 아이콘을 클릭한다던가 파일을 옮기 던가 할 수 있겠지만, 이 컴퓨터는 최소한의 구동환경만 갖추었기 때문에 컴퓨터에게 명령을 커맨드 라인을 통해서 해주어야 하는 것입니다.

image1

다음과 같이 터미널이 하나 열리고 해당 컴퓨터와 연결되었습니다! 이제 여기서부터 내리는 명령은 현재 컴퓨터가 아닌, 도커위에서 돌아가는 작은 컴퓨터에게 보내는 명령입니다.

간단한 파이썬 명령어를 한번 입력해볼까요?

1
pip install numpy

그냥 바로 생각나는 파이썬의 대표기능인 pipnumpy 라이브러리를 다운받아 보겠습니다.
numpy는 파이썬의 라이브러리로, 기본 계산이 아닌 고성능 수치 계산을 위한 라이브러리 입니다. 지금은 그냥 도커가 올바르게 파이썬을 동작하는지 알아보는 것 이기 때문에 numpy가 뭔지에 대해서는 모르셔도 됩니다.

image1

python 명령어인 pip가 올바르게 동작하여 numpy를 설치완료하였습니다!

만약 python만 사용하는 컴퓨터가 한대가 더 필요하다면, 아까 내려받은 이미지로 컨테이너를 하나 더 만들어 아예 새로운 작업환경을 하나 더 만들 수 도 있고, 만약 아예 다른 환경이 필요하다면 또 **다른 이미지를 내려받아서 다른 환경을 또 만들어 줄 수 있을 것입니다. **

이렇게 하면, 컴퓨터 하나에서 서버를 두개 돌릴 수도 있겠죠? 물론 따로 포트포워딩이 필요하긴 하지만, 하나의 컴퓨터에서 두가지 서버가 돌아가게도 할 수 있습니다. **마찬가지로 AWS같은 클라우드 서비스에서도 **만약 서버 공간이 남는다면 도커로 분리하여 하나의 인스턴스로도 두개의 서버를 운용하는 것이 가능할 것입니다.

이것이 바로 도커를 선호하는 이유입니다. 하나의 인스턴스 비용으로 두개의 서버를 돌릴 수 있을 뿐만 아니라, 이 두 환경이 전혀 간섭되지 않도록 있으며, 심지어는 내 컴퓨터와 서버 컴퓨터의 환경을 완벽히 동일하게 설정해줌으로써, 환경이 달라서 발생하는 오류들을 방지 할 수 있으니까요.

그럼 대략적인 도커 사용법에 대해서 알아봤으니, 다음 게시물에서는 도커를 실제로는 어떻게 사용하는지 알아보기 위해서, 제가 만들고 있는 웹사이트 서버를 도커를 사용해서 이미지로 만들고 해당 이미지를 AWS에서 내려받아 제 컴퓨터 환경과 동일하게 작동하게 해보도록 하겠습니다.

다음게시물 : [Docker] 도커로 스프링부트 서버 AWS에 올리기

카테고리:

업데이트:

댓글남기기