Docker.. 난 네가 궁금해 (1) -이론편 -

·2024년 1월 8일
22

도커

목록 보기
1/2

도커를 알고 싶어서 작성한 글입니다.

Docker란 ?

도커란 리눅스 컨테이너 기반으로 하는 오픈소스 가상화 플랫폼이다. 다시 말해 특정한 서비스를 패키징하고 배포하는데 유용한 오픈소스 프로그램이다. 도커를 본격적으로 설명하기 전, 먼저 가상화에 대한 개념을 알아보자.

가상화의 등장배경

출처 : 검프의 Docker

🗄️(안녕! 나는 6000만원짜리 서버)

전제 : 여기, 굉장히 좋은 서버가 있다. 하지만 사용자가 100명밖에 되지 않는다. 서버의 성능을 다 활용하지 못하니 매우 아쉽다.

대안 : 서버의 성능을 나눠서 사용할 수 없을까 ?

이것이 바로 가상화가 등장하게 된 개념이다. 하나의 서버를 분산시키고 각기 다른 서비스를 수행 할 수 있게 됐다. 가상화를 통해 사용자가 많은 서비스에는 많은 자원을 할당해주고, 적은 서비스에는 적게 할당 할 수 있다.

여기서 잠깐✋ 서버 하나에 서비스 여러개를 배포할 수 있다고 ?!

⇒ 그렇다. 포트만 열려있으면 여러 개를 배포할 수 있다.
(서버 개발자: 너무 당연한거 아니야? 💦)

하이퍼 바이저

이런 서버 가상화 기술을 구현할 수 있게 해주는 기술을 하이퍼바이저라고 한다. 여러 개의 운영체제를 하나의 호스트 os에 생성해서 사용할 수 있게 해주는 소프트웨어이다. 이렇게 생성된 여러개의 운영체제는 가상머신이라는 단위로 구별된다. 하이퍼바이저에 의해 생성되고 관리되는 운영체제를 게스트 운영체제라고 부른다.

가상화 단점

각종 시스템 자원을 가상화하고 독립된 공간을 생성하는 작업은 반드시 하이퍼바이저를 거쳐야하기 때문에 일반 호스트에 비해 성능 손실이 발생한다 또한 가상 머신에는 게스트 운영체제를 사용하기 위 라이브러리, 커널등을 전부 포함하기 때문에 이미지로 만들었을때 크기 또한 커진다. 완벽한 운영체제를 생성할 수 있는 장점은 있지만, 성능이 느리고 용량상 부담이 있다.

컨테이너 기반 가상화

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

vm을 보면 불필요한 os 까지 들어가 있는 것을 볼 수 있다.

오른쪽의 container는 어플리케이션을 구동하는 데 필요한 라이브러리 및 실행 파일만 존재한다.

그렇다면, 컨테이너는 서버분산 + 성능개선을 위해서 나온건가 ?

=> 정답은 ONLY 그것 만을 위해서 나온 것이 아니다 !

Docker 가 유용하게 사용되는 경우

Dockerfile을 한번 설정해주면 어떤 서버든 돌릴 수 있다. Docker file도 실행환경을 다 적어주어야 하는데… 그럼 직접 설치하는거랑 뭐가 다를까 ? 예시로 서버를 변경해야 될 때 유연하게 대응할 수 있다.

시나리오 : 개발자 J씨는 asw 컴퓨터를 샀다. 서비스 구동을 위해 node도 깔고, npm 도 깔아야하고.. MySQL 깔아야하고.. 서버를 위해 자바도 깔아야하고… !

👨‍💻개발자 : (아우 힘들어) 💦 세팅 완료~

(반년후)

👨‍💻개발자 : 어.. 서비스가 너무 커졌네.. 현재 사용하는 서버가 감당을 못하네...서버를 옮겨야겠어. 그런데 또 이 모듈들은 언제 다운받고 …… 세팅하고 .......... 😭

이러한 문제를 Docker file이 해결해준다.

Dockerfile을 사용하면 설치할 언어, 프레임워크, 패키지 등을 미리 코드 형태로 명시하고 어느 컴퓨터에서든 쉽게 자동으로 설치할 수 있다.

node 이미지는 node를 실행하기 위한 모든 파일을 가지고 있으며, MySQL 이미지는 MySQL을 실행하는 데 필요한 파일과 실행 명령어, 포트 등을 가지고 있다. 말 그대로 이미지는 컨테이너를 실행하기 위한 모든 것을 가지고 있기 때문에 더 이상 의존성 파일을 컴파일하고 새로운 환경에서 이것저것 설치할 필요가 없어진다.

컨테이너를 만들기 위해 필요한 세가지

Dockerfile

컨테이너를 어떻게 만들어야 하는지 설명되어있는 설명서 (요리로 치면 레시피)

Image

실행되고 있는 어플리케이션의 상태를 스냅샷해서 이미지로 만들어둔다. 프로그램이 여러개의 프로세스를 가질 수 있는 것 처럼, 이미지도 여러 개의 컨테이너를 가질 수 있다. (변경이 불가능한 불변의 상태)

Container

우리가 캡쳐해둔 이미지를 고립된 환경에서 실행할 수 있는 것. 이미지를 실행한 것을 컨테이너라고 부른다. 이미지가 목표하는 운영체제, 파일 시스템, 각종 자원 및 네트워크 등이 실행될 수 있는 독립된 공간이 생성된다. 컨테이너 안에서 우리의 어플리케이션이 동작한다.

객체 지향에 익숙한 사람들은 Image 를 class 로 생각하면 조금 더 쉽게 와닿을 것이다. 동작하고 있는 어플리케이션을 이미지 형태로 만든 뒤, 이 이미지를 이용해서 실제 어플리케이션이 동작하는 각각의 컨테이너를 만들 수 있다.

💅 이미지는 클래스(설정파일), 컨테이너는 클래스로 만들어진 인스턴스 (실행환경) !

출처 : 드림코딩 앨리

  • docker 허브에서 이미지를 받는 행위를 pull 이라고 한다. 이미지를 실행시키는 행위를 run 이라고 한다. run 을 하게 되면 이미지가 컨테이너가 되고, 그 컨테이너가 실행되면서 컨테이너 안에 포함되어있는 실행되도록 조치 되어 있는 프로그램이 실행되면서 우리는 그 프로그램을 사용할 수 있게 되는 것이다.

여기서 다시 알아보는 Docker의 장점

  • 원하는 개발 환경을 파일에 저장하면 docker 는 이를 당신이 원하는 어떤 머신에든 해당 환경을 시뮬레이션 해준다.
  • 각각 독립적으로 동작하기 때문에 무슨 환경이든 모듈식으로 관리가 가능하다.

즉, Docker를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포, 확장할 수 있다.

Docker 와 리눅스의 관계

도커 위에서 돌아가는 컨테이너, 그 컨테이너 안에서 동작하는 각각의 앱들은, 리눅스 운영체제에서 동작하는 앱들이다.

그렇다면 우리 컴퓨터가 리눅스가 아니라면 도커를 쓸 수 없는걸까 ?

아니다. 우리의 컴퓨터에 가상 머신을 깔고, 그 가상 머신에 리눅스 운영체제를 깔면 리눅스 운영체제 위에서 도커와 같은 컨테이너 기술을 사용할 수 있다.

하지만 이렇게 하면 복잡하지 않을까 ?

복잡하지 않다! 이런 것들을 도커가 다 해준다. 이런 이유때문에 우리의 운영체제가 리눅스라면 성능에 영향이 없다. 하지만 다른 운영체제를 사용한다면 어느정도 성능과 속도를 감수해야 한다.

다음편에 계속...

profile
My Island

2개의 댓글

comment-user-thumbnail
2024년 1월 15일

서버를 옮기게 될 때 이전 서버의 이미지를 가지고 쉽게 세팅을 할 수 있다고 이해했습니다.
그럼 db의 테이블이나 was의 세팅 등도 같이 가지고 와지는 건가요?

1개의 답글