Git 만큼 사랑 받는 개발 툴이 된 Docker
https://survey.stackoverflow.co/2022/
[제 1 강] 컨테이너 기술에 대해서 알아보고, Docker의 기본 개념과 사용법에 대해 알아보자
Docker란 무엇일까?
가장 좋은 방법은 도커 공식 홈페이지를 훑어보는 것입니다.
홈페이지에는 이렇게 설명되어있습니다.
• open platform 이다.
• 어플리케이션을 인프라에서 분리해준다.
• 신속하다.
• 인프라를 어플리케이션을 관리하는 것 처럼 관리 할 수 있다.
• 코드를 배포에 용의하다.
더 자세히 살펴보자면
• 컨테이너 기반 가상화 기술 중 하나
• 애플리케이션을 컨테이너라는 단위로 격리하여 실행하고 배포하는 기술
정도로 설명할 수 있을 것 같습니다.
하나하나 살펴보겠습니다.
가상화(Virtualization) 기술이란 무엇일까요?
챗GPT에게 물어보니 잘 설명해주었습니다. 여기에 조금 더 덧붙여서 설명하면,
고성능 서버를 안정적이고 효율적으로 사용하는 방법은 가상화 기술을 활용하는 것인데요,
가상화 기술은 하나의 물리적 서버에서 여러 개의 가상 서버를 운영하도록 도와주는 기술로, 자원의 효율성과 관리의 편의성을 증가시킬 수 있습니다. 여기서 또한 주요한 가상화 기술 두가지에 대해 살펴볼 수 있는데요. 첫번째는 하이퍼바이저(Hypervisor) 기반 가상화와 컨테이너(Container) 기반 가상화입니다.
1. 하이퍼바이저(Hypervisor) 기반 가상화란? 하이퍼바이저는 물리적 서버 위에서 여러 개의 가상 머신(VM)을 운영하는 소프트웨어 계층입니다. 각 가상 머신은 독립적으로 운영체제와 애플리케이션을 실행할 수 있습니다.
대표적으로 VMware와 Microsoft Hyper-V가 있습니다.
2. 컨테이너(Container) 기반 가상화란? 컨테이너는 애플리케이션 및 해당 의존성을 격리된 환경에서 실행하는 기술입니다. 하나의 호스트 운영체제 위에서 여러 개의 컨테이너를 실행할 수 있으며, 빠른 배포와 확장이 가능한데요. 비교적 컨테이너는 가볍고 빠르며, 동일한 호스트에서 실행되는 경우 자원 공유로 인한 효율성을 제공합니다.
대표적으로 Docker와 Kubernetes가 있습니다.
쉽게말해 도커란 컨테이너 기술을 활용하여 애플리케이션을 격리된 환경에서 실행하고 배포하기 위한 플랫폼입니다.
도커를 비유적 표현으로 설명드리자면, 도커는 컨테이너로서의 애플리케이션을 배달하는 '배달 트럭'과 같다고 생각해볼 수 있습니다.
1. 배달트럭(도커 엔진) :
도커 엔진은 배달 트럭과 비슷합니다. 트럭은 다양한 물건을 한 번에 운반하고, 필요한 곳으로 배달합니다. 마찬가지로 도커 엔진은 여러 애플리케이션과 그에 필요한 모든 것들을 하나의 '컨테이너' 안에 포장하여 실행 및 배포합니다.
2. 컨테이너(도커 컨테이너) :
도커에서 컨테이너는 배달 트럭에 들어있는 화물과 비슷합니다. 각 컨테이너는 애플리케이션과 그 애플리케이션을 실행하는 데 필요한 모든 것들을 격리된 환경 안에 담고 있습니다. 이 컨테이너들은 서로 독립적이며, 하나의 컨테이너에 있는 애플리케이션이 다른 컨테이너의 애플리케이션에 영향을 미치지 않습니다.
3. 이미지(도커 이미지) :
도커 이미지는 배달할 화물을 포장한 상자와 같습니다. 이미지는 애플리케이션과 필요한 설정, 라이브러리, 실행 파일 등을 하나의 패키지로 만들어놓은 것입니다. 이 이미지를 기반으로 여러 개의 컨테이너를 생성하여 실행할 수 있습니다.
4. 도커 허브(Docker Hub) :
도커 허브는 이미지들을 저장하고 공유하는 공간입니다. 이 곳에서 다른 사람이 만든 이미지를 가져와 사용하거나, 자신이 만든 이미지를 업로드하여 공유할 수 있습니다.
결국, 도커는 애플리케이션을 격리된 환경에서 실행하고 배포하기 위한 효율적인 방법을 제공하는 도구입니다. 각 애플리케이션은 자신의 컨테이너 안에서 실행되며, 서로 간섭하지 않습니다. 이를 통해 애플리케이션을 더 쉽게 관리하고 배포할 수 있으며, 다양한 환경에서 일관된 실행을 보장할 수 있습니다.
이제 도커에 대해 조금 감이 잡히셨나요? 그럼 내부구조에 대해서 더 알아보겠습니다.
Docker Architecture
도커는 다양한 구성 요소로 이루어져 있는데, 이러한 구성 요소들이 함께 동작하여 컨테이너를 생성하고 실행합니다.
1. 도커 데몬(Docker Daemon) :
도커 데몬은 도커의 핵심 서버 프로세스로, 컨테이너 생성, 실행, 관리 등을 담당합니다. 사용자의 명령을 받아들이고 컨테이너의 라이프사이클을 관리합니다.
2. 도커 클라이언트(Docker Client) :
도커 클라이언트는 사용자가 도커를 커맨드 라인에서 사용할 수 있게 해주는 도구입니다. 사용자의 명령을 입력받아 도커 데몬과 통신하며, 컨테이너 관련 작업을 요청합니다.
3. 이미지(Docker Images) :
이미지는 컨테이너를 생성할 때 필요한 파일 시스템과 실행에 필요한 모든 설정, 라이브러리, 애플리케이션 코드 등을 패키징한 것입니다. 이미지는 읽기 전용이며, 컨테이너는 이미지를 기반으로 실행됩니다.
4. 컨테이너(Docker Containers) :
컨테이너는 이미지를 실행하는 격리된 프로세스입니다. 각 컨테이너는 자체적으로 파일 시스템, 네트워크, 프로세스 공간을 가지며, 호스트 시스템과 격리되어 있어 다른 컨테이너나 호스트 시스템에 영향을 미치지 않습니다.
5. 도커 레지스트리(Docker Registry) :
도커 이미지를 저장하고 공유하는 저장소입니다. 도커 허브(Docker Hub)가 가장 널리 사용되는 도커 레지스트리 중 하나입니다. 사용자는 이미지를 도커 레지스트리에 업로드하거나 다운로드하여 공유할 수 있습니다.
6. 네트워크(Docker Networking) :
도커는 컨테이너 간에 통신할 수 있는 네트워크 환경을 제공합니다. 컨테이너는 가상 네트워크에 연결되어 있어 서로 통신하거나 호스트와 통신할 수 있습니다.
7. 볼륨(Docker Volumes) :
볼륨은 컨테이너와 호스트 간의 데이터를 공유하기 위한 기능입니다. 파일 시스템의 일부를 컨테이너에 연결하여 데이터의 지속성과 공유성을 제공합니다.
이러한 구성 요소들이 함께 동작하여 도커는 애플리케이션을 빠르고 효율적으로 실행하고 관리하는 환경을 제공합니다. 이미지와 컨테이너를 중심으로 한 도커의 내부 구조를 이해하면 컨테이너화된 애플리케이션을 더 효율적으로 다룰 수 있습니다.
Docker 사용해보자!
Docker 설치하기 입니다. 도커 공식홈페이지 - Get Docker 에 들어가셔서 본인 OS에 맞게 설치해줍니다.
설치가 다 되셨다면, Docker Desktop을 실행시켜주시면 Docker에서 제공하는 GUI 환경이 나옵니다.
본격적으로 도커를 실행시켜보면,
docker ps : 컨테이너 리스트를 반환해주는 명령어 입니다. 현재 가동중인 컨테이너만 출력해줍니다.
도커 네트워크
우리가 웹서버를 사용하기 위해선 두대의 컴퓨터 웹서버와 웹브라우저가 필요합니다.
한대의 컴퓨터에는 웹브라우저가 설치되어 있고, 나머지 한대는 웹서버가 설치되어 있어야합니다.
자, 그 다음에는 웹페이지를 파일로 만들어서 저장장치의 특정 디렉토리에 위치 시켜야합니다.
지금부터는 데이터가 저장된 공간을 파일시스템이라고 부르겠습니다.
예를들어서, /usr/local/apache2/htdocs/ 라는 디렉토리에 index.html 파일을 위치시켰다고 해보겠습니다.
그리고 웹서버에게 "누가 웹페이지를 요청하면 이 디렉토리에서 찾아야해" 라고 설정을 해두겠습니다.
한편, 컴퓨터에는 6만 5천개의 포트가 있는데 그 중에서 80번 포트에게 접속을 대기하고 있도록 설정도 마찬가지로 해주겠습니다. 사실 우리가 지금 사용하려는 아파치 웹서버도 그렇게 설정되어 있습니다. 그리고 웹서버거 설치된 컴퓨터에 주소는 example.com이라고 부르겠습니다.
자 이제 접속을 시작해봅시다.
이제 http://example.com:80/index.html이란 주소를 주소창에 입력 후, 엔터를 치면, 웹브라우저는 example.com에 접속합니다. 이때 80번 포트로 접속하게 되는거죠. 그 다음엔 80번 포트에는 웹서버가 대기중이기 때문에 웹서버로 요청이 전달됩니다.
웹서버는 /usr/local/apache2/htdocs/ 에서 index.html 파일을 찾습니다. 그리고 index.html 파일을 읽어서 웹브라우저에게 index.html 코드를 전달하면 이 과정이 끝납니다.
도커를 이용해 웹서버를 사용하려고 하면 어떻게 해야할까요?
지금까지 설명한 컴퓨터 웹서버를 직접 설치했지만, 도커를 이용하면 웹서버가 컨테이너에 설치됩니다.(docker run httpd)
그러면 컨테이너가 설치된 운영체제를 호스트라고 부르겠습니다. 하나의 호스트에 여러개의 컨테이너가 만들어질 수 있는 거죠.
여기서 컨테이너, 호스트 모두 독립적인 실행환경이기때문에 각자 독립적인 포트와 파일 시스템을 갖고 있습니다.
그럼 이제 웹브라우저로 웹서버에 접속을 해보겠습니다. 과연 접속이 될까요? 알고계시겠지만 접속이 되지 않습니다.
호스트와 컨테이너는 현재 연결이 끊겨있기 때문이죠. 그럼 어떻게 하면 될까요?
호스트에 80번 포트와 컨테이너에 80번 포트를 연결(docker run -p 80:80)해주면 됩니다.
컨테이너를 실행하는 명령 docker run -p 80:80 httpd를 실행해준다면 호스트와 컨테이너에 포트가 연결됩니다.
앞에 80은 호스트의 포트이고 뒤의 80은 컨테이너의 포트입니다.
이렇게 설정을 해주면 호스트의 80번으로 들어온 신호가 컨테이너에 80번 포트로 전송되는 것입니다.
이렇게 연결된 포트로 신호를 전달하는것을 포트포워딩(Port Forwarding)이라고 합니다.
자 이렇게 해서 우리가 생성한 httpd라고 하는 애플리케이션의 드디어 실행할 수 있는 상태가 되신 겁니다. 축하합니다😆!
- 프리온보딩 백엔드 챌린지 8월(도커 뽀개기)
'BackEnd > BackEnd_Docker' 카테고리의 다른 글
[2주차] Docker Compose (0) | 2023.08.10 |
---|