Related to: MLOps

Docker는 애플리케이션을 신속하게 구축, 테스트, 배포할 수 있도록 해주는 컨테이너 기반의 오픈소스 가상화 플랫폼입니다. Docker는 소프트웨어를 실행하는 데 필요한 코드, 라이브러리, 시스템 도구, 런타임 등 모든 요소를 하나의 컨테이너라는 표준화된 단위로 패키징합니다. 이 컨테이너는 환경에 상관없이 동일하게 동작하기 때문에, 개발 환경과 운영 환경의 차이로 발생하는 문제를 크게 줄여줍니다.

Docker의 주요 특징

•	컨테이너 기반

Docker는 기존의 가상머신(VM)과 달리, 운영체제 전체를 가상화하지 않고 애플리케이션과 그 실행 환경만을 격리합니다. 이로 인해 훨씬 가볍고 빠르게 실행될 수 있습니다. • 이식성 컨테이너는 어디서든 동일하게 동작하므로, 개발 환경에서 만든 컨테이너를 테스트나 프로덕션 환경에 그대로 배포할 수 있습니다. • 확장성 및 관리 용이성 여러 컨테이너를 조합해 복잡한 서비스를 구성할 수 있고, 각 컨테이너는 독립적으로 배포, 확장, 롤백이 가능합니다. • 오픈소스 누구나 사용할 수 있는 오픈소스 프로젝트이며, 커뮤니티와 기업(Docker Inc.)이 함께 발전시키고 있습니다.

Docker의 구성 요소

• Docker 엔진(Docker Engine)

컨테이너를 생성, 실행, 관리하는 핵심 런타임입니다.

• Docker 이미지

컨테이너 실행에 필요한 모든 파일, 설정, 코드 등을 포함하는 템플릿입니다.

• Docker 컨테이너

이미지를 기반으로 실제로 실행되는 인스턴스입니다. 각 컨테이너는 격리된 환경에서 동작합니다.

Docker를 사용하는 이유

•	코드를 더 빠르게 배포하고, 운영 환경을 표준화하며, 인프라 자원을 효율적으로 사용할 수 있습니다.
•	클라우드, 온프레미스 등 다양한 환경에서 동일한 방식으로 애플리케이션을 관리할 수 있습니다.
•	복잡한 마이크로서비스 아키텍처(MSA)나 대규모 서버 환경에서 관리 및 확장이 매우 용이합니다.

Docker가 사용하는 Linux 커널 기능

Docker는 리눅스 커널의 여러 기능을 기반으로 컨테이너 격리 및 리소스 제한을 구현합니다. 1. Namespaces • PID, UTS, Mount, Network, IPC, User 등의 namespace를 사용하여 각각의 컨테이너를 격리합니다. • 예를 들어 PID namespace는 각 컨테이너가 자체 프로세스 트리를 갖도록 합니다. 2. Control Groups (cgroups) • CPU, 메모리, 디스크 I/O 등 시스템 리소스를 컨테이너 단위로 제어합니다. 3. UnionFS (OverlayFS) • 여러 계층으로 구성된 파일 시스템을 구현하여 이미지 레이어 관리 및 컨테이너 간 스토리지 공유를 가능하게 합니다. 4. chroot, capabilities • chroot는 루트 파일 시스템을 변경하고, capabilities는 프로세스에 부여된 권한을 제어합니다. 5. seccomp, AppArmor/SELinux • 시스템 콜을 필터링하고, 보안 정책을 적용하여 컨테이너 내 실행 환경의 보안을 보장합니다.

Docker가 가상화보다 자원 효율성이 높은 이유

전통적인 가상머신은 전체 OS를 포함한 가상 환경을 운영해야 하므로, 리소스 오버헤드가 큽니다. 반면, Docker는 운영체제 커널을 호스트 OS와 공유하고 애플리케이션 단위만을 가상화하기 때문에 가볍고 빠릅니다. • OS 공유 Docker는 Linux 커널을 공유하여 VM 대비 메모리 및 디스크 사용량이 낮습니다. • 이미지 계층 구조 Docker 이미지는 레이어 구조를 가지며, 공통된 베이스 이미지를 공유함으로써 저장소 사용량과 빌드 시간을 절약할 수 있습니다. • 빠른 시작 시간 전체 OS 부팅이 필요 없는 Docker는 컨테이너 시작이 수 초 내로 가능하여 개발과 배포 속도를 크게 높입니다. • 중복 제거 및 캐싱 Docker는 이미지의 레이어를 재사용하고, 변경된 부분만 빌드함으로써 자원 낭비를 최소화합니다.

왜 Docker는 가상화보다 효율적이라 여겨지는가? • Docker는 시스템 자원을 더 적게 소모하면서도 동일한 수준의 격리성을 제공하므로, 서버 자원을 보다 많이 활용할 수 있습니다. • 개발자 입장에서 테스트 환경 구축과 배포가 간단하며, DevOps 및 CI/CD 파이프라인에서 매우 효과적으로 사용됩니다. • 클라우드와의 친화성이 높아 다양한 클라우드 환경에 유연하게 통합됩니다.

Docker가 해킹당할 경우

Docker 컨테이너가 해킹당하면, 호스트 시스템에 영향을 미칠 수 있습니다. 컨테이너는 리눅스 커널의 네임스페이스와 cgroups 같은 기능을 이용해 격리되어 있지만, 완벽하게 독립된 환경은 아닙니다. 특히 다음과 같은 경우 호스트에 심각한 영향을 줄 수 있습니다.

컨테이너 탈출(Container Escape)

공격자가 컨테이너 내부에서 취약점을 이용해 호스트 시스템의 리소스나 파일 시스템에 접근하는 ‘컨테이너 탈출’ 공격이 발생할 수 있습니다. 특히 Privileged 모드로 실행된 컨테이너는 호스트의 거의 모든 권한을 가질 수 있기 때문에, 이 경우 컨테이너를 해킹하면 호스트 전체가 위험해질 수 있습니다.

공유 자원을 통한 공격

Docker 소켓 파일(/var/run/docker.sock) 등 호스트와 공유된 자원을 공격자가 악용하면, 호스트에서 새로운 컨테이너를 생성하거나 시스템을 제어할 수 있습니다.

자원 고갈 공격

컨테이너가 무제한으로 자원을 사용할 수 있도록 설정되어 있다면, 공격자가 컨테이너를 통해 CPU, 메모리 등 호스트 자원을 고갈시켜 서비스 전체에 영향을 줄 수 있습니다.

호스트 OS 및 네트워크 취약점

컨테이너가 사용하는 호스트 운영체제 자체의 취약점이나 네트워크 설정이 잘못된 경우, 컨테이너를 통한 호스트 침투가 가능해집니다.

결론적으로, 컨테이너 격리 기술이 보안을 강화해주긴 하지만, 잘못된 설정이나 취약점이 존재할 경우 컨테이너 해킹이 곧 호스트 침해로 이어질 수 있습니다. 따라서 보안 권한 최소화, 최신 패치 적용, 불필요한 자원 공유 금지 등 보안 수칙을 반드시 지켜야 합니다.

참조 1. https://khj93.tistory.com/entry/Docker-Docker-개념 2. https://aws.amazon.com/ko/docker/ 3. https://velog.io/@gyumin_2/Docker%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80%EA%B0%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EC%A7%80-%EB%AA%A8%EB%A5%B4%EA%B2%A0%EB%8B%A4 4. https://www.ibm.com/kr-ko/topics/docker 5. https://www.redhat.com/ko/topics/containers/what-is-docker 6. https://kid-dev.tistory.com/16 7. https://seosh817.tistory.com/345 8. https://www.oracle.com/kr/cloud/cloud-native/container-registry/what-is-docker/ 9. https://velog.io/@hyeinisfree/Linux%EC%BB%A4%EB%84%90-%EA%B8%B0%EB%8A%A5-%EC%A0%95%EB%A6%AC 10. https://www.techtarget.com/searchitoperations/definition/cgroups 11. https://github.com/torvalds/linux 12. https://docs.docker.com/storage/storagedriver/overlayfs-driver/ 13. https://hyunsikcho.github.io/posts/why-docker-faster-than-vm/ 14. https://velog.io/@sirius96/Docker%EB%8A%94-%EC%99%9C-%EA%B0%80%EC%83%81%ED%99%94-%EB%B3%B4%EB%8B%A4-%EC%9E%90%EC%9B%90-%ED%9A%A8%EC%9C%A8%EC%84%B1%EC%9D%B4-%EB%86%92%EC%9D%84%EA%B9%8C 15. https://engineering.linecorp.com/ko/blog/docker-container-performance/ 16. https://sangminem.tistory.com/173 17. https://brunch.co.kr/@goodcode/95