Docker

eunsiver·2023년 3월 25일
0

우테코 테크톡

목록 보기
3/3

요즘 도커에 대한 얘기를 많이 들어 도커가 정확히 무엇인지 궁금해졌다. 또한 배포에 대해 관심있게 찾아보던 중 Jenkins와 Docker, Nginx가 많이 언급되어 있었다. 현재 플젝을 하고 있는데 이것들에 대해 공부를 해보고 배포까지 해봐야겠다!

요즘 우아한테크코스 테코톡을 즐겨 보고 있어 이 테코톡에서 설명해주는 내용 기반으로 글을 작성하였다.

도커란?

컨테이너 기반 가상화 도구

가상화란?

  • 서버의 성능을 나눠서 사용할 수 없을까?

  • 하나의 서버 자원을 나눠서 가지며, 성능을 분산 기키고, 분산된 서버들은 각기 다른 서비스를 수행할 수 있게 함.

  • 가상화를 통해 사용자가 많은 서비스에는 많은 자원을 할당해주고 적은 서비스에는 적은 자원을 할당.

서버 가상화?

  • 하나의 물리적 서버 호스트에서 여러 개의 운영 체제를 게스트로 실행할 수 있게 해주는 소프트웨어 아키텍처

하이퍼바이저

  • 서버 가상화 기술을 구현할 수 있게 하는 소프트웨어

  • 가상 머신이라는 단위로 구별

  • 생성된 여러개의 운영체제는 가상 머신이라는 단위로 구별

  • 각 가상머신에는 여러 운영체제가 설치

  • 하이퍼바이저에 의해 생성되고 관리되는 운영체제를 게스트 운영체제라 부름

  • 각 게스트 운영체제는 다른 게스트 운영체제와 완전히 독립된 공간과 시스템 자원을 할당 받아 사용

  • 대표적인 가상화 툴: VirtualBox, VMware 등

✅정리:
1. 하이퍼바이저는 OS들에게 자원을 나눠주며 조율
2. OS들의 커널을 번역해서 하드웨어에게 전달

서버 가상화의 단점

  • 가상화 작업은 하이퍼바이저를 반드시 거쳐야 해 일반 호스트에 비해 손실이 발생

  • 이미지 거대화: 가상 머신에는 게스트 운영체제를 사용하기 위한 라이브러리, 커널 등을 전부 포함하기 때문에 배포하기 위한 이미지로 만들었을 때 크기가 커진다.

  • 완벽한 운영체제를 만들기 위한 트레이드 오프: 가상머신은 완벽한 운영체제를 생성할 수 있다는 장점은 있지만, 성능이 느리고 용량상으로 부담이 있다.


이를 해결하기 위해 컨네이너가 나왔다.

🔶컨테이너 기반 가상화🔶

컨테이너는 가상화된 공간을 생성하기 위해 리눅스 자체 기능인 chroot, 네임스페이스, cgroup을 사용함으로써 프로세스 단위의 격리 환경을 만든다.

도커 엔진 위에 컨테이너가 할당되었다.

컨네이너 안에는 어플리케이션을 구동하는데 필요한 라이브러리 및 실행파일만 존재한다.
그렇게 때문에 이미지로 만들었을때 이미지의 용량 또한 가상 머신에 비해 대폭 줄어든다.

따라서 가상머신에 비해 빠르며, 가상화된 공간을 사용했을때 성능 손실도 거의 없다는 장점이 있다.

위 이미지에는 Docker Engine이라 표현 했지만 컨테이너를 다루는 기술은 Docker 말고 다른 벤더사도 많다.

컨테이너 기술은 도커만의 기술이 아니다.

'도커가 컨테이너 아닌가요?' 라는 질문에 어떻게 대답할 수 있을까?
A: 도커는 컨테이너 기술에 여러 기능을 추가한 오픈소스 프로젝트 입니다.

컨테이너의 정의

컨테이너의 사전적 의미에서는 어떤 물체를 격리하는 공간을 뜻한다. 즉, 각각의 컨테이너는 격리된 상태로 다른 컨테이너들과 분리된다.

컨테이너의 기술적 의미는 컨테이너에 담긴 것들의 라이프 사이클들을 관리한다.

Servelet Container, IoC Container, Bean Container...
xxx의 생성 -> 운영 -> 제거까지의 라이프 사이클 관리

가상화 관점에서 컨테이너란?

이미지(간단하게 컨테이너를 만들기 위한 틀이라고 생각하자) 목적에 따라 생성되는 프로세스 단위의 격리 환경
프로세스의 생명 주기를 관리한다.


SpringBoot 1개, Nginx 1개를 컨테이너에서 실행한다면 어떻게 될까?

이미지의 목적은 각각 SpringBoot애플리케이션, Nginx 애플리케이션이다.

컨테이너를 보면 Springboot 프로세스와 Nginx 프로세스가 각각 할당되며 격리되어 있다.
그림에서 확인할 수 있듯 컨테이너는 파일시스템과 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립된 공간을 가진다.

컨테이너가 실행되며, 프로세스가 실행되기에 필요한 자원들을 할당받고 프로세스를 실행하는데 이때 커널을 통해 필요한 자원들을 가져 온다.

프로세스는 OS 위에서 실행되는데 이를 Host OS라 표현한다.

컨테이너는 프로세스의 생명주기를 관리하며 실행하는 하나의 프로세스라고 말할 수 있다.
즉, SpringBoot 애플리케이션 프로세스를 직접 실행하나 컨테이너로 실행하나 호스트 입장에서는 똑같은 프로세스로 본다.


그렇다면 컨테이너를 왜 써야할까?

컨테이너는 프로세스를 격리된 환경에서 관리한다. 이때 격리된 환경은 Host OS와의 격리를 의미한다.

이를 통해 컨테이너에 어떠한 설정을 하든 Host OS에 영향을 끼치지 않아 독립된 개발 환경을 보장한다.

프로세스를 컨테이너 단위로 바라보며 프로세스의 관리, 확장에 용이해진다.


컨테이너를 어떻게 관리할 수 있을까?

사용자는 Docker Engine을 통해 컨테이너를 관리할 수 있다.

도커 엔진?

유저가 컨테이너를 쉽게 사용할 수 있게 하는 주체이다.

  1. 컨테이너 관리: 컨테이너의 라이프 사이클을 관리

  2. 이미지 관리: 컨테이너를 생성하기 위한 이미지 관리

  1. 볼륨 관리: 컨테이너의 데이터를 저장하기 위한 저장소 역할을 하는 볼륨관리

  2. 네트워크 관리: 컨테이너의 접속을 관리하기 위한 네트워크 관리


그렇다면 도커를 사용해야하는 이유는 무엇일까?

다음은 AWS에 나와있는 설명이다.

  1. Docker를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있으며 코드가 문제없이 실행될 것임을 확신할 수 있습니다.
  2. AWS에서 Docker를 실행하면 개발자와 관리자가 어떠한 규모에서든 매우 안정적이며 저렴한 방식으로 애플리케이션을 구축, 제공 및 실행할 수 있습니다.

Docker를 사용해야 하는 이유

Docker를 사용하면 코드를 더 빨리 전달하고, 애플리케이션 운영을 표준화하고, 코드를 원활하게 이동하고, 리소스 사용률을 높여 비용을 절감할 수 있습니다. Docker를 사용하면 어디서나 안정적으로 실행할 수 있는 단일 객체를 확보하게 됩니다. Docker의 간단한 구문을 사용해 완벽하게 제어할 수 있습니다. 폭넓게 도입되었다는 것은 Docker를 사용할 수 있는 도구 및 상용 애플리케이션의 에코시스템이 강력하다는 의미입니다.

Docker를 사용하는 경우

Docker 컨테이너를 최신 애플리케이션 및 플랫폼을 생성하는 핵심 빌딩 블록으로 사용할 수 있습니다. Docker에서는 손쉽게 분산 마이크로서비스 아키텍처를 구축 및 실행하고, 표준화된 지속적 통합 및 지속적 전달 파이프라인을 통해 코드를 배포하고, 고도로 확장 가능한 데이터 처리 시스템을 구축하고, 개발자를 위한 완전관리형 플랫폼을 생성할 수 있습니다. AWS와 Docker의 최근 협업으로 Docker Compose 아티팩트를 Amazon ECS 및 AWS Fargate에 보다 쉽게 배포할 수 있게 되었습니다.


영상을 보고 글을 읽어 봤지만 기본적인 개념만 잡혔을 뿐, 사실 실질적으로 감이 안 와 도커에 관한 실습을 한번 해봐야겠다고 생각을 했다. 도커 2편으로 다시 돌아오겠다. ㅠㅠ

참고
우테코 도커 이론편
초보를 위한 도커 안내서 - 도커란 무엇인가?
https://aws.amazon.com/ko/docker/

profile
Let's study!

0개의 댓글