Docker란?

Docker는 컨테이너를 생성하고 관리하기 위한 도구이다.

 

 

Docker의 시작

  • Docker는 2013년 3월 산타클라라에서 열린 PYCON에서 Solomon Hykes가 ‘The future of Linux Containers’를 발표하면서 세상에 알려지게 되었다.
  • Docker는 그렇게 Open source에 힘입어 전 세계적으로 큰 인기를 얻게 되었고 컨테이너를 실행하고 관리하는 ‘container runtime’ 도구로 사람들에게 알려지게 되었다.
  • https://youtu.be/wW9CAH9nSLs?si=UBSMZsWSEIZKexjW
    • 해당 링크는 Solomon Hykers의 발표 영상이다.

 

Container란?

컨테이너는 소프트웨어 서비스를 실행하는 데 필요한 특정 버전의 프로그래밍 언어 런타임 및 라이브러리와 같은 종속 항목과 애플리케이션 코드를 함께 포함하는 경량 패키지이다.

  • 컨테이너: 표준화된 소프트웨어 유닛. 이는 기본적으로 코드 패키지이며 해당 코드를 실행하는데 필요한 종속성과 도구가 포함되어 있다. 도커가 실행되는 모든 곳에서 가져올 수 있다. 동일한 환경, 동일한 애플리케이션을 어떤 환경에서도 실행할 수 있다.
  • 컨테이너 기술은 개인 데스크톱뿐만 아니라 기업 내의 on-premise 서버에서 퍼블릭 클라우드까지 언제 어디서든 빠르고 효율적으로 배포 가능하며, 확장성 또한 가지고 있다.
  • 이를 통해 서버 구성, OS 설치, 네트워크, 개발 도구 구성 등의 반복적이고 불편한 작업에 시간을 낭비하지 않고 개발자는 애플리케이션 개발 자체에 집중할 수 있게 된다.

 

왜 독립적이고 표준화된 애플리케이션 패키지를 원할까?

  • 다양한 개발 및 생산 환경
    • 나중에 앱을 실행할 때와 정확히 동일한 환경에서 빌드하고 테스트할 수 있다.
  • 팀/회사 내의 다양한 개발 환경
    • 모든 팀원은 동일한 프로젝트를 수행할 때 정확히 동일한 환경을 가질 수 있다.
  • 서로 다른 프로젝트 간의 도구/버전 충돌
    • 프로젝트 간 전환 시 프로젝트 A에서 사용되는 도구가 프로젝트 B에서 사용되는 도구와 충돌할 수 있는 것을 예방할 수 있다.
  • 개발과 생산에 대해 정확히 동일한 환경이 필요하다 → 이를 통해 테스트된 대로 정확히 작동하는지 확인할 수 있다.
  • 신규 직원 및 동료와 공통 개발 환경/설정을 쉽게 공유할 수 있게 된다.
  • 반복적으로 로컬 종속성 및 런타임을 설치하고 다시 설치하지 않아도 된다.

 

도커 컨테이너와 가상머신의 차이점

지금까지 설명한 것을 읽어보면 가상머신과 도커 컨테이너는 비슷하게 느껴질 수도 있다.

가상화 기술은 기존에 존재해 왔다. 하지만 기존의 가상화 기술과 어떤 차이점이 있는 것일까?

가상머신 Virtual Machine

기존의 가상화 기술인 가상머신은 하이퍼바이저(Hypervisor)를 이용해 여러 개의 운영체제를 하나의 호스트에서 생성해 사용하는 방식이었다.

 

하나의 호스트에서 여러 개의 운영체제는 가상 머신이라는 단위로 구별되고 각 가상머신에는 우분투와 같은 운영체제가 설치되어 사용된다. 따라서 하이퍼바이저에 의해 성성되고 관리되는 운영체제는 Guest OS라고 하며, 각 게스트 운영체제는 다른 게스트 운영체제와는 완전히 독립된 공간과 시스템 자원을 할당받아 사용하게 된다. 이러한 가상화 방식의 대표적인 도구는 VirtualBox, VMware 등이 있다.

 

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

 

  • 가상머신은 Hypervisor를 통해 여러 개의 운영체제를 생성하고 관리됨 (Guest OS)
  • 시스템 자원을 가상화하고 독립된 공간을 생성하는 작업은 Hypervisor를 거치므로 성능 손실이 발생함
  • Guets OS를 사용하기 위한 라이브러리, 커널 등을 포함하기에 배포 시 용량이 큼

 

Docker Container

도커 컨테이너는 가상화된 공간을 생성하기 위해 리눅스 자체 기능인 chroot, namespace, cgroup을 사용하여 프로세스 단위의 격리 환경을 만들기 때문에 성능 손실이 거의 발생하지 않는다.

컨테이너에 필요한 커널을 공유해서 사용하고, 컨테이너 안에는 애플리케이션을 실행(run)하는 데 필요한 라이브러리 및 실행 파일만 존재하여 image로 만들었을 때 가상머신에 비해 매우 가벼운 용량을 가지게 된다.

 

  • 도커 컨테이너는 가상화된 공간을 생성할 때 리눅스 자체 기능을 사용하여 프로세스 단위의 격리 환경을 만들어 성능 손실이 발생하지 않는다.
  • 커널을 공유해 사용하므로, 라이브러리 및 실행파일만 있기에 경량화된 사이즈
  • 배포하는 시간이 가상머신에 비해 압도적으로 빠르며, 성능 손실 또한 거의 발생하지 않음

 

 

  Docker Virtaul Machine
부팅 시간 몇 초 안에 부팅 VM이 부팅되는 데 몇 분 정도 걸릴 수 있음
실행 대상 Docker는 도커 엔진을 사용 VM은 하이퍼바이저를 사용
효율성 가상화하는 데 공간이 필요하지 않으므로 적은 용량 및 메모리 사용 전체 OS를 로드해야 하므로 효율성이 떨어짐
격리 컨테이너 기술은 호스트 커널을 공유하므로, 해커가 감염된 단일 애플리케이션을 통하여 커널 하위 시스템에 액세스 & 해킹할 수 있음 효율적인 격리 메커니즘으로 인해 간섭 가능성이 최소화
배포 컨테이너화된 단일 이미지를 모든 플랫폼에서 사용할 수 있으므로 배포가 쉬움 별도의 인스턴스가 실행을 담당하므로 배포 시간이 비교적 오래 소요됨
사용 복잡도 Docker에는 타사 도구와 Docker 관리 도구로 구성된 복잡한 사용 메커니즘이 있습니다. 도구는 사용하기 쉽고 작업하기가 더 간단합니다.

 

Docker 특징

  • 여러 계층의 Application을 컨테이너로 분리, 연결하여 실행하는 MSA (MicroService Architecture) 프로젝트에 유용하다.
  • Application의 인프라는 image를 통해 제공하고 Public 혹은 Private 공유 가능하다.
  • Github과 유사한 방식(open share)으로 Docker Hub에서 제공한다.
  • 제공된 image를 기반으로 Application 서비스를 제공, 이를 컨테이너화 할 수 있다.

 

컨테이너 특징

  • 컨테이너는 우리가 개발한 최소한의 image를 통해 실행되기에 경량이다.
    • 컨테이너 이미지 생성의 Best Practice 중 하나는 이미지 경량화이다.
  • 일반 서버 환경에서의 애플리케이션 실행과 달리 언제든 프로세스 수준의 속도로 빠르게 실행할 수 있고, 한 번에 여러 개의 컨테이너를 동시에 실행 가능하다.
  • 개인 환경, 클라우드 환경 외에도 어떤 OS 환경에서도 동작 가능한 이식성을 보유하고 있다.
  • 컨테이너 자체 애플리케이션 환경에 대한 관리만 요구되므로, 지속적 서버 관리 비용을 절감할 수 있다.

 

 

References

https://cloudacademy.com/blog/docker-vs-virtual-machines-differences-you-should-know/

https://techblog.lotteon.com/docker를-왜-써야되는가-2310117b4dea

https://nearhome.tistory.com/83

https://seosh817.tistory.com/345#Virtual%20Machine(%EA%B0%80%EC%83%81%EB%A8%B8%EC%8B%A0)%20vs%20Docker%20Container(%EB%8F%84%EC%BB%A4%20%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88)-1

 

[Docker] 도커란? - 도커 개념 정리

도커란? 도커(Docker)는 리눅스 컨테이너에 리눅스 어플리케이션을 프로세스 격리기술을 사용하여 더 쉽게 컨테이너로 실행하고 관리할 수 있게 해주는 오픈소스 프로젝트 입니다. 도커는 일반적

seosh817.tistory.com

 

[쿠버네티스] 컨테이너가 뭐에요? (컨테이너의 기본 개념, 컨테이너 란?)

들어가며: 컨테이너가 뭐에요? 왜 컨테이너라고 부르죠? 컨테이너의 장점 컨테이너 아키텍처 도커 컨테이너 왜 (도커) 컨테이너를 써야하나요? 들어가며 : 컨테이너(container)가 뭐에요? 대충말하

nearhome.tistory.com

'Docker' 카테고리의 다른 글

#01 도커랑 친해기 / Play With Docker, PWD  (0) 2024.02.08

도커를 간단하게 실습하고 다뤄볼 수 있는 환경을 원한다면, 도커 공식 홈페이지에서 제공하는 가상 환경을 이용하면 좋다.

 

오늘은 Play with Docker, 즉 PWD에 대한 가이드이다.

 

오늘 실습을 통해서 도커 CLI 환경과 명령어들을 이해할 수 있고 기본적인 기능을 알게 된다.

 

명령어 내용
docker images 현재 시스템에 저장된 도커 이미지 목록을 표시하는 명령어입니다. 이 명령을 사용하면 로컬에 다운로드한 이미지 목록과 해당 이미지의 크기, 만들어진 날짜 및 시간 등의 정보를 확인할 수 있습니다.
docker pull 도커 이미지를 다운로드하는 명령어
docker ps 현재 실행 중인 도커 컨테이너의 목록을 표시하는 명령어입니다. 이 명령을 사용하면 컨테이너의 상태, ID, 이름, 사용 중인 리소스 등의 정보를 확인할 수 있습니다.
docker run 도커에서 컨테이너를 생성하고 실행하는 명령어
-d 옵션 컨테이너를 detached 모드로 실행합니다. 이는 컨테이너가 백그라운드에서 실행되도록 합니다.
-p 8001:80 호스트의 포트 8001을 컨테이너의 포트 80으로 매핑합니다. 즉, 호스트에서 http://localhost:8001로 접속하면 컨테이너 내의 Nginx 서버로 연결됩니다.
-a 모든 컨테이너를 포함하여 종료된 컨테이너도 포함하여 목록을 표시합니다.
docker stop 도커 컨테이너를 중지(stop)하는 명령어입니다. 이 명령어는 컨테이너를 강제 종료하지 않고 graceful하게 중지시킵니다. 컨테이너가 중지되면 해당 프로세스가 실행 중인 상태에서 멈춥니다.
graceful Graceful하게 중지된다는 것은 컨테이너가 종료될 때 해당 프로세스가 어떤 작업을 완료하도록 허용하고, 사용자에게 충분한 시간을 주어 컨테이너 내의 애플리케이션이나 서비스가 정상적으로 마무리되도록 하는 것을 의미합니다. 이는 컨테이너가 종료될 때 강제로 프로세스를 중단시키는 것보다 데이터 손실이나 불안정성을 줄일 수 있는 방법입니다.
docker rm 도커에서 컨테이너를 삭제하는 명령어입니다. 이 명령어를 사용하면 종료된 컨테이너를 제거하거나, 실행 중인 컨테이너를 중지하고 삭제할 수 있습니다.

 

도커 놀이터

  • https://www.docker.com/play-with-docker/
    • docker 공식 사이트에서 웹 환경에서 Docker를 자유롭게 실습할 수 있는 환경을 제공하고 있다.
    • Lab Environment → Get Started 로 실습을 시작할 수 있는데, 먼저 Docker 계정이 필요하다.
    • docker 계정이 없다면 계정 생성 후 실습을 진행할 수 있다.

 

  • 세션을 시작하게 되면 4시간의 시간이 주어지게 되며 할당된 시간이 끝나면 Close 된다.
  • ADD New instance로 인스턴스를 생성할 수 있다.
  • Docker 명령어는 대체적으로 리눅스 환경과 유사한 명령어의 형태를 보이고 있다. 따라서 리눅스 환경과 명령이 익숙하다면 다루기 더욱 쉽다.

 

  • docker images 명령어는 현재 시스템에 저장된 도커 이미지 목록을 표시하는 명령어이다. 이 명령을 사용하면 로컬에 다운로드한 이미지 목록과 해당 이미지의 크기, 만들어진 날짜 및 시간 등의 정보를 확인할 수 있다.
  • docker pull nginx:1.23.1-alpine 명령어는 도커 허브(Docker Hub)에서 nginx 이미지의 특정 버전(1.23.1) 및 태그(alpine)를 다운로드하는 명령어이다.
  • alpine은 Alpine Linux 기반의 경량화된 버전의 이미지를 사용한다는 것을 의미한다. Alpine Linux는 경량화되어 있어 이미지 크기가 작고, 보안 측면에서도 우수한 것으로 알려져 있다.
  • 이 가상 환경에서 자유롭게 도커를 다뤄보고 도커에 대해 익숙해질 수 있다.

docker run -d -p 8001:80 --name=webserver1 nginx:1.23.1-alpine

  • 실행 결과로 컨테이너는 백그라운드에서 실행되며, 지정된 포트 매핑에 따라 호스트 시스템의 8001 포트로 Nginx 웹 서버에 접속할 수 있게 된다. 이는 실제 컨테이너가 운영 중이며, 8001 포트로 접속 시 nginx 웹 서버를 확인할 수 있음을 의미한다.

 

  • OPEN PORT → 8001
  • Welcome to nginx 사이트로 접속되는 것을 확인할 수 있다.

 

  • curl 명령어로 로컬 CLI 환경에서도 nginx 컨테이너를 확인할 수 있다.

 

  • docker ps -a 옵션으로 컨테이너 상태를 확인할 수 있다.
    1. Up: 컨테이너가 현재 실행 중인 상태. Up 다음에는 컨테이너가 실행된 시간이 표시된다.
    2. Exited: 컨테이너가 종료된 상태. Exited 다음에는 컨테이너가 종료된 시간이 표시된다. 종료 코드가 0이면 정상적으로 종료되었다는 의미이다. 종료 코드가 0이 아니면 해당 코드를 따라 비정상적으로 종료된 것을 나타낸다.
  • docker stop: 도커 컨테이너를 graceful하게 중지시키는 명령어
  • 프로세스만 죽었기에 스냅샷까지 제거하려면 docker rm을 사용한다.
  • 컨테이너를 삭제하고 싶다면 반드시 stop을 거친 이후 rm 명령어를 사용해야 한다.

 

'Docker' 카테고리의 다른 글

Docker란 무엇인가?  (2) 2024.02.11

+ Recent posts