본문으로 건너뛰기
엠제이커넥트 AI 랩
서버·아키텍처

도커란? 뜻과 사용법, 작은 웹앱을 Dockerfile 하나로 띄우는 법

엄준태10분 읽기
도커란 표지 — 도커 뜻과 사용법, 이미지와 컨테이너 차이, Docker Desktop은 직원 250명 미만이면서 연매출 1천만 달러 미만이면 무료
목차
  1. 도커는 무엇이고 왜 쓰나요?
  2. 도커 이미지와 컨테이너는 무엇이 다른가요?
  3. 작은 웹앱은 도커로 어떻게 띄우나요?
  4. DB까지 함께 띄우려면 compose를 쓰나요?
  5. 이미지를 작고 안전하게 만들려면 무엇을 챙기나요?
  6. Docker Desktop은 회사에서 써도 무료인가요?
  7. Docker Hub에서 이미지를 받을 때 한도가 있나요?
  8. 도커가 필요 없는 경우는 언제인가요?
  9. 이 방법이 안 통하는 경우는?
  10. 정리: 무엇부터 하면 되나요?
  11. 참고 자료

도커(Docker)는 앱과 그 앱이 돌아가는 데 필요한 파일·라이브러리·설정을 한 꾸러미로 묶어, 어느 컴퓨터에서나 같은 방식으로 실행하게 해 주는 도구입니다. 결론부터 말하면 서버를 직접 관리하거나 앱과 DB를 한 번에 띄워야 할 때 도커가 가장 확실한 방법이고, Vercel 같은 플랫폼에 올리는 웹앱이라면 굳이 배울 필요가 없습니다. 이 글의 명령어와 요금·라이선스 기준은 2026년 10월 12일 도커 공식 문서와 가격 페이지에서 확인한 값입니다.

도커는 무엇이고 왜 쓰나요?

"내 컴퓨터에서는 되는데 서버에서는 안 된다"는 문제는 대부분 환경 차이에서 생깁니다. 노드 버전, 설치된 라이브러리, 운영체제 설정이 조금씩 다르기 때문입니다. 도커는 앱이 필요로 하는 환경까지 통째로 묶어 옮기므로, 개발 노트북과 서버에서 같은 결과를 냅니다.

바이브코딩으로 만든 앱을 실제 서버에 올리는 단계에서 특히 쓸모가 있습니다.

  • 환경 고정: 팀원 노트북, 테스트 서버, 운영 서버가 모두 같은 이미지를 씁니다.
  • 한꺼번에 띄우기: 웹앱, DB, 캐시를 파일 하나로 정의해 명령 한 번에 올립니다.
  • 정리하기 쉬움: 컨테이너를 지우면 설치했던 것도 함께 사라져 서버가 지저분해지지 않습니다.

올라마로 로컬 LLM을 돌리는 방법처럼 도구가 자체 설치 스크립트를 주는 경우도 많지만, 여러 서비스를 함께 운영하기 시작하면 도커로 묶는 편이 관리가 쉬워집니다.

도커 이미지와 컨테이너는 무엇이 다른가요?

처음 헷갈리는 두 단어입니다. 공식 문서 정의를 기준으로 정리하면 이렇습니다.

구분 이미지(image) 컨테이너(container)
정체 실행에 필요한 파일·라이브러리·설정 꾸러미 이미지를 실행한 격리된 프로세스
변경 한 번 만들면 바뀌지 않음(불변) 실행 중 상태가 생기고, 지우면 사라짐
만드는 법 Dockerfile 로 docker build 이미지로 docker run
비유 설치 파일 실행 중인 프로그램

이미지는 레이어(층)로 쌓입니다. 각 레이어는 파일을 추가·삭제·수정한 변경분이라, 의존성 설치처럼 자주 안 바뀌는 단계를 앞쪽에 두면 다시 빌드할 때 그 층을 재사용해 빨라집니다. 같은 이미지로 컨테이너를 여러 개 띄울 수 있고, 컨테이너를 지워도 이미지는 남습니다.

작은 웹앱은 도커로 어떻게 띄우나요?

도커로 작은 웹앱을 띄우는 4단계 — Dockerfile 작성, docker build 로 이미지 만들기, docker run 으로 컨테이너 실행, compose.yaml 과 docker compose up 으로 DB까지 함께 띄우기

노드(Node.js) 웹앱을 예로 들면, 프로젝트 폴더에 Dockerfile 을 하나 만듭니다.

FROM node:22-slim
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npm", "start"]

package.json 을 먼저 복사해 의존성을 설치한 뒤 나머지 코드를 복사하는 순서가 핵심입니다. 코드만 고쳤을 때는 의존성 설치 층을 다시 쓰므로 빌드가 짧아집니다. 베이스 이미지 버전은 프로젝트에서 실제로 쓰는 노드 버전에 맞춥니다.

docker build -t my-web .
docker run -p 3000:3000 my-web

-p 3000:3000 은 내 컴퓨터의 3000번 포트를 컨테이너의 3000번 포트에 연결한다는 뜻입니다. 이제 브라우저에서 localhost:3000 으로 열립니다.

DB까지 함께 띄우려면 compose를 쓰나요?

네. 도커 컴포즈(Compose)는 컨테이너 여러 개를 YAML 파일 하나로 정의하고 함께 띄우는 도구입니다. 기본 파일명은 compose.yaml 입니다.

services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgres://app:app@db:5432/app
    depends_on:
      - db
  db:
    image: postgres:17
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: app
      POSTGRES_DB: app
    volumes:
      - db-data:/var/lib/postgresql/data
volumes:
  db-data:

docker compose up 으로 둘 다 띄우고, docker compose ps 로 상태를 보고, docker compose down 으로 내립니다. 컨테이너끼리는 서비스 이름(db)으로 서로를 찾습니다. 예제의 비밀번호는 연습용이니 실제 서버에서는 환경변수 파일로 분리하세요. DB를 직접 운영하기 부담스럽다면 수파베이스 무료 플랜처럼 관리형 DB를 쓰고 앱만 컨테이너로 올리는 방법도 있습니다.

이미지를 작고 안전하게 만들려면 무엇을 챙기나요?

처음 만든 이미지는 생각보다 크고, 넣지 말아야 할 파일이 섞이기 쉽습니다. 서버에 올리기 전에 아래 네 가지만 확인해도 대부분의 사고를 막습니다.

확인할 것 왜 어떻게
.dockerignore node_modules·.git·.env 가 이미지에 복사되는 것을 막음 프로젝트 루트에 만들고 제외할 경로를 적음
비밀값 이미지에 들어간 키는 이미지를 받은 누구나 꺼내 볼 수 있음 API 키는 실행할 때 환경변수로 주입
베이스 이미지 필요 없는 도구가 많을수록 크고 업데이트할 것도 많음 slim 처럼 가벼운 태그부터 시작해 필요하면 늘림
버전 고정 latest 는 받을 때마다 내용이 바뀔 수 있음 node:22-slim 처럼 버전을 적음

특히 .env 파일이 이미지에 들어가는 실수가 흔합니다. COPY . . 은 폴더 전체를 복사하므로, .dockerignore 에 .env 를 적어 두지 않으면 키가 그대로 이미지 레이어에 남습니다. 레이어는 나중에 파일을 지워도 이전 층에 내용이 남아 있다는 점도 기억해 두세요. 이미지를 Docker Hub 같은 공개 저장소에 올릴 계획이라면 이 확인은 더 중요합니다.

Docker Desktop은 회사에서 써도 무료인가요?

여기서 많이 헷갈립니다. 도커의 엔진(Docker Engine)과 Docker Desktop은 라이선스가 다릅니다.

  • Docker Engine: Apache 2.0 라이선스 오픈소스입니다. 리눅스 서버에 엔진을 직접 설치해 쓰는 것은 무료입니다.
  • Docker Desktop: 맥·윈도우에서 엔진·CLI·Compose를 한 번에 설치해 주는 앱입니다. 개인·교육·비상업 오픈소스, 그리고 직원 250명 미만이면서 연매출 1천만 달러 미만인 회사는 무료입니다. 두 조건 중 하나라도 넘으면 업무용으로 쓸 때 유료 구독이 필요하고, 정부기관도 유료 대상입니다.
Docker 요금제 비교표 — Personal 무료, Pro 월 11달러(연간 9달러), Team 월 16달러(연간 15달러), Business 연간 24달러, Docker Hub 풀 한도는 Personal 6시간 200회, 유료는 무제한

1인 창업자나 작은 개발팀이라면 대부분 무료 조건에 들어갑니다. 회사가 커지는 시점에 라이선스를 다시 확인하면 됩니다.

Docker Hub에서 이미지를 받을 때 한도가 있나요?

있습니다. postgres:17 같은 공개 이미지는 Docker Hub에서 받는데, 공식 문서 기준 6시간 동안 받을 수 있는 횟수가 정해져 있습니다. 로그인하지 않으면 IP당 100회, 무료 Personal 계정은 200회, 유료 요금제는 무제한입니다.

개인 개발에서는 거의 걸리지 않지만, CI가 빌드마다 이미지를 새로 받거나 사무실 여러 명이 같은 IP를 쓰면 한도에 닿을 수 있습니다. 이럴 땐 docker login 으로 로그인한 상태에서 받게 하는 것부터 하세요. 한도에 걸리면 빌드가 이미지 받기 단계에서 실패하므로, CI가 갑자기 멈췄다면 로그에서 이 부분을 먼저 봅니다.

도커가 필요 없는 경우는 언제인가요?

파는 쪽이 잘 말하지 않는 부분입니다. 도커는 배울 것이 생기고, 이미지 크기·보안 업데이트·로그 관리 같은 운영 일이 따라옵니다.

  • 플랫폼이 빌드와 실행을 해 주는 경우: Next.js 앱을 Vercel에 올리면 코드만 푸시하면 됩니다. 이 블로그도 Vercel과 수파베이스로 운영하며 도커를 쓰지 않습니다. 플랫폼 선택은 Vercel 무료와 Pro 비교에 정리했습니다. 도커 이미지를 그대로 올리면서 서버 관리는 맡기고 싶다면 레일웨이 요금과 사용법도 선택지입니다.
  • 서버가 하나고 앱도 하나뿐인 경우: 설치할 것이 런타임 하나라면 도커 없이 직접 설치하는 편이 단순할 수 있습니다.
  • 메모리가 아주 작은 서버: 1GB 안팎의 작은 서버에서 컨테이너 여러 개와 DB를 함께 돌리면 빠듯해집니다. 서버 사양부터 확인하세요.

반대로 서버를 직접 빌려 여러 서비스를 올리는 단계라면 도커가 시간을 아껴 줍니다. 업무 자동화 도구 n8n을 직접 띄워 쓰는 경우가 대표적인데, 직접 운영과 유료 클라우드 중 무엇이 나은지는 n8n·재피어·메이크 비교에 정리했습니다. 국내 클라우드 서버를 쓴다면 네이버클라우드 서버 요금과 무료 혜택에서 무료로 시작하는 방법을 볼 수 있습니다.

이 방법이 안 통하는 경우는?

  • 애플 실리콘 맥에서 만든 이미지가 서버에서 안 돌 때: CPU 아키텍처(arm64와 amd64)가 다르면 실행되지 않을 수 있습니다. 빌드할 때 --platform linux/amd64 처럼 대상 서버에 맞춰 지정합니다.
  • 컨테이너를 지웠더니 DB 데이터가 사라질 때: 볼륨을 연결하지 않으면 컨테이너와 함께 데이터도 지워집니다. 위 compose 예제처럼 볼륨을 꼭 둡니다.
  • 회사 규모가 기준을 넘었을 때: Docker Desktop을 업무에 쓰려면 구독이 필요합니다. 리눅스에서는 엔진만 직접 설치해 쓰는 방법도 있습니다.

정리: 무엇부터 하면 되나요?

  1. 지금 앱을 어디에 올릴지부터 정합니다. Vercel 같은 플랫폼이면 도커 없이 시작합니다.
  2. 서버를 직접 쓴다면 위 Dockerfile 로 앱 하나를 이미지로 만들어 로컬에서 띄워 봅니다.
  3. DB가 필요해지면 compose.yaml 로 앱과 DB를 묶고, 데이터는 볼륨에 둡니다.
  4. 회사에서 Docker Desktop을 쓴다면 직원 수와 매출 기준을 한 번 확인합니다.

서버 구성에 관한 다른 글은 서버 구성 글 모음에 모아 두고 있습니다.

참고 자료

자주 묻는 질문

Q. 도커는 무료인가요?

도커의 핵심인 Docker Engine은 Apache 2.0 라이선스의 오픈소스라 리눅스 서버에 직접 설치해 쓰면 무료입니다. 유료가 될 수 있는 것은 Docker Desktop인데, 개인·교육·비상업 오픈소스와 직원 250명 미만이면서 연매출 1천만 달러 미만인 회사는 무료로 쓸 수 있습니다. 두 조건 중 하나라도 넘는 회사가 업무에 쓰면 Pro·Team·Business 구독이 필요합니다.

Q. 도커 이미지와 컨테이너는 무엇이 다른가요?

도커 이미지는 앱 실행에 필요한 파일·라이브러리·설정을 묶은 꾸러미이고, 한 번 만들면 바뀌지 않습니다. 컨테이너는 그 이미지를 실제로 실행한 격리된 프로세스입니다. 같은 이미지로 컨테이너를 여러 개 띄울 수 있다고 이해하면 됩니다.

Q. 도커 컴포즈는 언제 쓰나요?

도커 컴포즈는 웹앱과 DB처럼 컨테이너 여러 개를 한 파일(compose.yaml)로 정의하고 docker compose up 한 번으로 함께 띄울 때 씁니다. 로컬 개발 환경을 팀원과 똑같이 맞추거나, 작은 서버 한 대에 앱과 DB를 같이 올릴 때 편합니다. Docker Desktop을 설치하면 Compose도 함께 들어 있습니다.

Q. Vercel에 배포하는데 도커가 필요한가요?

Vercel처럼 코드를 올리면 빌드와 실행을 대신 해 주는 플랫폼에서는 도커를 직접 쓸 필요가 없습니다. 도커가 필요해지는 것은 내가 서버를 직접 관리하거나, 플랫폼이 지원하지 않는 런타임·백그라운드 작업을 돌려야 할 때입니다.

Q. Docker Hub에서 이미지를 받을 때 횟수 제한이 있나요?

있습니다. 공식 문서 기준 로그인하지 않으면 IP당 6시간에 100회, 무료 Personal 계정으로 로그인하면 6시간에 200회까지 받을 수 있고, Pro·Team·Business는 무제한입니다. CI에서 이미지를 자주 받는다면 로그인해서 받도록 설정하는 것이 좋습니다.

X에 공유

엄준태 · 엠제이커넥트 대표 · 개발자

웹·모바일 서비스를 직접 만들고 운영하는 개발자입니다. 여행·커머스 플랫폼 개발과 외주 유지보수, 특성화고·대한상공회의소 강의 경험을 바탕으로 AI 도구를 실무에 쓰는 방법을 기록합니다.

개발 이력 보기엠제이커넥트