본문으로 건너뛰기
Kabkee.github.io
뒤로 가기

Docker와 Docker Compose 입문: 처음 공부하며 정리한 개념

2020년 1월, Docker를 처음 공부하며 쓴 글이다. 2026년 기준으로 달라진 점은 다음과 같다.

  • Docker Compose v1(docker-compose 명령)은 2023년 중반에 지원이 끝났다. 지금은 Docker에 포함된 Compose v2를 docker compose(하이픈 없음)로 쓴다.
  • Compose 파일의 최상위 version: 항목은 더 이상 필요 없다.

목차

목차 펼치기

Docker를 알게 된 계기

유튜브 노마드 코더의 Docker가 왜 좋은지 5분 안에 설명해줌 영상으로 Docker를 처음 접했다.

Docker를 공부하게 된 이유

조금 불편한 것만 참으면 Docker를 몰라도 개발은 할 수 있었다. 그래도 아래와 같은 이유로 공부를 시작했다.

개념만 이해하는 데서 그치지 않고, 필요할 때 바로 쓸 수 있는 수준이 되고 싶었다. ActiveLAMP의 Building a Local Dev Environment with Docker가 왜 Docker를 써야 하는지, 쓰면 무엇이 좋은지를 잘 설명한다.

Docker란

간단히 정리하면 다음과 같다.

처음 써 보고 느낀 점은 이렇다.

컨테이너와 가상 머신(VM)의 차이

VM과 Docker의 컨테이너는 비슷해 보이는데 무엇이 다를까? 써 보니 인터넷 속도만 느리지 않다면 컨테이너 쪽이 훨씬 매력적이었다.

pm2로 Node.js 프로세스를 관리하는 것과 비슷하지만, OS·DB·Node.js 같은 서비스를 이미지로 만들어 두고 스위치를 켜고 끄듯 실행하고 멈출 수 있다는 점이 놀라웠다. 같은 환경을 다른 사람과 공유할 수 있다는 점은 VM과 같다. 하지만 VM은 이미지 전체를 주고받아야 하는 반면, Docker는 필요한 구성을 정의한 파일만 공유하면 Docker가 알아서 받아서 구성해 준다.

자세한 차이는 Docker 공식 사이트 설명에 잘 나와 있다.

Docker 실행의 기본

다른 자료가 잘 정리되어 있어서, 여기서는 기본 개념만 짚는다.

  1. 이미지는 Dockerfile 로, 여러 컨테이너의 구성은 compose.yaml(예전 이름은 docker-compose.yml)로 정의한다.
  2. docker build 로 Dockerfile에서 이미지를 만들고, docker run 으로 그 이미지에서 컨테이너를 만들어 실행한다.
  3. 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의 개념과 쓰임을 정리할 수 있었다. 앞으로 새 개발 환경을 만들 때는 당연히 쓰게 될 도구라고 생각한다. 여러 서비스를 이렇게 쉽게 설치하고 실행할 수 있다는 점에 놀랐고, 백엔드 환경 구축의 장벽이 얼마나 낮아지고 있는지 느낄 수 있었다.

참고자료


이 글 공유하기:

이전 글
MySQL FULLTEXT 검색으로 LIKE '%키워드%' 대체하기: 게시판 검색 속도 개선
다음 글
Vue CLI: 개발과 배포 환경별로 publicPath 다르게 설정하기 (GitHub Pages)