시작하기
노마드 코더의 도커가 좋은 이유 영상의 내용을 재구성한 글입니다. 영어지만 자막을 제공하는 Red Hat의 왜 컨테이너인가? 영상도 있습니다.
Docker(도커)는 컨테이너 기반의 오픈 소스 가상화 플랫폼입니다. 컨테이너 기반이라는 말이 무엇일까요? 우리는 보통 컨테이너를 어떤 물체를 격리하는 공간으로 생각합니다. IT에서 의미하는 Container(컨테이너)는 격리된 공간에서 프로세스가 동작하는 가상화 기술입니다. 또는 소프트웨어와 그것에 종속된 모든 것을 포함하는 가볍고 휴대성이 높은 실행 가능한 이미지를 의미합니다.
컨테이너는 Environment Disparity(환경 차이)를 해결합니다. 다음 몇 가지 예시를 살펴보면 이해할 수 있습니다.
예시 1
당신은 불금 저녁에 개발을 하고 있습니다. 그리고 코드를 서버에 올리기만 하면 되는 상황에 있습니다. 일은 거의 다 끝났고 저녁에 친구들이랑 삼겹살만 먹으면 되는데, 이상하게 코드가 서버에만 올리면 작동을 하지 않는 겁니다. 이유인즉 로컬은 윈도우, 서버는 리눅스였습니다. 운영 체제가 다르기 때문에 서버에 올리기 전까지는 알 수도 없고 해결할 수도 없는 오류입니다. 안타깝지만 당신은 - 오류를 해결할 때까지 - 집에 있어야 합니다.
필자도 위와 같은 문제를 경험한 적이 있습니다. 그래서 환경 차이로 인한 오류를 방지하려면 최대한 서버 환경과 동일하게 로컬 환경을 구성할 수밖에 없었습니다.
예시 2
당신은 최신 Node.js 버전으로 개발을 하고 있고, 서버는 한참이나 이전 버전입니다. 개발을 마치고 서버에 올리는 순간! 역시나 서버에만 올리면 모듈 설치에 실패하는 겁니다. 노드 버전 차이의 문제를 직감하고 허겁지겁 로컬에 있는 노드 버전을 낮췄습니다. 서버가 하나 더 있네요. 맙소사! 여기는 노드를 설치하지 않았습니다. 허겁지겁 최신 버전으로 설치하고 올리는 순간! 이번에는 최신 버전이라서 오류가 발생합니다.
개발자는 코드만 열심히 작성하면 된다고 생각한 필자는 버전의 늪에 빠지는 순간 하루 종일 괴로운 숫자 맞추기 놀이를 하고 있었습니다. 💀
도커가 환경 차이를 해결하는 방법은 간단합니다. ① 도커를 로컬과 서버에 설치합니다. ② Dockerfile 이름으로 파일을 생성하고 그 안에 구현하고 싶은 환경을 정의합니다. (Node.js, Java, Go, Python, Git 등) ③ 도커는 파일의 내용을 읽고 필요한 모듈을 다운로드합니다. ④ 도커는 당신이 설정한 환경과 비슷한 가상 컨테이너를 만들어 냅니다. ⑤ 로컬과 서버는 동일한 환경이 됩니다.
도커 컨테이너들은 독립적이기 때문에 서버 하나에 컨테이너 여러 개를 가질 수 있습니다. (Node.js 컨테이너, Java 컨테이너, Go 컨테이너 등) 서버에 환경을 설정하는 것이 아닌 컨테이너에 설정하는 것이죠.
예시 3
당신이 만든 앱이 입소문을 타기 시작합니다. 트래픽을 감당할 수 없을 정도로 접속자가 많아져서 서버를 몇 개 더 만들었습니다. 트래픽에 의한 오류를 발견해서 수정하고 서버에 올려야 하는데, 여러 개라서 시간이 걸리네요. 잠깐, 방금 몇 번 서버에 반영했는지 정신줄을 놓치고 말았습니다.
도커를 사용하면 간단합니다. 하나의 서버에 원하는 수만큼 컨테이너를 복제하면 됩니다. 트래픽이 줄어들면? 컨테이너 수를 줄이면 됩니다. 매번 새로운 서비스를 만들 때마다 새로운 서버를 생성할 필요가 없습니다. 당신이 원할 때마다 도커로 새로운 환경을 생성할 수 있습니다.
정리
도커는 격리된 가상화 공간을 만듭니다. ① 원하는 개발 환경을 Dockerfile에 저장하면 도커는 당신이 원하는 환경을 만듭니다. ② 컨테이너는 독립적으로 작용하기 때문에 모듈식으로 관리할 수 있습니다.