https://coding567.tistory.com/101
[Docker] 도커(Docker)가 컨테이너(Container) 방식을 사용하는 이유는?
1. Docker란? Docker는 "컨테이너(Container)" 기반의 가상화 기술을 말한다.이때, 컨테이너는 리눅스 가상화 기술로, 호스트의 커널을 공유하며, 격리된 환경에서 실행하기 때문에 가볍고 빠르다.가상
coding567.tistory.com
앞선 내용에서는 도커가 컨테이너 방식을 사용하는 이유에 대해서 알아보았다.
이번에는 도커의 장점에 대해 알아보자.
1. 이식성(Portability)
컨테이너 안에 실행 환경(앱 + 라이브러리 + 설정)을 전부 묶어서 이미지로 만들 수 있다.
어디서든 docker run만 하면 동일하게 실행 가능하다.
클라우드, 로컬, 테스트 서버 상관없이 똑같이 동작한다.
1.1 "내 컴퓨터에선 되던데?" 문제 해결
개발자마다 OS 버전, 패키지 설치 상태가 다르기 때문에 발생하는 문제를 제거한다.
컨테이너는 항상 동일한 환경을 보장하여 협업 시 필수로 사용한다.
1.2. 개발 환경 == 배포 환경
로컬에서 실행한 컨테이너 그대로 서버에 배포가 가능하다.
개발자가 작성한 Dockerfile을 docker build로 이미지 생성하여 개발 PC에서 docker run을 돌리든, 서버에서 docker run을 돌리든 동일한 결과를 보장한다.
배포 과정에서 "환경 세팅" 이슈를 최소화한다. 기존 방식은 서버마다 OS 버전, 라이브러리, 의존성 설치해야 해 설치 누락/버전 충돌이 발생할 수 있지만, Docker 방식은 모든 환경(라이브러리, 패키지, 런타임)을 이미지 안에 캡슐화한다. 따라서 서버에서는 이미지 실행만 하면 끝이어서 환경 세팅이 불필요하다.
CI/CD 파이프라인과 찰떡궁합이다.
*보충 설명*
먼저 CI/CD가 뭐냐면?
CI(Continuous Integration): 개발자가 코드를 올릴 때마다 자동으로 빌드하고 테스트하는 과정
CD(Continuous Deployment/Delivery): 테스트까지 통과한 코드를 자동으로 서버에 배포하는 과정
즉, 사람이 직접 "코드 빌드-> 실행 환경 세팅-> 테스트-> 서버 배포" 를 하지 않고, 자동화된 파이프라인이 대신해주는 것을 CI/CD라고 한다.
그런데 왜 Docker가 딱 맞을까?
1. 항상 똑같은 환경 제공
Docker 이미지를 만들면, 그 안에 실행 환경이 고정되며, 테스트할 때나 실제 서버에 배포할 떄나 완전히 똑같은 컨테이너가 실행된다.
2. 자동화하기 쉬움
빌드 서버(CI 툴)가 docker build -> docker run -> docker push만 하면 된다.
서버에서는 docker pull -> docker run으로 바로 배포가 가능하다.
3. 빠름
VM을 새로 설치하고 환경 세팅하는 게 아니라, 이미 만들어둔 컨테이너 이미지를 바로 실행한다.
"한 번 만든 환경"을 그대로 계속 재사용이 가능하다.
예를 들어 설명하면,
Docker가 없는 경우는 개발자가 Windows에서 코드 작성하고 서버는 Linux라 환경이 다를 때, 서버에 가서 pip install 이나 apt-get-install 이런 거 일일이 설치하면 에러가 잔뜩 발생한다.
반면, Docker가 있는 경우에는 개발자가 로컬에서 docker build로 이미지 생성(코드+실행환경 포함)하며, CI/CD가 자동으로 이 이미지를 테스트하고, 서버에 똑같이 배포한다. 즉, 서버에서는 그냥 docker run만 하면 끝난다.
요약하자면, Docker 덕분에 개발 -> 테스트-> 배포의 전 과정이 같은 환경에서 자동으로 이어질 수 있어서 CI/CD 파이프라인이 훨씬 단순하고 안정적으로 동작한다.
1.3 패키지 버전 충돌 해결
예를 들어, 프로젝트 A는 Python 3.8이 필요하고, 프로젝트 B는 Python 3.11이 필요하다고 해보자.
이때, VM 없이 컨테이너로 각각 실행하면 충돌 없이 공존이 가능하다.
1.4 OS 차이 해결
Windows, macOS에서도 Docker Desktop을 이용해 Linux 컨테이너를 실행 가능하다.
팀원이 Windows, 서버는 Linux여도 문제가 없다.
2. 격리, 보안, 클라우드
격리: 컨테이너는 프로세스 단위로 격뢰됨 -> 하나가 망가져도 다른 컨테이너에 영향 없음.
보안: 권한 제어, 네트워크 격리, 볼륨 관리 등 보안 기능도 지원
클라우드: Kubernetes 같은 오케스트레이션 툴과 함께 쓰면 대규모 클라우드 환경에서 안정적 운영이 가능
3. 성능
Docker는 VM보다 훨씬 가볍고 빠르다.
VM은 Guest OS 부팅이 필요해 수 분이 걸리는데, Docker는 Guest OS가 없어서 몇 초, 심하면 1초 이내에 실행된다.
4. 제한 조건
4.1 리눅스 커널 필요
Docker는 리눅스의 특별한 기능(cgroups, namespace)을 이용해서 컨테이너를 격리하고 관리한다.
그래서 리눅스에서 돌릴 때 가장 자연스럽고 성능이 좋다.
4.2 윈도우/맥에서는 직접 실행 불가
Windows랑 macOS는 리눅스 커널이 없다.
그래서 Docker가 직접 실행될 수 없고, 대신 작은 리눅스 가상머신(경량/미니 리눅스)를 하나 띄운 뒤, 그 안에서 컨테이너를 돌린다. 이걸 Docker Desktop이 자동으로 해준다.(윈도우는 WSL2, 맥은 HyperKit/Apple VM 등)
4.3 성능 차이
원래 VM처럼 무겁게 전체 운영체제를 돌리는 건 아니고, 아주 가벼운 리눅스만 띄워서
성능 손해가 거의 없고, 체감상 차이를 느끼기 힘들다.