Docker & Docker Compose 기본 개념과 명령어 정리
안녕하세요.
오늘은 Docker 및 Docker Compose 관련 기본 개념과 기본 명령어를 살펴볼게요.
Docker 🐳 란?
Docker는 애플리케이션과 실행 환경(라이브러리, 설정 등)을 컨테이너라는 단위로 패키징해
일관되게 실행할 수 있게 해주는 플랫폼이에요.
컨테이너는 가볍고 독립적인 실행 단위로, 호스트 OS 위에서 격리된 공간에서 동작해요.
개발·테스트·운영 환경 간 차이를 최소화하고, 배포 및 확장을 단순화하는 것이 핵심 장점이에요.
Docker 개념 정리
- 이미지(Image): 실행 가능한 패키지(앱 + 환경 + 의존성). 템플릿 역할.
- 컨테이너(Container): 이미지를 실행한 인스턴스. 실제 동작하는 프로세스.
- 볼륨(Volume): 컨테이너와 호스트 간의 데이터 공유/저장.
- 네트워크(Network): 컨테이너 간 통신을 위한 가상 네트워크.
Docker 장점
Hetzner의 가장 큰 장점은 가격 대비 성능이에요. 무겁지 않은 워크로드라면 작은 사양으로도 충분히 빠릿하게 돌릴 수 있어요.
트래픽 제약이 느슨하고 네트워크 품질이 안정적이라, 개인 프로젝트나 테스트 서버처럼 상시 켜두는 용도에 잘 맞아요.
기본 DDoS 방어를 지원해 별도 보안 장비 없이도 초기 운영이 수월해요. 필요하면 방화벽·백업만 보강해 확장하면 돼요.
Docker vs VM (가상 머신)비교
| 비교 항목 | Docker | VM |
| 구조 | 호스트 OS 커널 공유, 애플리케이션 실행 환경만 격리 | 하이퍼바이저 위에 게스트 OS 전체 구동 |
| 무게감 | 가볍다 (MB 단위) |
무겁다 (GB 단위) |
| 시작 속도 | 수 초 이내 (거의 즉시) |
수 분 이상 (OS 부팅 필요) |
| 성능 | 거의 네이티브 성능 | 게스트 OS 오버헤드로 성능 손실 |
| 자원 효율 | 높은 밀도 (한 서버에 수십~수백 컨테이너 가능) |
낮음 (서버 자원 나눠써야 함) |
| 이식성 | 이미지 단위로 어디서든 동일 실행 (개발↔운영 무차별) |
게스트 OS 환경 차이 발생 가능 |
| 확장성 | 컨테이너 단위로 쉽게 스케일 아웃 | VM 단위 증설 → 느리고 무겁다 |
| 보안 격리 | 프로세스 단위 격리 (호스트 커널 공유 → 비교적 약함) |
OS 단위 격리 (커널까지 분리 → 강력함) |
| 사용 사례 | 마이크로서비스, CI/CD, 빠른 배포 환경 | 강력한 보안이 필요한 경우, 완전한 OS 환경 제공이 필요할 때 |
Docker 기본 명령어
이미지 다운로드
원격 레지스트리(Docker Hub 등)에서 이미지를 내려받는 명령어예요. 특정 태그를 지정하지 않으면 일반적으로 latest 태그가 선택돼요.
docker pull <이미지이름>:<태그>
이미지 목록 확인
로컬에 저장된 이미지들을 한눈에 확인할 때 사용해요. 태그와 이미지 ID를 함께 보면서 불필요한 이미지를 정리하기 좋아요.
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 없는 경우)
bash가 없는 경량 이미지에서 대체로 sh를 사용해요. 최소 환경에서도 빠르게 내부 상태를 확인할 수 있어요.
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
서비스 로그 확인
Compose로 실행한 여러 서비스의 로그를 한 번에 모아서 볼 수 있어요. 특정 서비스만 골라 볼 수도 있어요.
docker compose logs
docker compose logs -f <서비스명>
상태 확인
현재 실행 중인 서비스와 포트, 리스타트 정책 등을 표로 확인해요. 서비스가 예상대로 뜨지 않았을 때 1차 점검용으로 좋아요.
docker compose ps

상태를 확인해보면 docker ps를 했을 때와 다르게 SERVICE 컬럼이 추가되어 있다.
컨테이너 중지
현재 실행 중인 컨테이너를 멈출 때 사용하는 명령어예요. 서비스를 안전하게 내릴 때 주로 사용돼요.
docker compose down
컨테이너 정리 및 완전 제거(볼륨 및 고아 컨테이너 제거)
사용하지 않는 컨테이너·네트워크·볼륨을 한 번에 정리해요. 디스크 공간을 회수하고 개발 환경을 깨끗하게 유지할 때 유용해요.
docker-compose down --volumes --remove-orphans
컨테이너 정리 및 이미지 포함 완전 제거
이미지까지 정리해 초기 상태로 되돌릴 때 사용해요. 새로 빌드하거나 깔끔한 상태에서 테스트를 다시 시작하고 싶을 때 좋아요.
docker-compose down --volumes --rmi all --remove-orphans
정리하기
이 외에도 여러가지 많은 명령어들이 있어요.
하지만 IT 직종에서 수준급으로 도커를 활용하여 프로덕션 환경에 배포할게 아니라면
위 기본 명령어로도 충분히 도커를 사용할 수 있습니다.
'도커(Docker)' 카테고리의 다른 글
| pgadmin docker 배포 및 docker PostgreSQL 연결 (1) | 2025.09.16 |
|---|