Docker & Docker Compose 기본 개념과 명령어 정리
안녕하세요.
오늘은 Docker 및 Docker Compose 관련 기본 개념과 기본 명령어를 살펴볼게요.
Docker 🐳 란?
Docker는 애플리케이션과 실행 환경(라이브러리, 설정 등)을 컨테이너라는 단위로 패키징해
일관되게 실행할 수 있게 해주는 플랫폼이에요.
컨테이너는 가볍고 독립적인 실행 단위로, 호스트 OS 위에서 격리된 공간에서 동작합니다.
개발·테스트·운영 환경 간 차이를 최소화하고, 배포 및 확장을 단순화하는 것이 핵심 장점이에요.
Docker 개념 정리
- 이미지(Image): 실행 가능한 패키지(앱 + 환경 + 의존성). 템플릿 역할.
- 컨테이너(Container): 이미지를 실행한 인스턴스. 실제 동작하는 프로세스.
- 볼륨(Volume): 컨테이너와 호스트 간의 데이터 공유/저장.
- 네트워크(Network): 컨테이너 간 통신을 위한 가상 네트워크.
Docker 장점
- 환경 일관성
- “내 PC에서는 되는데 서버에서는 안 돼요” 문제 해결.
- 애플리케이션과 실행 환경(라이브러리, 설정 등)을 컨테이너에 함께 패키징 → 어디서든 동일하게 동작.
- 가볍고 빠른 실행
- VM(가상머신)과 달리 호스트 OS 커널을 공유하므로 훨씬 가볍고 부팅 속도도 빠름.
- 컨테이너 시작/중지가 초 단위로 가능.
- 이식성 (Portability)
- Docker 이미지 하나로 개발 → 테스트 → 운영 전 과정에 동일하게 배포 가능.
- 온프레미스, 클라우드, 로컬 PC 어디든 실행 가능.
- 확장성과 유연성
- 서비스 단위로 컨테이너를 쪼갤 수 있어 마이크로서비스 아키텍처(MSA)에 적합.
- 필요 시 컨테이너 수를 쉽게 늘려서 확장 가능 (스케일링).
- 효율적인 자원 사용
- VM보다 가볍기 때문에 같은 서버에서 더 많은 애플리케이션 실행 가능.
- 불필요한 중복 제거 (레이어 기반 이미지 구조).
- 자동화 및 배포 편의성
- Docker Compose, Kubernetes 등과 연동해 자동 배포·관리 용이.
- CI/CD 파이프라인에 잘 맞음.
Docker vs VM (가상 머신)비교
비교 항목 | Docker | VM |
구조 | 호스트 OS 커널 공유, 애플리케이션 실행 환경만 격리 | 하이퍼바이저 위에 게스트 OS 전체 구동 |
무게감 | 가볍다 (MB 단위) |
무겁다 (GB 단위) |
시작 속도 | 수 초 이내 (거의 즉시) |
수 분 이상 (OS 부팅 필요) |
성능 | 거의 네이티브 성능 | 게스트 OS 오버헤드로 성능 손실 |
자원 효율 | 높은 밀도 (한 서버에 수십~수백 컨테이너 가능) |
낮음 (서버 자원 나눠써야 함) |
이식성 | 이미지 단위로 어디서든 동일 실행 (개발↔운영 무차별) |
게스트 OS 환경 차이 발생 가능 |
확장성 | 컨테이너 단위로 쉽게 스케일 아웃 | VM 단위 증설 → 느리고 무겁다 |
보안 격리 | 프로세스 단위 격리 (호스트 커널 공유 → 비교적 약함) |
OS 단위 격리 (커널까지 분리 → 강력함) |
사용 사례 | 마이크로서비스, CI/CD, 빠른 배포 환경 | 강력한 보안이 필요한 경우, 완전한 OS 환경 제공이 필요할 때 |
Docker 기본 명령어
이미지 다운로드
docker pull <이미지이름>:<태그>
이미지 목록 확인
docker images
이미지 삭제
docker rmi <이미지ID>
Docker 컨테이너 조회, 생성, 실행 및 종료 관련 명령어
컨테이너 실행 (없으면 자동으로 이미지 pull)
docker run -d --name myapp -p 8080:80 nginx
옵션
# -d : 백그라운드 실행
# --name : 컨테이너 이름 지정
# -p : 호스트:컨테이너 포트 매핑
# -v : 볼륨 마운트 (예: -v /host/path:/container/path)
컨테이너 조회(중지된 컨테이너 포함)
docker ps -a
아래 명령어들은 컨테이너 조회를 통해 확인한 ID 또는 컨테이너 생성 시 할당한 이름(--name 옵션)으로 사용
시작
docker start <컨테이너이름 또는 ID>
중지
docker stop <컨테이너이름 또는 ID>
재시작
docker restart <컨테이너이름 또는 ID>
삭제
docker rm <컨테이너이름 또는 ID>
컨테이너 로그 조회
컨테이너 로그는 컨테이너 동작에서 에러가 발생했거나, 로그 확인이 필요할 경우 사용해요.
일반적으로 컨테이너 실행, 또는 의도치 않은 동작이 발생할 경우 많이 사용해요.
로그 확인
docker logs <컨테이너이름 또는 ID>
실시간 로그 스트리밍
docker logs -f <컨테이너이름 또는 ID>
컨테이너 내부 접속
컨테이너에 쉘을 붙여야하거나 특정 작업 또는 명령어를 보낼때 많이 사용하는 명령어에요.
bash 쉘 접속
docker exec -it <컨테이너이름 또는 ID> /bin/bash
sh 쉘 접속 (alpine 등 bash 없는 경우)
docker exec -it <컨테이너이름 또는 ID> sh
Docker Compose
Docker Compose는 여러 컨테이너(서비스)를 docker-compose.yml 파일 하나로 정의하고 관리할 수 있는 도구에요.
개별로 실행하거나 복잡하고 길게 써야했던 docker 명령(네트워크·볼륨·컨테이너)를 한 번에 생성·실행할 수 있어,
복잡한 환경을 쉽게 배포·관리할 수 있습니다.
주의
docker compose는 명령을 실행하는 디렉토리 내 docker-compose.yml이 존재해야해요.
그리고 docker compose 버전에 따라 docker compose 또는 docker-compose를 사용해요.
docker compose를 쓰는 방식이 최신 버전(v2) 입니다
docker-compose.yml
아래는 docker-compose 예시로 yml 형식을 사용해서 각 라인별 들여쓰기로 구분해요.
WEB / WAS / DB를 한번에 설치하는 yml 형태로 이렇게 여러가지 컨테이너를 한번에 관리할 수 있어요.
version: "3.9"
services:
web:
image: nginx:latest
container_name: web
ports:
- "8080:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- was
networks:
- app-network
was:
image: tomcat:9.0
container_name: was
volumes:
- ./app:/usr/local/tomcat/webapps/ROOT
environment:
- DB_HOST=db
- DB_PORT=5432
- DB_USER=appuser
- DB_PASS=apppass
depends_on:
- db
networks:
- app-network
db:
image: postgres:14
container_name: db
environment:
- POSTGRES_USER=appuser
- POSTGRES_PASSWORD=apppass
- POSTGRES_DB=appdb
volumes:
- db_data:/var/lib/postgresql/data
networks:
- app-network
volumes:
db_data:
networks:
app-network:
Docker Compose 관련 명령어
Docker Compose를 통한 컨테이너 실행 (백그라운드)
docker compose up -d
서비스 로그 확인
docker compose logs
docker compose logs -f <서비스명>
상태 확인
docker compose ps
상태를 확인해보면 docker ps를 했을 때와 다르게 SERVICE 컬럼이 추가되어 있다.
컨테이너 중지
docker compose down
컨테이너 정리 및 완전 제거(볼륨 및 고아 컨테이너 제거)
docker-compose down --volumes --remove-orphans
컨테이너 정리 및 이미지 포함 완전 제거
docker-compose down --volumes --rmi all --remove-orphans
정리하기
이 외에도 여러가지 많은 명령어들이 있어요.
하지만 IT 직종에서 수준급으로 도커를 활용하여 프로덕션 환경에 배포할게 아니라면
위 기본 명령어로도 충분히 도커를 사용할 수 있습니다.