컨테이너 환경이 표준이 된 지금, Docker CLI는 개발자가 매일 마주치는 도구다. 옵션이 많아 처음엔 헷갈리지만, 핵심 명령어 패턴을 익히면 대부분의 작업이 몇 줄로 해결된다. 자주 쓰는 명령어를 실무 예시 중심으로 정리했다.
Image는 컨테이너 실행의 기반이 되는 읽기 전용 템플릿이다.
# 이미지 빌드 (현재 디렉터리의 Dockerfile 사용)
docker build -t my-app:1.0 .
# 빌드 캐시 무시
docker build --no-cache -t my-app:1.0 .
# 이미지 목록 확인
docker images
# 이미지 삭제
docker rmi my-app:1.0
# Registry에서 이미지 내려받기 / 올리기
docker pull nginx:alpine
docker push my-registry.io/my-app:1.0
Registry — 이미지를 저장하고 배포하는 중앙 저장소. Docker Hub가 대표적이며, 사내 환경에서는 Harbor 등 프라이빗 Registry를 운영한다.
# 기본 실행 (포그라운드)
docker run nginx:alpine
# 백그라운드 실행 + 포트 바인딩 + 이름 지정
docker run -d -p 8080:80 --name web nginx:alpine
# 환경 변수 주입
docker run -d -e DATABASE_URL=postgres://... --name api my-app:1.0
# 실행 중인 컨테이너 목록
docker ps
# 모든 컨테이너 목록 (정지된 것 포함)
docker ps -a
-d (detach) — 터미널을 점유하지 않고 백그라운드에서 컨테이너를 실행한다.
# 컨테이너 정지 / 삭제
docker stop web
docker rm web
# 정지와 동시에 삭제
docker rm -f web
실행 중인 컨테이너 안으로 들어가거나 로그를 확인할 때 사용한다.
# 로그 확인 (실시간 스트리밍)
docker logs -f web
# 컨테이너 내부 셸 접속
docker exec -it web sh
# 특정 명령어 실행
docker exec web cat /etc/nginx/nginx.conf
Host Container
/data/db ─────────▶ /var/lib/postgresql/data
(bind mount)
# Named Volume 생성 및 마운트
docker volume create pgdata
docker run -d -v pgdata:/var/lib/postgresql/data postgres:16
# 사용자 정의 네트워크 생성
docker network create app-net
# 같은 네트워크에 컨테이너 연결 (컨테이너명으로 통신 가능)
docker run -d --network app-net --name db postgres:16
docker run -d --network app-net --name api my-app:1.0
Named Volume — Docker가 관리하는 영속 스토리지. 컨테이너를 삭제해도 데이터가 유지된다. 반면 Bind Mount는 호스트 경로를 직접 연결하며 개발 환경에서 소스 코드 동기화에 주로 쓰인다.
명령어가 길어지면 docker compose로 선언적으로 관리하는 것이 낫다.
# compose.yaml
services:
db:
image: postgres:16
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: secret
api:
build: .
ports:
- "8080:3000"
depends_on:
- db
volumes:
pgdata:
docker compose up -d # 백그라운드 실행
docker compose logs -f # 전체 로그 스트리밍
docker compose down -v # 컨테이너 + Volume 삭제
| 옵션 | 의미 |
|---|---|
-d | 백그라운드 실행 |
-p host:container | 포트 바인딩 |
-v src:dst | 볼륨 / 바인드 마운트 |
-e KEY=VALUE | 환경 변수 주입 |
--name | 컨테이너 이름 지정 |
--rm | 종료 시 자동 삭제 |
--network | 사용자 정의 네트워크 연결 |