현대 소프트웨어 개발에서 Docker와 Docker Compose는 애플리케이션 배포와 관리를 위한 필수 도구로 자리 잡았습니다. 이 글에서는 Docker와 Docker Compose의 설치부터 실행, 그리고 실제 활용 방법에 대해 포스팅해보겠습니다.


Docker는 익숙하죠?
Docker는 앞서 이미 사용 수준에 있을 만큼 익숙한 플랫폼입니다. 주로 애플리케이션을 개발, 배포, 실행하기 위한 목적의 오픈소스 플랫폼입니다.
Docker의 주요 장점
- 일관된 환경: “내 컴퓨터에서는 작동했는데…”라는 문제 해결
- 리소스 효율성: 가상 머신보다 가볍고 빠름
- 빠른 배포: 개발부터 프로덕션까지 동일한 환경 제공
- 확장성: 손쉬운 서비스 확장 가능
- 격리성: 애플리케이션 간 충돌 방지

Docker 설치하기
Windows에 Docker 설치
Windows에서는 Docker Desktop을 설치하여 사용할 수 있습니다.
- Docker Desktop 설치 파일을 공식 웹사이트에서 다운로드합니다.
- 다운로드한 설치 파일을 실행하고 안내에 따라 설치를 진행합니다.
- 설치 완료 후 Docker Desktop을 실행합니다.
- WSL 2 백엔드를 사용하도록 설정하는 것이 권장됩니다.
macOS에 Docker 설치
macOS에서도 Docker Desktop을 통해 쉽게 설치할 수 있습니다.
- Docker Desktop for Mac을 공식 웹사이트에서 다운로드합니다.
- 다운로드한 .dmg 파일을 실행하고 Applications 폴더로 Docker.app을 드래그합니다.
- Applications 폴더에서 Docker를 실행합니다.
Linux에 Docker 설치
Ubuntu를 예로 들어 설치 방법을 알아보겠습니다.
# 1. 이전 버전 제거
sudo apt-get remove docker docker-engine docker.io containerd runc
# 2. 필요한 패키지 설치
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
# 3. Docker 공식 GPG 키 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 4. 저장소 설정
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 5. Docker 엔진 설치
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 6. 사용자를 docker 그룹에 추가 (sudo 없이 사용하기 위함)
sudo usermod -aG docker $USER
설치 후 시스템을 재부팅하거나 다음 명령을 실행하여 변경사항을 적용합니다:
newgrp docker
Docker 기본 명령어
Docker를 설치한 후 사용할 수 있는 기본 명령어들을 알아보겠습니다.
Docker 버전 확인
docker --version
Docker 이미지 관리
# 이미지 검색
docker search ubuntu
# 이미지 다운로드
docker pull ubuntu:20.04
# 이미지 목록 확인
docker images
# 이미지 삭제
docker rmi ubuntu:20.04
Docker 컨테이너 관리
# 컨테이너 생성 및 실행
docker run -it --name my-ubuntu ubuntu:20.04 bash
# 실행 중인 컨테이너 목록 확인
docker ps
# 모든 컨테이너 목록 확인 (중지된 컨테이너 포함)
docker ps -a
# 컨테이너 시작
docker start my-ubuntu
# 컨테이너 중지
docker stop my-ubuntu
# 컨테이너 재시작
docker restart my-ubuntu
# 실행 중인 컨테이너에 접속
docker exec -it my-ubuntu bash
# 컨테이너 삭제 (중지 상태에서만 가능)
docker rm my-ubuntu
# 강제 삭제 (실행 중이어도 가능)
docker rm -f my-ubuntu
Dockerfile로 이미지 빌드하기
Dockerfile은 Docker 이미지를 생성하기 위한 스크립트입니다. 다음은 간단한 Node.js 애플리케이션을 위한 Dockerfile 예시입니다.
# Node.js 공식 이미지를 기반으로 함
FROM node:14
# 작업 디렉토리 설정
WORKDIR /app
# 의존성 파일 복사 및 설치
COPY package*.json ./
RUN npm install
# 소스 코드 복사
COPY . .
# 포트 노출
EXPOSE 3000
# 애플리케이션 실행 명령
CMD ["npm", "start"]
Dockerfile을 작성한 후 다음 명령으로 이미지를 빌드합니다:
docker build -t my-node-app .
빌드된 이미지를 실행하려면:
docker run -p 3000:3000 my-node-app
Docker Compose란?
Docker Compose는 여러 컨테이너로 구성된 애플리케이션을 정의하고 실행하기 위한 도구입니다. YAML 파일을 사용하여 서비스, 네트워크, 볼륨 등을 구성할 수 있어 복잡한 다중 컨테이너 애플리케이션을 쉽게 관리할 수 있습니다.
Docker Compose 설치하기
Windows 및 macOS
Windows와 macOS에서는 Docker Desktop을 설치하면 Docker Compose가 함께 설치됩니다.
Linux에 Docker Compose 설치
# 1. Docker Compose 최신 버전 다운로드
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 2. 실행 권한 부여
sudo chmod +x /usr/local/bin/docker-compose
# 3. 설치 확인
docker-compose --version
Docker Compose 사용하기
docker-compose.yml 파일 작성
다음은 웹 애플리케이션과 데이터베이스를 함께 실행하는 간단한 docker-compose.yml 파일 예시입니다:
version: '3'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
environment:
- DATABASE_URL=postgres://postgres:password@db:5432/mydb
volumes:
- ./:/app
- /app/node_modules
db:
image: postgres:13
ports:
- "5432:5432"
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=password
- POSTGRES_DB=mydb
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Docker Compose 기본 명령어
# 서비스 시작 (백그라운드 모드)
docker-compose up -d
# 서비스 상태 확인
docker-compose ps
# 서비스 로그 확인
docker-compose logs
# 특정 서비스의 로그 확인
docker-compose logs web
# 서비스 중지
docker-compose stop
# 서비스 시작
docker-compose start
# 서비스 재시작
docker-compose restart
# 서비스 중지 및 컨테이너 삭제
docker-compose down
# 서비스 중지, 컨테이너, 네트워크, 볼륨, 이미지 모두 삭제
docker-compose down -v --rmi all
실전 Docker Compose 예제
WordPress와 MySQL 실행하기
다음은 WordPress와 MySQL을 함께 실행하는 docker-compose.yml 파일입니다:
version: '3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress_data:/var/www/html
volumes:
db_data:
wordpress_data:
이 구성을 실행하려면:
docker-compose up -d
브라우저에서 http://localhost:8000 으로 접속하면 WordPress 설치 화면을 볼 수 있습니다.
개발 환경 구성: Node.js, MongoDB, Redis
version: '3'
services:
app:
build: .
ports:
- "3000:3000"
depends_on:
- mongo
- redis
environment:
- NODE_ENV=development
- MONGO_URI=mongodb://mongo:27017/myapp
- REDIS_HOST=redis
- REDIS_PORT=6379
volumes:
- ./:/app
- /app/node_modules
mongo:
image: mongo:4.4
ports:
- "27017:27017"
volumes:
- mongo_data:/data/db
redis:
image: redis:6
ports:
- "6379:6379"
volumes:
- redis_data:/data
volumes:
mongo_data:
redis_data:
Docker와 Docker Compose 활용 팁
1. 개발 환경과 프로덕션 환경 분리
여러 환경에 대한 설정을 분리하여 관리할 수 있습니다:
# 기본 설정 (docker-compose.yml)
# 개발 환경 설정 (docker-compose.override.yml)
# 프로덕션 환경 설정 (docker-compose.prod.yml)
# 개발 환경 실행
docker-compose up -d
# 프로덕션 환경 실행
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
2. 네트워크 구성
Docker Compose에서 네트워크를 명시적으로 정의할 수 있습니다:
version: '3'
services:
frontend:
build: ./frontend
networks:
- frontend-network
- backend-network
backend:
build: ./backend
networks:
- backend-network
db:
image: postgres
networks:
- backend-network
networks:
frontend-network:
backend-network:
3. 환경 변수 관리
.env 파일을 사용하여 환경 변수를 관리할 수 있습니다:
# .env 파일 DB_USER=myuser DB_PASSWORD=mypassword DB_NAME=mydb
# docker-compose.yml version: '3' services: db: image: postgres environment: - POSTGRES_USER=${DB_USER} - POSTGRES_PASSWORD=${DB_PASSWORD} - POSTGRES_DB=${DB_NAME}
4. 볼륨 활용하기
Docker 볼륨을 사용하여 데이터를 영구적으로 저장할 수 있습니다:
version: '3' services: db: image: postgres volumes: - postgres_data:/var/lib/postgresql/data - ./init-scripts:/docker-entrypoint-initdb.d volumes: postgres_data: driver: local
Docker와 Docker Compose 문제 해결
일반적인 문제와 해결 방법
- 권한 문제: Linux에서 Docker를 사용할 때 권한 문제가 발생하면 사용자를 docker 그룹에 추가합니다.
sudo usermod -aG docker $USER
- 포트 충돌: 이미 사용 중인 포트를 사용하려고 할 때 발생합니다. 다른 포트를 사용하거나 충돌하는 서비스를 중지합니다.
docker-compose down && docker-compose up -d
- 디스크 공간 부족: 사용하지 않는 이미지, 컨테이너, 볼륨을 정리합니다.
docker system prune -a --volumes
- 네트워크 문제: 컨테이너 간 통신 문제는 네트워크 설정을 확인합니다.
docker network ls
docker network inspect [네트워크_이름]
Docker Compose v1과 v2의 차이점 정리
Docker Compose는 2023년 7월 이후로 v1은 더 이상 지원되지 않으며, v2가 공식 표준이 되었습니다. 추가로 아래에서 v1과 v2의 주요 차이점을 정리합니다.
1. 명령어 및 CLI 통합
- v1: 별도의 명령어
docker-compose
사용 - v2: Docker CLI에 통합되어
docker compose
(하이픈 없이) 사용
→ 이제 Docker만 설치되어 있으면 별도 설치 없이 바로 사용 가능
2. 내부 구현 언어
- v1: Python으로 작성되어 pip 등으로 설치 가능
- v2: Go 언어로 재작성되어 성능 및 유지보수성이 개선됨. Python 라이브러리로는 더 이상 제공되지 않음
3. 컨테이너 네이밍 방식
- v1: 컨테이너 이름에 언더스코어(
_
) 사용 (예:myproject_svc_1
) - v2: 컨테이너 이름에 하이픈(
-
) 사용 (예:myproject-svc-1
)
→ 하이픈은 DNS 호환성을 높여 네트워크 상에서 더 일관된 접근이 가능
4. 명령어 옵션 및 호환성
- v2: 대부분 v1의 옵션과 하위 명령어를 지원하여 기존 스크립트와의 호환성이 높음.
단, 일부 deprecated 명령어(docker-compose scale
,docker-compose rm --all
)는 더 이상 지원하지 않음 - –compatibility 옵션을 통해 v1 스타일 네이밍 등 일부 동작을 임시로 유지할 수 있음
5. 환경 변수 처리 방식
- v1: 환경 변수 처리와
.env
파일 해석이 일관되지 않았음 - v2: 환경 변수 우선순위와
.env
파일 해석이 명확하게 문서화되고 일관성 있게 동작
6. BuildKit 기본 적용
- v2: Docker BuildKit이 기본 활성화되어 빌드 성능과 기능이 향상됨. 필요시
DOCKER_BUILDKIT=0
으로 비활성화 가능
7. 추가 기능 및 개선점
- v2:
compose ls
,compose cp
등 다양한 유틸리티 명령어가 추가되어 스택 및 컨테이너 관리가 더 쉬워짐 - v2: Docker-in-Docker 환경, 멀티스테이지 빌드 등 최신 Docker 기능과의 연동성이 강화됨
8. 마이그레이션 및 지원 정책
- v1: 2023년 7월 이후로 더 이상 업데이트 및 신규 Docker Desktop에 포함되지 않음. 보안 패치만 제한적으로 제공
- v2: 현재와 미래의 Docker Desktop에 기본 포함, 새로운 기능 지속 개발
주요 차이점 요약 표
항목 | Compose v1 (docker-compose ) | Compose v2 (docker compose ) |
---|---|---|
CLI 명령어 | docker-compose | docker compose |
내부 언어 | Python | Go |
Docker CLI 통합 | 별도 실행 파일 | Docker CLI에 통합 |
컨테이너 네이밍 | 언더스코어(_) | 하이픈(-) |
BuildKit 지원 | 선택적 | 기본 활성화 |
환경 변수 처리 | 불명확, 일관성 부족 | 명확, 일관성 강화 |
지원 상태 | 지원 종료(2023년 7월 이후) | 공식 지원, 지속적 개발 |
마이그레이션 팁
- 기존
docker-compose
명령어를docker compose
로 변경하면 대부분의 프로젝트가 별다른 수정 없이 동작합니다. - 컨테이너 이름을 스크립트에서 직접 참조하는 경우, 네이밍 규칙 변경에 주의해야 합니다.
- 필요시
--compatibility
플래그로 v1 스타일 네이밍을 임시 유지할 수 있습니다
Docker Compose v2는 기존 v1의 기능을 대부분 계승하면서도 CLI 통합, 네이밍 개선, 빌드 성능 향상 등 여러 면에서 발전했습니다. 앞으로의 Compose 사용 및 스크립트 작성 시에는 v2를 기준으로 하는 것이 권장됩니다.
결론
Docker와 Docker Compose는 현대 소프트웨어 개발 및 배포 과정에서 필수적인 도구입니다. 이 글에서 다룬 내용을 바탕으로 Docker와 Docker Compose를 활용하여 일관된 개발 환경을 구축하고, 복잡한 애플리케이션을 쉽게 관리할 수 있기를 바랍니다.
Docker의 생태계는 계속해서 발전하고 있으며, 클라우드 네이티브 애플리케이션 개발에 있어 중요한 역할을 담당하고 있습니다. 이 기술을 마스터하면 개발 워크플로우를 크게 개선하고 DevOps 프로세스를 효율화할 수 있을 것입니다.
답글 남기기