2020년 1월, Docker를 처음 공부하며 쓴 글이다. 2026년 기준으로 달라진 점은 다음과 같다.
- Docker Compose v1(
docker-compose명령)은 2023년 중반에 지원이 끝났다. 지금은 Docker에 포함된 Compose v2를docker compose(하이픈 없음)로 쓴다.- Compose 파일의 최상위
version:항목은 더 이상 필요 없다.
목차
Docker를 알게 된 계기
유튜브 노마드 코더의 Docker가 왜 좋은지 5분 안에 설명해줌 영상으로 Docker를 처음 접했다.
Docker를 공부하게 된 이유
조금 불편한 것만 참으면 Docker를 몰라도 개발은 할 수 있었다. 그래도 아래와 같은 이유로 공부를 시작했다.
- 개발 블로그와 유튜브에서 Docker 이야기가 자주 보였다. 참고로 Docker는 2013년 3월에 오픈소스로 공개됐다.
- Node.js 버전은 nvm으로 관리할 수 있지만, 그때그때 버전을 바꾸지 않고 프로젝트마다 필요한 Node.js 환경을 따로 만들 수는 없을까 하는 생각이 들었다.
- XAMPP, WAMP, MAMP 같은 통합 패키지는 최신 버전만 기본으로 제공한다. 운영 서버와 같은 버전으로 개발 환경을 맞추는 데 생각보다 시간이 많이 들었다. 내 개발 환경을 다른 사람에게 그대로 전달하는 방법으로도 좋아 보였다.
- 다들 좋다고 하니 궁금했고, 나만 안 쓰는 건가 싶어 조금 불안하기도 했다.
개념만 이해하는 데서 그치지 않고, 필요할 때 바로 쓸 수 있는 수준이 되고 싶었다. ActiveLAMP의 Building a Local Dev Environment with Docker가 왜 Docker를 써야 하는지, 쓰면 무엇이 좋은지를 잘 설명한다.
Docker란
간단히 정리하면 다음과 같다.
- 애플리케이션과 그 실행 환경을 컨테이너 단위로 묶어서, 블록처럼 조합해 운영할 수 있게 해 주는 오픈소스 플랫폼이다.
- 여러 서비스를 컨테이너로 나눠 조합하는 마이크로서비스 구조를 만들기 쉽다.
- 개발 환경과 배포 환경의 차이 때문에 생기는 문제를 줄여서, 안정적으로 배포할 수 있게 돕는다.
- 자세한 내용은 위키백과: 도커 (소프트웨어)를 참고하면 된다.
처음 써 보고 느낀 점은 이렇다.
- 구조가 간결하면서도 신기했다. 서비스마다 세부 설정은 복잡할 수 있어도, 서버와 서비스를 이렇게 쉽게 조합할 수 있다는 점이 놀라웠다. 앱 스토어에서 앱을 골라 설치하는 느낌에 가까웠다.
- 운영 중인 서비스에 필요한 기능을 마이크로서비스로 쉽게 붙일 수 있겠다는 생각이 들었다.
- 서버 한 대에서 vhost로 여러 서비스를 운영하고 있었다. 서비스마다 컨테이너로 감싸고 프록시 서버 뒤에서 관리하면, 서비스 하나 때문에 서버 전체를 재부팅하는 일이 없어지겠다고 생각했다.
컨테이너와 가상 머신(VM)의 차이
VM과 Docker의 컨테이너는 비슷해 보이는데 무엇이 다를까? 써 보니 인터넷 속도만 느리지 않다면 컨테이너 쪽이 훨씬 매력적이었다.
pm2로 Node.js 프로세스를 관리하는 것과 비슷하지만, OS·DB·Node.js 같은 서비스를 이미지로 만들어 두고 스위치를 켜고 끄듯 실행하고 멈출 수 있다는 점이 놀라웠다. 같은 환경을 다른 사람과 공유할 수 있다는 점은 VM과 같다. 하지만 VM은 이미지 전체를 주고받아야 하는 반면, Docker는 필요한 구성을 정의한 파일만 공유하면 Docker가 알아서 받아서 구성해 준다.
자세한 차이는 Docker 공식 사이트 설명에 잘 나와 있다.
Docker 실행의 기본
다른 자료가 잘 정리되어 있어서, 여기서는 기본 개념만 짚는다.
- 이미지는
Dockerfile로, 여러 컨테이너의 구성은compose.yaml(예전 이름은docker-compose.yml)로 정의한다. docker build로 Dockerfile에서 이미지를 만들고,docker run으로 그 이미지에서 컨테이너를 만들어 실행한다.- Docker Compose는 여러 컨테이너를 한 번에 실행하고 종료하는 도구다.
최소 예제
Node.js 앱 하나를 컨테이너로 실행하는 예다.
# Dockerfile
FROM node:22-alpine
WORKDIR /app
COPY . .
RUN npm ci
CMD ["node", "server.js"]
docker build -t my-app .
docker run -p 3000:3000 my-app
같은 앱을 MySQL과 함께 Compose로 실행하면 다음과 같다.
# compose.yaml
services:
app:
build: .
ports:
- "3000:3000"
db:
image: mysql:8.4
environment:
MYSQL_ROOT_PASSWORD: example
docker compose up -d # 실행
docker compose down # 종료
자세한 설명은 withj-kr의 Docker 강의를 추천한다. 여러 강좌와 블로그를 봤지만 가장 인상적이었고, 내가 궁금했던 것을 명확하게 설명하고 있었다.
정리
막연하게 알던 Docker의 개념과 쓰임을 정리할 수 있었다. 앞으로 새 개발 환경을 만들 때는 당연히 쓰게 될 도구라고 생각한다. 여러 서비스를 이렇게 쉽게 설치하고 실행할 수 있다는 점에 놀랐고, 백엔드 환경 구축의 장벽이 얼마나 낮아지고 있는지 느낄 수 있었다.