Container의 격리된 환경의 의미

Jisu·2025년 7월 30일

개요

컨테이너 개념을 처음 공부할 때, 추상적으로 들리는 단어들이 너무 많았다. 그 중 대표적인것이 isolation! 즉, 호스트의 다른 프로세스에 영향을 받지 않고 격리되서 실행된다는 것이었다. 도대체 이게 무슨 의미였는지.. 하지만 튜토리얼 자체는 잘 되어있어서 어떤 식으로 도커 빌드를하고 사용하는지 깨우치는데는 어렵지않았다.

SW 엔지니어로서 현업에서 여러 업무를 하고 공부하면서 점차 그 의미를 알게 되었다. 이번 기회에는 container에 대해서 처음 공부할 때 어려운 사람들에게 조금 이나마 도움이 되는 글을 작성해보고자한다!


컨테이너의 정의

Docker의 공식 문서에서는 컨테이너를 다음과 같이 정의하고 있다.

A container is a sandboxed process running on a host machine that is isolated from all other processes running on that host machine

여기서 말하는 "격리(Isolation)"란 구체적으로 어떤 측면들을 의미하는지 알아보자.

Process의 특성

우리가 macOS에서 Activity Monitor를 열어보거나 터미널에서 ps aux 명령어를 치면 수많은 프로세스들이 동시에 실행되고 있는 것을 볼 수 있다. Chrome, Slack, VS Code, Spotify... 이 프로세스들은 모두 같은 Mac의 자원(CPU, 메모리, 네트워크, 파일시스템 등)을 공유하면서 실행된다.

예를 들어, Mac에서 실행 중인 MySQL 프로세스와 Nginx 프로세스가 있다고 해보자. 이 2개의 프로세스들은 같은 /usr/local, /Applications 등의 파일시스템을 바라보고 있고.. 같은 Wi-Fi 네트워크를 사용한다.

하지만 컨테이너로 실행되는 프로세스는 다르다! 컨테이너 안의 프로세스는 마치 자신만의 독립적인 운영체제 환경에서 실행되는 것처럼 동작한다.
이게 바로 "격리"의 핵심이다. 그럼 구체적으로 어떤 부분들이 격리되는 걸까?


1. File System 격리

먼저 nginx 컨테이너를 실행해보자.

docker run -d --name my-nginx nginx

이제 해당 컨테이너의 bash에 들어가보자.

docker exec -it my-nginx bash

컨테이너 안에서 ls 명령어를 쳐보면 호스트 Mac의 파일시스템과는 완전히 다른 구조를 볼 수 있다! /Applications, /Users 같은 macOS 특유의 디렉토리는 없고, 대신 Linux 계열의 /etc, /var, /usr 등만 보인다.

이제 ip 명령어를 써보자.

ip addr show

"command not found"가 뜬다! 왜냐하면 이 컨테이너에는 해당 패키지가 설치되어 있지 않기 때문이다. 호스트 Mac에서는 분명 네트워크 관련 명령어들이 잘 동작하는데 말이다.
이게 바로 파일시스템 격리다. 컨테이너는 자신만의 독립적인 파일시스템을 가지고 있어서, 호스트에 설치된 프로그램이나 파일들에 접근할 수 없다.


2. 네트워크 격리

이번엔 네트워크 도구가 포함된 컨테이너를 실행해보자.

docker run -d --name netshoot nicolaka/netshoot sleep infinity
docker exec -it netshoot bash
ip addr show

여기서 흥미로운 걸 발견할 수 있다! 루프백 인터페이스가 보이는데, 이게 호스트의 것과는 다르다는 점이다.

먼저 루프백 인터페이스가 뭔지 알아보자. 이건 자기 자신에게 네트워크 요청을 보내는 가상의 네트워크 인터페이스다. 실제 네트워크 장비가 아닌 운영체제가 내부적으로 구현한 인터페이스로, 주로 이런 용도로 사용된다.

로컬 테스트: 외부 네트워크 없이도 클라이언트-서버 간 통신 테스트
자기 자신의 서비스 호출: 로컬에서 실행 중인 웹 서버나 API에 요청
시스템 상태 확인: ping으로 호스트가 살아있는지 확인

macOS에서 네트워크 인터페이스를 확인해보자.

ifconfig lo0

이제 다시 컨테이너 안에서 확인해보면, 별도의 루프백 인터페이스가 있다는 걸 알 수 있다!

원래 일반적인 프로세스를 실행하면 호스트의 Network Interface Card를 통신에 사용한다. 하지만 컨테이너는 자신만의 가상 NIC를 가지게 된다. 이것이 바로 네트워크 격리의 대표적인 예시다!


컨테이너 격리의 의미

지금까지 파일시스템과 네트워크 격리를 직접 확인해봤는데, 사실 컨테이너의 격리는 이것만이 아니다! 컨테이너는 다음과 같은 다양한 측면에서 격리를 제공한다.

파일시스템 격리: 각 컨테이너는 자체 루트 파일시스템을 가짐
프로세스 격리: 컨테이너 내부에서는 자신의 프로세스만 보임
네트워크 격리: 독립적인 네트워크 인터페이스와 IP 주소
사용자 격리: 컨테이너 내부의 root와 호스트의 root는 다름
리소스 격리: CPU, 메모리 등의 사용량 제한

좀 더 실제적인 예를 들어보자

  1. 라이브러리 충돌 방지: 프로젝트 A는 library 3.2가 필요하고, 프로젝트 B는 library 4.0이 필요하다면? 컨테이너 없이는 가상환경을 복잡하게 관리해야 하지만, 컨테이너를 사용하면 이미지 빌드 자체가 독립적인 파일시스템을 만들기 때문에 균일한 버전으로 실행할 수 있다.
  1. 리소스 관리: 특정 서비스가 메모리를 과도하게 사용해서 시스템 전체가 느려지는 일을 방지할 수 있다. 각 컨테이너마다 사용할 수 있는 CPU, 메모리 한계를 설정할 수 있기 때문이다.

Reference

Docker Docs

profile
기술 공유를 즐기는 Engineer 장지수입니다!

0개의 댓글