컨테이너 · 도커
Container / Docker
컨테이너란?
- 프로그램+환경을 하나로 포장
- '어디서나 똑같이' 실행
- 도커가 대표 도구
컨테이너를 쓰기 시작하면 가장 먼저 바뀌는 것은 서버 세팅 문서가 코드로 바뀐다는 점입니다. 예전에는 '자바 11 설치, 환경변수는 이렇게, 라이브러리는 몇 버전' 같은 설치 안내서를 위키에 적어두고 사람이 손으로 따라 했습니다. 컨테이너에서는 그 절차를 Dockerfile이라는 파일 한 장에 적고, 그 파일이 그대로 실행됩니다. 사람의 기억과 손버릇이 끼어들 여지가 사라지는 것이 실제 변화입니다.
가상머신(VM)과 혼동하기 쉽지만 층위가 다릅니다. VM은 운영체제를 통째로 하나 더 띄워 이미지가 보통 수 GB, 기동에 분 단위가 걸립니다. 반면 컨테이너는 호스트의 커널을 공유해 수십~수백 MB에 기동은 대개 초 단위입니다. 용어도 갈라 써야 합니다. 설계도에 해당하는 것이 이미지, 그 이미지를 실제로 띄운 것이 컨테이너, 이미지를 보관하고 나눠주는 창고가 레지스트리입니다. 컨테이너가 수십 개로 늘어나 배치와 복구를 자동으로 맡길 단계가 되면 그 지휘자 역할이 쿠버네티스입니다.
모든 조직에 당장 필요한 것은 아닙니다. 서버 한 대에 서비스 하나를 올려두고 분기에 한 번 고치는 정도라면 도입 비용이 더 큽니다. 배포가 잦거나, 같은 제품을 여러 고객사 환경에 설치하거나, 개발자가 늘어 환경 맞추기가 반복될 때 효과가 분명해집니다. 판단 기준은 기술 취향이 아니라 '같은 것을 몇 군데에 똑같이 올려야 하는가'입니다.
가장 자주 깨지는 지점은 컨테이너 안에 데이터를 그냥 두는 것입니다. 컨테이너는 껐다 켜면 내부 변경분이 사라지는 구조라, 볼륨을 붙이지 않고 DB나 업로드 파일을 안에 넣어두면 재배포 한 번에 통째로 날아갑니다. 이미지 태그를 'latest'로만 쓰는 습관도 위험합니다. 어제 내려받은 latest와 오늘 내려받은 latest가 다른 것이 되어, '어디서나 똑같이'라는 장점을 스스로 버리는 셈이 됩니다. 버전을 숫자로 고정해 두지 않으면 장애가 나도 어떤 코드가 돌고 있었는지 되짚지 못합니다.
| 구분 | 컨테이너 | 가상머신(VM) |
|---|---|---|
| 무게 | 가볍다(OS 공유) | 무겁다(OS 통째) |
| 속도 | 빠른 실행 | 느린 부팅 |
| 격리 | 프로세스 수준 | 완전 격리 |
컨테이너 개념은 리눅스에 오래 있었지만, 2013년 등장한 도커(Docker, 솔로몬 하이크스)가 이를 쉽게 만들어 대중화하며 현대 배포의 표준 기술이 됐습니다.
가상의 사례로 살펴보겠습니다. 임직원 90명 규모의 물류 소프트웨어 회사 A사는 화주사 12곳에 같은 시스템을 설치형으로 납품해 왔습니다. 고객사마다 서버 OS와 라이브러리 버전이 달라 설치에 평균 5일, 환경 문제로 생기는 장애 문의만 월 11건이었습니다. 신규 개발자가 들어오면 개발 환경을 맞추는 데만 사흘이 걸렸습니다.
- 개발팀 김 과장이 14쪽짜리 설치 안내서를 Dockerfile 한 장으로 옮기며 '이 문서를 사람 말고 기계가 읽게 하자'고 제안했습니다. 첫 이미지 용량은 1.8GB였습니다.
- 인프라 담당 박 차장이 베이스 이미지를 경량판으로 바꾸고 빌드를 두 단계로 나눠 380MB까지 줄였습니다. 고객사 회선에서 내려받는 시간이 40분에서 7분이 됐습니다.
- 사내 레지스트리를 두고 태그를 v2.4.1처럼 고정해 올렸습니다. '저희 쪽은 지금 어느 버전인가요'라는 고객 문의에 태그만 확인하면 즉시 답할 수 있게 됐습니다.
- DB와 업로드 파일은 컨테이너 밖 볼륨으로 빼냈습니다. 사내 테스트에서 재배포 한 번에 이틀치 운송 기록이 사라진 일을 겪은 뒤, 팀 규칙으로 못 박은 원칙입니다.
- 4개월 뒤 고객사 설치 기간은 평균 5일에서 반나절로, 환경 차이로 인한 장애 문의는 월 11건에서 1건으로 줄었습니다. 신입 개발자 환경 세팅도 사흘에서 2시간이 됐습니다.