“내 컴퓨터에서는 되는데 서버에서는 안 돼요” — 개발자가 가장 많이 하는 말입니다. Docker는 이 문제를 해결합니다. 앱을 실행에 필요한 모든 것(코드, 라이브러리, 설정)을 컨테이너라는 상자에 담아서, 어떤 환경에서든 동일하게 실행되도록 합니다. 이 글에서 Docker의 개념을 일상 비유로 쉽게 설명하고, 실제로 컨테이너를 실행해봅니다.
Docker를 택배에 비유하면
택배
Docker
상품 (물건)
내 애플리케이션 (코드)
포장 (박스+완충재)
컨테이너 (코드+라이브러리+설정)
포장 규격
Docker 이미지 (컨테이너 설계도)
택배 트럭
Docker 엔진
어디서든 수령 가능
어떤 서버에서든 동일하게 실행
물건을 상자에 잘 포장하면 택배가 어떤 트럭을 타든, 어디로 가든 물건은 안전합니다. Docker도 마찬가지로, 앱을 컨테이너에 담으면 개발 PC, 테스트 서버, 운영 서버 어디서든 동일하게 작동합니다.
핵심 개념 3가지
개념
설명
비유
이미지 (Image)
컨테이너의 설계도/청사진
레시피 (붕어빵 틀)
컨테이너 (Container)
이미지를 실행한 인스턴스
실제 붕어빵 (틀로 찍어낸 것)
Dockerfile
이미지를 만드는 명령어 파일
레시피 작성법
관계: Dockerfile → (빌드) → 이미지 → (실행) → 컨테이너
Docker vs 가상머신(VM)
Docker (컨테이너)
가상머신 (VM)
OS
호스트 OS 공유
각각 별도 OS 설치
크기
수십 MB
수 GB
시작 시간
수 초
수 분
성능
네이티브에 가까움
오버헤드 있음
격리 수준
프로세스 격리
완전 격리
사용 사례
마이크로서비스, CI/CD, 개발 환경
다른 OS 필요 시
Docker 설치
OS
방법
Ubuntu/Debian
sudo apt install docker.io
Mac
Docker Desktop 다운로드 (docker.com)
Windows
Docker Desktop 다운로드 (WSL2 필요)
# 설치 확인
docker --version
# Docker version 24.0.x
# 권한 설정 (sudo 없이 사용)
sudo usermod -aG docker $USER
# 이후 로그아웃 후 재로그인
실습: 첫 번째 컨테이너 실행
# 1. Nginx 웹서버 컨테이너 실행
docker run -d -p 8080:80 --name my-web nginx
# 설명:
# -d : 백그라운드 실행
# -p 8080:80 : 호스트 8080 포트 → 컨테이너 80 포트 연결
# --name : 컨테이너 이름 지정
# nginx : 사용할 이미지
# 2. 브라우저에서 확인
# http://localhost:8080 접속 → "Welcome to nginx!" 페이지
# 3. 실행 중인 컨테이너 확인
docker ps
# CONTAINER ID IMAGE STATUS PORTS NAMES
# abc123 nginx Up 0.0.0.0:8080->80/tcp my-web
# 4. 컨테이너 중지
docker stop my-web
# 5. 컨테이너 삭제
docker rm my-web
핵심 Docker 명령어
명령어
설명
예시
docker pull
이미지 다운로드
docker pull mysql:8.0
docker run
컨테이너 생성+실행
docker run -d -p 3306:3306 mysql
docker ps
실행 중인 컨테이너
docker ps -a (전체)
docker stop
컨테이너 중지
docker stop my-web
docker rm
컨테이너 삭제
docker rm my-web
docker images
이미지 목록
docker images
docker rmi
이미지 삭제
docker rmi nginx
docker logs
로그 확인
docker logs -f my-web
docker exec
컨테이너 안에서 명령 실행
docker exec -it my-web bash
docker build
Dockerfile로 이미지 생성
docker build -t myapp .
실습: Dockerfile로 나만의 이미지 만들기
간단한 Node.js 앱을 Docker로 실행하는 예시:
# 프로젝트 구조
my-app/
├── Dockerfile
├── package.json
└── app.js
# app.js
const http = require('http');
const server = http.createServer((req, res) => {
res.end('Hello from Docker! 🐳');
});
server.listen(3000, () => console.log('Server running on port 3000'));
# Dockerfile
FROM node:20-alpine # Node.js 20 이미지 기반
WORKDIR /app # 작업 디렉토리 설정
COPY package.json ./ # package.json 복사
RUN npm install # 의존성 설치
COPY . . # 나머지 파일 복사
EXPOSE 3000 # 3000번 포트 노출
CMD ["node", "app.js"] # 실행 명령
# 이미지 빌드
docker build -t my-node-app .
# 컨테이너 실행
docker run -d -p 3000:3000 my-node-app
# 확인: http://localhost:3000 → "Hello from Docker! 🐳"
Docker가 쓰이는 실전 사례
사례
설명
개발 환경 통일
팀원 모두 같은 환경 (Node 20 + MySQL 8 + Redis)
CI/CD
GitHub Actions에서 Docker로 테스트/배포 자동화
마이크로서비스
각 서비스를 별도 컨테이너로 격리
로컬 DB 실행
MySQL/PostgreSQL을 설치 없이 컨테이너로 실행
마무리
Docker의 핵심은 “Dockerfile 작성 → 이미지 빌드 → 컨테이너 실행” 3단계입니다. 오늘 할 일: Docker 설치 → docker run -d -p 8080:80 nginx 실행 → 브라우저에서 확인. 5분이면 첫 번째 컨테이너가 실행됩니다. “내 컴에서는 되는데”가 사라지는 순간을 경험해보세요.