6부 클라우드와 배포
22장 가상 머신과 컨테이너를 구분하는 기준
가상 머신은 가상화된 하드웨어 위에 별도의 운영체제를 실행하는 방식으로 이해할 수 있다. 컨테이너는 일반적으로 호스트 커널을 공유하면서 프로세스와 자원을 격리한다. 실제 제품은 가상 머신 안에 컨테이너를 실행하는 등 여러 층을 결합하기도 한다. 둘 중 하나만 선택해야 하는 경쟁 관계라기보다 서로 다른 경계를 만드는 도구다.
컨테이너 이미지는 프로그램과 실행에 필요한 파일을 묶는 데 유용하다. 같은 이미지를 시험과 배포에 사용하면 환경 차이를 줄일 수 있다. 그러나 호스트의 커널과 CPU 구조, 외부 설정, 연결된 데이터가 달라지면 결과도 달라질 수 있다. 이미지를 같게 했다는 사실만으로 모든 환경이 동일해지는 것은 아니다.
이미지는 실행 상태가 아니다
이미지는 실행을 위한 바탕이고 컨테이너는 그것을 사용해 실행되는 인스턴스다. 같은 이미지에서 여러 컨테이너를 만들 수 있다. 컨테이너 안에서 바꾼 파일이 이미지 자체를 수정하는 것은 아니다. 배포를 재현하려면 실행 중인 컨테이너를 손으로 고쳐 기억에 의존하기보다 이미지 제작 과정과 설정을 관리해야 한다.
이미지 태그는 사람이 쓰기 편한 이름이지만 같은 태그가 나중에 다른 내용을 가리킬 수 있다. 재현성과 공급망 검증이 중요하면 구체적인 버전과 다이제스트를 관리한다. 그렇다고 오래된 이미지를 영원히 고정하면 보안 업데이트를 놓칠 수 있다. 검증된 변경을 일정한 절차로 반영하는 것이 목표다. 불변성과 업데이트는 서로 배타적인 가치가 아니다.
데이터가 남아야 하는 곳
컨테이너의 쓰기 계층에 중요한 데이터를 두면 컨테이너 교체와 삭제에 따라 잃을 수 있다. 볼륨이나 외부 저장소를 사용해 수명을 분리한다. 하지만 볼륨을 썼다고 백업이 자동으로 생기는 것은 아니다. 연결한 호스트 디렉터리의 권한과 경로도 확인해야 한다. 잘못된 마운트는 원하지 않는 파일을 컨테이너에 노출하거나 기존 내용을 가려 보이게 할 수 있다.
개발 환경에서 프로젝트 전체를 마운트하는 방식은 편리하지만 운영에서는 필요한 경로만 읽기 또는 쓰기 권한으로 연결하는 편이 안전하다. 비밀키와 클라우드 자격 증명이 있는 홈 디렉터리를 통째로 연결하지 않는다. 호스트의 민감한 소켓을 컨테이너에 제공하는 일도 강한 권한을 부여할 수 있다. 격리는 설정과 실행 권한의 영향을 받는다.
포트를 보여 주는 것과 공개하는 것
컨테이너 이미지에 포트를 설명해 둔 것과 호스트에서 외부로 포트를 공개하는 것은 다르다. Docker의 포트 매핑에서 바인딩 주소를 생략하면 예상보다 넓게 열릴 수 있으므로 현재 버전의 동작을 확인해야 한다. 로컬 실습은 127.0.0.1에만 바인딩하는 방식으로 범위를 제한한다. 오래된 엔진의 알려진 동작 차이도 있으므로 최신 보안 업데이트를 유지한다.
아래 명령은 Docker가 이미 설치된 허가된 시험 환경에서 사용할 구조 예다. 이미지를 내려받을 수 있으며 실행 중 로컬 포트 하나를 사용한다. 이미지의 출처와 버전을 확인한 후에만 실행한다. 이 책에서는 별도의 다운로드를 요구하지 않는 Python 실습도 뒤에서 제공한다. 운영 서버에서 따라 하는 명령이 아니다.
# Local demonstration only; inspect the image before running.
# Replace APPROVED_IMAGE with a reviewed image reference.
# The placeholder is intentional and is not a runnable image name.
docker run --rm --name network-book-demo \
--publish 127.0.0.1:8080:80 \
APPROVED_IMAGE
# In a separate terminal, stop only this named test container.
docker stop network-book-demo
가벼움이 안전의 동의어는 아니다
컨테이너가 작고 빠르게 시작된다고 보안 문제가 사라지는 것은 아니다. 취약한 라이브러리와 과도한 권한, 잘못된 비밀 관리가 그대로 들어갈 수 있다. 가능한 경우 비특권 사용자로 실행하고 필요한 기능만 허용하며 자원 한도를 정한다. 모든 보안 옵션을 무작정 켜는 대신 응용 프로그램이 실제로 필요한 권한을 확인한다.
컨테이너 로그를 표준 출력으로 모으는 방식은 수집을 단순하게 하지만 보존과 크기 제한은 별도로 필요하다. 로그가 호스트 디스크를 채우거나 민감한 값을 중앙 수집기로 전송할 수 있다. 컨테이너를 지우면 모든 흔적도 사라진다고 생각하지 말자. 이미지 저장소와 빌드 로그, 중앙 로그에는 다른 수명의 데이터가 남는다.
가상 머신과 컨테이너 중 무엇이 맞는지는 격리 요구, 운영 능력, 배포 속도, 장치 접근, 비용을 함께 보고 결정한다. 프로그램 하나를 작은 서버에서 운영하는데 복잡한 컨테이너 플랫폼이 반드시 필요한 것은 아니다. 반대로 여러 환경을 일관되게 관리해야 한다면 이미지 기반 배포의 가치가 크다. 도구의 인기보다 자신이 해결하려는 불편을 먼저 적어 보자.
표준과 공식 참고 자료
관련 기술의 원문 표준과 제작자 문서입니다. 번역 인용문이 아닌 새로 작성한 해설과 실습을 수록했습니다. 자료 확인: 2026-09-05.