본문 바로가기

DevOps/Docker

<Docker> 도커의 구조와 장단점

1. 구조

* Docker의 동작 원리

 - 앞선 포스팅에서 봤었던 사진을 다시 들고 왔다. 도커의 기본 동작 원리를 이해하기 위해서는, Docker 엔진이 어떻게 운영체제 위에서 동작하며 컨테이너를 관리하는지 알아야 한다. Docker 엔진은 운영체제 위에서 동작하며, 그 위에서 다양한 컨테이너를 실행시킨다. 각각의 컨테이너는 '리눅스 운영체제와 비슷한' 구조를 가지고 있다.

 - 운영체제가 하는 일은 소프트웨어나 프로그램의 명령을 하드웨어에 전달하는 것이다. 운영체제는 '커널'과 그 외의 주변 부분으로 구성되며, 주변 부분이 프로그램의 요청을 커널에 전달하고, 커널이 하드웨어를 관리한다. Docker에서는 컨테이너가 완전히 독립적이므로, 이 주변 부분이 컨테이너 내부에 존재하며, 이를 통해 프로그램의 명령을 커널에 전달한다.

 - Docker의 '가벼움'이라는 큰 장점은 바로 이 점에서 나온다. 컨테이너는 커널을 직접 포함하지 않고, 호스트 운영체제의 커널을 공유해서 사용한다. 이 때문에 Docker는 기본적으로 리눅스 운영체제 위에서 동작하며, 컨테이너 내부의 소프트웨어 역시 리눅스용 소프트웨어여야 한다.

 - 그렇다면 우리가 일반적으로 사용하는 윈도우나 macOS와 같은 운영체제에서는 Docker를 사용할 수 없을까? 다행히 그렇지는 않다. 이런 경우에는 가상 환경 위에 리눅스 운영체제를 설치하고 그 위에서 도커를 실행하는 방법이 있을 수 있다. 또 윈도우용 또는 macOS용 도커 데스크톱처럼 도커를 실행하는데 필요한 리눅스 운영체제를 포함하는 패키지를 설치해 사용하는 방법도 있다. 

 

* 이미지와 컨테이너

 - 컨테이너를 생성하려면 먼저 '이미지'를 만들어야 한다. 이미지는 컨테이너를 찍어내는 '빵틀' 혹은 '금형' 같은 것이다. 우리가 실제로 사용하는 것은 컨테이너이며, 이미지를 그대로 사용하지는 않는다. 이러한 이미지를 이용하여 동일한 컨테이너를 여러 개 생성할 수 있다.

 

 - 컨테이너로도 새로운 이미지를 만들 수 있다. 이미 만든 컨테이너를 조작하거나 수정 및 업데이트하여 컨테이너의 '틀'을 새로 만드는 것이다. 이를 통해 업데이트된 이미지를 만들 수 있고, 업데이트된 컨테이너를 여러 개 만들 수 있게 된다. 이제 우리는 소프트웨어나 시스템을 넣은 새로운 이미지를 만들어 다수의 서버를 준비하는 작업이 매우 간단해진다.

 

https://hub.docker.com/

 - 그렇다면 이미지를 어디서 구할 수 있을까. 이미지는 주로 도커허브에서 구할 수 있다. 공식적으로 운영되는 도커 레지스트리의 이름이다. 공개된 컨테이너 이미지가 모여있어서 원하는 이미지를 내려받을 수 있다.

 

mysql이미지

 - 도커 허브에는 운영체제(비슷한 것)만 들어있는 이미지부터, 여러가지 소프트웨어가 함께 포함된 것 까지 다양한 이미지가 제공되고 있다. 

 

 - 컨테이너는 이미지 선택 외에도 다양한 조합을 고려해야한다. 도커를 사용해 워드프레스 블로그를 구축한다고 가정하자. 아파치(웹서버), mysql(DBMS), 워드프레스라는 세 가지 소프트웨어가 필요하다. 한 컨테이너에 모두 넣는게 좋을까, 아니면 각 컨테이너에 하나씩 넣는 것이 좋을까. 정답은 각각 따로 넣는 것이다.

 

 - 도커를 사용할 때의 원칙 중 하나로, '한 컨테이너에 한 프로그램'이라는 것이 있다. 이렇게 해야 도커의 장점들을 가져갈 수 있고, 보안 및 유지 관리 측면에서 유리하기때문이다.

 

* 생애주기와 데이터 저장

 - Docker를 사용하면서 주의해야 할 점 중 하나는 컨테이너의 수명 또는 생애주기이다. 컨테이너는 일회용으로 쓰고 버리는 성격을 가지고 있다. 이는 업데이트가 필요할 때마다 오래된 컨테이너를 버리고 새로운 이미지로부터 새로운 컨테이너를 만들어 갈아타는 방식을 사용하기 때문이다. 따라서 아래의 과정이 '컨테이너의 생애주기'라고 할 수 있다.

  1. 컨테이너 생성
  2. 컨테이너 실행
  3. 컨테이너 종료
  4. 컨테이너 폐기
  5. 컨테이너 생성

 - 하지만 이 과정에서 주의해야 할 점이 있다. 컨테이너를 폐기하면 해당 컨테이너에서 생성하거나 편집했던 파일이나 데이터는 모두 사라진다. 이런 상황을 방지하기 위해, Docker는 호스트 서버의 디스크를 마운트해서 데이터를 저장할 수 있게 해준다.

 - "마운트"라는 용어는 디스크를 연결해 데이터를 기록할 수 있도록 한 상태를 의미한다. 따라서 Docker 컨테이너도 물리적인 컴퓨터의 디스크를 연결해 데이터를 기록할 수 있다.

 

2. 장단점

 - 도커의 핵심은 '환경의 격리'다. 이런 독립된 환경 덕분에 여러 개의 컨테이너를 동시에 실행할 수 있고, 같은 애플리케이션도 여러 개 실행할 수 있다. 게다가 이미지를 통해 컨테이너 교체가 쉽고, 업데이트도 쉽다. 컨테이너에 '커널'을 포함시킬 필요가 없으므로, 가볍고 이동이 용이하며, 환경 구축이 쉽다.

 

* 장점

 - 한 대의 물리 서버에 여러 대의 서버를 띄울 수 있다. Docker는 격리된 환경을 제공하므로 각 기능 서버를 안전하게 실행시킬 수 있을 뿐만 아니라, 일반적인 서버에서는 함께 실행할 수 없는 조합도 가능하다. 예를 들어 같은 소프트웨어를 다른 버전으로 여러 개 실행시키는 것이다.

 

 - 서버를 추가하거나 줄이는 등의 확장성이 뛰어나다. 컨테이너를 생성하고 삭제하는 과정이 간단하고 빠르기 때문에, 시스템의 규모를 유연하게 조정할 수 있다.

 - 동일한 환경을 쉽게 재현할 수 있다. 이미지를 통해 애플리케이션과 그 실행 환경을 패키징하고, 이를 다른 서버에서도 동일하게 실행할 수 있다.

 - 개발, 테스트, 배포 환경을 일관성 있게 유지할 수 있다. 도커는 운영체제와 하드웨어, 네트워크 환경에 관계없이 동일한 환경을 제공한다. 이로 인해 "내 컴퓨터에서는 잘 돌아가는데, 서버에서는 왜 안 돌아가지?"라는 문제를 피할 수 있다.

 - 서버 이동 및 백업이 용이하다. 컨테이너 단위로 이동이 가능하며, 데이터 볼륨을 활용해 백업 및 복원을 쉽게 할 수 있다.

 

* 단점

 - 호스트 OS와 Docker 간에 성능 차이가 발생할 수 있다. Docker는 컨테이너형 가상화를 제공하기 때문에, 일반적으로 가상화에 비해 성능 손실이 적다. 그러나 여전히 일부 성능 손실이 발생할 수 있으며, 호스트 OS에서 직접 실행하는 것과 Docker에서 실행하는 것 사이에 약간의 성능 차이가 발생할 수 있다.

 - 리눅스용 소프트웨어 밖에 지원하지 않는다. 유닉스나 윈도우 서버는 아예 지원하지 않는다.

 - 보안이나 이슈에 대한 고려가 필요하다. Docker 컨테이너는 기본적으로 격리되지만, 완벽한 보안을 보장하지는 않는다. 특히 호스트 서버에 문제가 생기면 모든 컨테이너에 영향이 간다는 점을 잊으면 안된다. 컨테이너 내부에서 호스트 OS나 다른 컨테이너에 대한 공격이 가능하므로, 보안을 유지하려면 추가적인 보안 조치가 필요하다. 게다가 물리 서버의 이상에 대한 대책을 확실히 세워둬야 한다.

 - 복잡한 데이터 관리도 단점으로 볼 수 있다. Docker 컨테이너는 무상태(stateless)를 원칙으로 하기 때문에, 데이터를 영구적으로 저장하거나 관리하는 것이 어렵다. 이를 위해 별도의 데이터 볼륨을 설정하거나, 외부 데이터베이스를 사용해야 한다.

 - 컨테이너 하나를 사용할 때에는 장점을 느끼기 힘들다. 도커는 컨테이너를 여러 개 사용하는 형태를 가정하고 있기 때문이다. 게다가 도커를 사용하려면 도커 엔진을 구동해야하는데, 컨테이너가 하나라면 도커엔진은 단순한 오버헤드일 뿐이다.

 

3. 결론

 - Docker는 가상화 기술을 활용하여 개발과 배포를 단순화하고, 일관성있는 환경을 제공하는 동시에 리소스를 효율적으로 사용한다. 그러나 Docker를 활용하려면 몇 가지 주의사항을 기억해야 한다. 이러한 주의사항에는 보안과 데이터 관리, 그리고 복잡한 컨테이너 구성 관리가 포함된다.

 - 그럼에도 불구하고, Docker의 장점은 이러한 단점을 상당 부분 상쇄하며, 그 활용은 IT 업계에서 빠르게 확산되고 있다. Docker는 IT 인프라 및 개발 환경을 이해하고 활용하는 데 있어 중요한 도구이므로, 이를 학습하고 이해하는 것이 중요하다.

 


참고

 

 해당 포스팅은 그림과 실습으로 배우는 도커&쿠버네티스를 읽고 개인적으로 필요한 내용을 추가 및 정리한 글입니다.

 

 

 

그림과 실습으로 배우는 도커 & 쿠버네티스 - YES24

컨테이너나 도커를 도통 이해하기 어려운 분들을 위한 본격 도커 입문서!이 책은 컨테이너 기술이 어렵게 느껴지는 엔지니어나 백엔드 기술에 자신이 없는 분들을 위한 도커 입문서다. 자세한

www.yes24.com