“리눅스 가상머신 깔고 환경 똑같이 만들어 봐”
입사 3개월 차, 사무실 분위기가 심상치 않았다. 유일한 사수님은 다른 프로젝트로 발령이 확정되어 인수인계는커녕 자기 짐 싸기 바빴고, 팀장님은 개발 실무에서 손 뗀 지 오래라 최신 기술 트렌드와는 거리가 먼 분이었다.
어느 날 팀장님이 나를 불렀다. “OO씨, 사수 떠나면 서버 관리할 사람 OO씨밖에 없어. 서버 터져도 혼자 복구할 수 있어야 해. 지금 쓰는 개발 노트북(윈도우)에 가상머신(VM)으로 리눅스 깔고, 운영 서버랑 똑같은 환경 구축해 봐.”
그날부터 나의 삽질이 시작되었다. VMware를 깔고, 우분투 ISO 파일을 받아 설치하는 데만 반나절이 걸렸다. 회사 위키를 뒤져가며 Java, Node.js, PostgreSQL을 설치했다. “최신이 좋겠지?”라며 자바 17을 깔았는데, 알고 보니 레거시 코드는 자바 8이라 빌드조차 안 돼서 지우고 다시 깔기도 했다. 코드 한 줄 수정할 때마다 mvn build 하고 jar 파일을 VM으로 옮겨서 실행하는 과정은 고통 그 자체였다.
그러다 문득 의문이 생겼다. “잠깐만, 저번에 운영 서버 배포할 때는 그냥 docker service update 명령어 한 줄 치니까 끝나던데?”
내 로컬 가상머신은 이렇게 무겁고 설정할 게 산더미인데, 도대체 운영 서버의 그 ‘도커(Docker)’란 녀석은 뭐길래 명령어 한 방에 업데이트가 되는 걸까?

무거운 해결책: 가상머신 (Virtual Machine)
팀장님이 시킨 방식, 즉 윈도우 위에 리눅스를 또 설치하는 방식이 바로 ‘가상머신(VM)’이다. 이건 물리적인 컴퓨터(Host) 위에 ‘가상의 집(Guest OS)’을 통째로 짓는 것과 같다.
- 방식: 컴퓨터 한 대에 OS를 여러 개 돌린다. (윈도우 위에 리눅스, 그 위에 또 리눅스…)
- 문제: 집을 지으려면 기둥, 벽, 화장실(커널)까지 다 새로 지어야 한다.
- 앱 하나 돌리려고 수 기가바이트짜리 OS를 통째로 설치해야 한다.
- 부팅하는 데 한 세월이다. (내 노트북이 느려진 이유다)
- 자원을 비효율적으로 쓴다. (아무것도 안 해도 OS 유지하느라 메모리를 먹는다)
결국 VM은 ‘환경 격리’는 확실하지만, 개발용이나 배포용으로 매번 주고받기엔 너무 무겁고 느렸다.
가벼운 혁명: 도커 (Docker)
그래서 등장한 것이 ‘도커(Docker)’, 즉 ‘컨테이너(Container)’ 기술이다. 도커는 VM처럼 집을 통째로 짓지 않는다. 대신 ‘텐트’를 친다.
- 방식: 이미 지어진 집(Host OS – 리눅스)의 마당(커널)을 공유한다. 격리된 천막(Container)만 친다.
- 특징:
- OS(커널)를 공유한다: 텐트 안에는 무거운 OS가 없다. 그냥 내 앱과 라이브러리만 들어있다.
- 가볍다: 용량이 메가바이트(MB) 단위다.
- 빠르다: 부팅? 그런 거 없다. 그냥 프로세스 하나 켜는 속도(밀리초)로 켜진다.
내가 운영 서버에서 쳤던 update 명령어는, 무거운 OS를 새로 까는 게 아니라 “기존 텐트를 걷고, 새 버전의 코드가 담긴 텐트를 다시 친 것”뿐이었다. 그러니 순식간에 끝날 수밖에.

[Code Verification] 도커는 정말로 가벼울까?
말로만 가볍다고 하지 말고, 실제로 확인해보자. 리눅스(Ubuntu) 환경을 실행한다고 했을 때, VM과 도커의 차이는 극명하다.
- VM으로 우분투 실행: ISO 파일 다운로드(2GB) -> 설치(20분) -> 부팅(1분).
- 도커로 우분투 실행:
# 도커 명령어로 우분투 실행 (이미지 없으면 다운로드 포함)
$ docker run -it ubuntu:latest /bin/bash
결과:
- 다운로드: 약 30MB (우분투의 핵심만 추린 껍데기 이미지)
- 실행 시간: 약 0.5초
엔터를 치자마자 나는 우분투 환경 안에 들어와 있다. 이것이 가능한 이유는, 도커 컨테이너가 진짜 OS가 아니기 때문이다. “호스트 OS(내 컴퓨터)의 커널을 빌려 쓰면서, 마치 별도의 OS인 척하는 격리된 공간”일 뿐이다.
실무 조언: 도커를 써야 하는 진짜 이유
실무에서 도커를 도입하고 나서 내 삶은 완전히 달라졌다.
- “환경 세팅하세요”가 사라졌다: 신입 사원이 오면 예전에는 “자바 설치하고, 환경 변수 잡고, DB 깔고…”라며 A4 10장짜리 문서를 줬다. 지금은 그냥 말한다. “도커 까시고,
docker-compose up치세요.” - 버전 지옥 탈출: A 프로젝트는 자바 8, B 프로젝트는 자바 17을 써야 한다면? 로컬에 둘 다 깔면 충돌 나고 꼬인다. 도커를 쓰면 A 컨테이너엔 자바 8, B 컨테이너엔 자바 17을 담아서 동시에 띄워도 아무 문제가 없다. 완벽하게 ‘격리(Isolation)’되기 때문이다.
마치며: 실행 파일이 아니라 ‘환경’을 배달한다
도커의 등장으로 개발의 패러다임이 바뀌었다. 우리는 더 이상 소스 코드(.java)만 서버에 보내지 않는다. 그 코드가 돌아가는 OS 설정, 라이브러리, 환경 변수까지 통째로 ‘이미지(Image)’로 굳혀서 보낸다.
그렇다면 이 마법 같은 ‘도커 이미지’는 도대체 어떻게 만들어질까? 그냥 압축 파일일까? 놀랍게도 도커 이미지는 ‘케이크’처럼 여러 겹의 레이어(Layer)로 쌓여 있다고 한다.
다음 시간에는 도커의 효율성의 비밀, ‘이미지와 레이어 구조’에 대해 파헤쳐 보자.
좋은,,,내용… 잘 ,,봤읍니다 ^^…
읽어주셔서 감사합니다 🙂