화. 8월 12th, 2025

G: 안녕하세요, 개발자 및 IT 실무자 여러분! 🚀

오늘날 소프트웨어 개발과 배포 환경에서 도커(Docker)는 선택이 아닌 필수가 되어가고 있습니다. “내 컴퓨터에서는 잘 되는데, 서버에서는 왜 안돼?” 같은 지긋지긋한 문제를 해결해주고, 개발부터 배포까지 일관된 환경을 제공하여 효율성을 극대화시켜주죠. ✨

하지만 막상 도커를 사용하다 보면 수많은 명령어와 옵션들 때문에 혼란스러울 때가 많습니다. docker run, docker build, docker ps… 도대체 어떤 명령어를 언제 써야 하는지, 어떤 옵션이 유용한지 헷갈리셨다면 잘 찾아오셨습니다!

이 글에서는 실무에서 가장 많이 사용하고, 알아두면 작업 효율을 몇 배나 높여줄 도커 명령어들을 치트 시트 형태로 정리해 보았습니다. 각 명령어의 핵심 기능과 함께 유용한 옵션, 그리고 바로 따라 해볼 수 있는 예시까지 꼼꼼하게 담았으니, 이 글 하나로 여러분의 도커 실력을 한 단계 업그레이드할 수 있을 거예요. 💪


💡 도커 명령어의 기본 구조

도커 명령어는 대부분 다음의 구조를 따릅니다.

docker [관리 객체] [명령어] [옵션] [인자]

예시:

  • docker run -d -p 80:80 nginx: runnginx 이미지를 기반으로 컨테이너를 실행하는 명령어입니다.
  • docker ps -a: ps는 컨테이너 목록을 보여주는 명령어입니다.

1. 컨테이너 기본 조작 🏃‍♀️

도커 사용의 핵심은 바로 컨테이너입니다. 컨테이너를 생성하고, 실행하고, 중지하고, 제거하는 가장 기본적인 명령어들을 알아봅시다.

1.1. 컨테이너 실행하기: docker run

가장 중요한 명령어입니다! 이미지를 기반으로 새로운 컨테이너를 생성하고 실행합니다.

  • 기본 문법: docker run [옵션] <이미지 이름> [명령어]

  • 자주 쓰는 옵션:

    • -d, --detach: 백그라운드에서 컨테이너 실행 (데몬 모드).
    • -p, --publish <호스트 포트>:<컨테이너 포트>: 호스트와 컨테이너 포트 연결.
    • --name <이름>: 컨테이너에 이름을 부여 (지정하지 않으면 무작위 이름 부여).
    • -v, --volume <호스트 경로>:<컨테이너 경로>: 볼륨 마운트 (데이터 영속성).
    • -it, --interactive --tty: 컨테이너와 상호작용 가능한 터미널 연결 (Bash/Shell 접속 시).
    • --rm: 컨테이너 종료 시 자동으로 컨테이너 제거.
    • --env, -e <키=값>: 환경 변수 설정.
    • --network <네트워크 이름>: 특정 네트워크에 컨테이너 연결.
  • 예시:

    • Nginx 웹 서버 실행 (백그라운드, 80번 포트 연결, 이름 지정):

      docker run -d -p 80:80 --name my-nginx nginx:latest

      👉 my-nginx라는 이름으로 nginx:latest 이미지를 백그라운드에서 실행하고, 호스트의 80번 포트로 접속하면 컨테이너의 80번 포트와 연결됩니다.

    • Ubuntu 컨테이너 실행 후 Bash 쉘 접속:

      docker run -it --name my-ubuntu ubuntu:latest bash

      👉 my-ubuntu라는 이름으로 ubuntu:latest 이미지를 실행하고, bash 쉘로 바로 접속합니다. 컨테이너를 나갈 때는 exit를 입력합니다.

    • 로컬 프로젝트 파일을 컨테이너에 마운트하여 Python 앱 실행:

      # 현재 디렉토리의 app 폴더를 컨테이너의 /app으로 마운트
      docker run -it --rm -v $(pwd)/app:/app python:3.9-slim python /app/main.py

      👉 $(pwd)/app은 현재 디렉토리 아래의 app 폴더를 의미합니다. 컨테이너가 종료되면 자동으로 제거됩니다 (--rm).

1.2. 실행 중인 컨테이너 목록 확인하기: docker ps

현재 실행 중인 컨테이너들의 정보를 보여줍니다.

  • 기본 문법: docker ps [옵션]

  • 자주 쓰는 옵션:

    • -a, --all: 모든 컨테이너 (실행 중이거나 종료된 컨테이너 모두) 표시.
    • -s, --size: 파일 크기 포함하여 표시.
    • -f, --filter <필터>: 특정 조건으로 필터링 (예: name=my-nginx, status=exited).
  • 예시:

    docker ps         # 현재 실행 중인 컨테이너 목록
    docker ps -a      # 모든 컨테이너 (실행, 중지 등) 목록
    docker ps -f "name=my-nginx" # 이름이 my-nginx인 컨테이너만 필터링

1.3. 컨테이너 시작/중지/재시작/강제 종료: docker start, docker stop, docker restart, docker kill

컨테이너의 상태를 제어하는 명령어입니다.

  • 기본 문법: docker start/stop/restart/kill <컨테이너 ID 또는 이름>
  • 예시:
    docker stop my-nginx   # my-nginx 컨테이너 중지
    docker start my-nginx  # my-nginx 컨테이너 다시 시작
    docker restart my-nginx # my-nginx 컨테이너 재시작
    docker kill my-nginx   # my-nginx 컨테이너 강제 종료 (stop보다 빠름)

    ⚠️ killstop보다 빠르게 컨테이너를 종료하지만, 컨테이너 내부 프로세스가 정상적으로 종료될 시간을 주지 않습니다.

1.4. 컨테이너 제거하기: docker rm

중지된 컨테이너를 시스템에서 완전히 제거합니다.

  • 기본 문법: docker rm [옵션] <컨테이너 ID 또는 이름>

  • 자주 쓰는 옵션:

    • -f, --force: 실행 중인 컨테이너도 강제로 제거.
    • -v, --volumes: 컨테이너와 연결된 익명 볼륨도 함께 제거.
  • 예시:

    docker rm my-nginx       # my-nginx 컨테이너 제거 (중지된 상태여야 함)
    docker rm -f my-nginx    # my-nginx 컨테이너 강제 제거 (실행 중이어도 가능)
    
    # 모든 중지된 컨테이너 한 번에 제거 (자주 사용되는 팁!)
    docker rm $(docker ps -aq)

    💡 팁: docker ps -aq는 모든 컨테이너(All)의 ID만(Quiet) 출력합니다.

1.5. 실행 중인 컨테이너 내부에서 명령어 실행: docker exec

이미 실행 중인 컨테이너 내부로 접속하여 특정 명령어를 실행할 때 사용합니다. 디버깅이나 설정 변경 시 매우 유용합니다.

  • 기본 문법: docker exec [옵션] <컨테이너 ID 또는 이름> <실행할 명령어>

  • 자주 쓰는 옵션:

    • -it: 상호작용 가능한 터미널 연결.
  • 예시:

    • Nginx 컨테이너 내부에 Bash 쉘 접속:
      docker exec -it my-nginx bash
      # 접속 후 ls, pwd 등 리눅스 명령어를 실행하고 exit로 나옵니다.
    • Nginx 컨테이너 내부에서 웹 서버 상태 확인:
      docker exec my-nginx nginx -t

1.6. 컨테이너에 연결: docker attach

docker run으로 실행된 컨테이너의 표준 입출력에 연결합니다. 주로 docker run -it로 실행된 컨테이너에 다시 접속할 때 사용합니다.

  • 기본 문법: docker attach <컨테이너 ID 또는 이름>
  • 예시:
    docker attach my-ubuntu

    ⚠️ 주의: attach는 컨테이너의 메인 프로세스에 연결되므로, 해당 프로세스가 종료되면 컨테이너도 종료될 수 있습니다. 보통은 exec가 더 유용합니다.


2. 이미지 관리 📦

컨테이너의 템플릿 역할을 하는 이미지를 관리하는 명령어들입니다.

2.1. 이미지 다운로드: docker pull

도커 허브(Docker Hub)나 다른 컨테이너 레지스트리에서 이미지를 다운로드합니다.

  • 기본 문법: docker pull <이미지 이름>:<태그> (태그를 생략하면 latest가 기본)
  • 예시:
    docker pull ubuntu:20.04   # Ubuntu 20.04 이미지 다운로드
    docker pull alpine         # Alpine 리눅스 최신 버전 다운로드

2.2. 로컬 이미지 목록 확인: docker images 또는 docker image ls

로컬 시스템에 다운로드되어 있거나 빌드된 이미지들의 목록을 보여줍니다.

  • 기본 문법: docker images [옵션]
  • 예시:
    docker images          # 모든 이미지 목록
    docker images -a       # 중간 빌드 단계의 이미지까지 모두 표시
    docker images -f "dangling=true" # 태그가 없는 (dangling) 이미지 필터링

2.3. 이미지 빌드하기: docker build

Dockerfile을 사용하여 사용자 정의 이미지를 생성합니다.

  • 기본 문법: docker build [옵션] <Dockerfile이 있는 경로>

  • 자주 쓰는 옵션:

    • -t, --tag <이름>:<태그>: 빌드된 이미지에 이름과 태그 부여.
    • -f, --file <Dockerfile 경로>: Dockerfile 파일의 이름을 Dockerfile 외 다른 이름으로 지정했을 때 사용.
    • --no-cache: 캐시를 사용하지 않고 새로 빌드 (문제 해결 시 유용).
  • 예시:

    • 현재 디렉토리의 Dockerfile로 이미지 빌드:
      # Dockerfile이 있는 디렉토리에서 실행
      docker build -t my-app:1.0 .

      👉 .은 현재 디렉토리를 빌드 컨텍스트로 지정합니다.

2.4. 이미지 태그 변경: docker tag

기존 이미지에 새로운 태그를 추가합니다.

  • 기본 문법: docker tag <원본 이미지>:<원본 태그> <새로운 이미지>:<새로운 태그>
  • 예시:
    docker tag my-app:1.0 my-app:latest
    docker tag my-app:latest myregistry.com/my-org/my-app:1.0 # 레지스트리 주소 추가

2.5. 이미지 제거하기: docker rmi

로컬 시스템에서 이미지를 제거합니다.

  • 기본 문법: docker rmi [옵션] <이미지 ID 또는 이름>

  • 자주 쓰는 옵션:

    • -f, --force: 해당 이미지를 사용하는 컨테이너가 있어도 강제로 제거.
  • 예시:

    docker rmi my-app:1.0    # my-app:1.0 이미지 제거
    docker rmi -f my-app:latest # my-app:latest 이미지를 사용하는 컨테이너가 있어도 강제 제거

    ⚠️ 이미지를 기반으로 생성된 컨테이너가 실행 중이거나 존재하는 경우, 해당 이미지는 제거할 수 없습니다. 먼저 컨테이너를 중지하고 제거해야 합니다.

2.6. 이미지 푸시: docker push

로컬 이미지를 도커 레지스트리(예: Docker Hub)에 업로드합니다.

  • 기본 문법: docker push <이미지 이름>:<태그>
  • 예시:
    # 먼저 docker login으로 로그인해야 합니다.
    docker push myregistry.com/my-org/my-app:1.0

3. 데이터 관리 (볼륨) 💾

컨테이너가 삭제되어도 데이터가 사라지지 않도록 영속성을 보장하는 방법인 볼륨 관리는 실무에서 필수적입니다.

3.1. 볼륨 생성: docker volume create

이름 있는(named) 볼륨을 생성합니다.

  • 기본 문법: docker volume create <볼륨 이름>
  • 예시:
    docker volume create my-data-volume

3.2. 볼륨 목록 확인: docker volume ls

생성된 볼륨들의 목록을 보여줍니다.

  • 기본 문법: docker volume ls
  • 예시:
    docker volume ls

3.3. 볼륨 정보 확인: docker volume inspect

특정 볼륨의 자세한 정보를 확인합니다.

  • 기본 문법: docker volume inspect <볼륨 이름>
  • 예시:
    docker volume inspect my-data-volume

3.4. 볼륨 제거: docker volume rm

볼륨을 제거합니다.

  • 기본 문법: docker volume rm <볼륨 이름>

  • 예시:

    docker volume rm my-data-volume

    ⚠️ 주의: 볼륨 내의 모든 데이터가 함께 삭제됩니다.

  • 컨테이너 실행 시 볼륨 사용:

    # 이름 있는 볼륨 사용
    docker run -d --name my-db -v my-data-volume:/var/lib/mysql mysql:8.0
    
    # 바인드 마운트 (호스트의 특정 경로와 컨테이너 경로 연결)
    docker run -d --name my-app-data -v $(pwd)/data:/app/data my-custom-app

    💡 팁: 바인드 마운트는 개발 환경에서 소스 코드를 바로 반영하며 작업할 때 유용하고, 이름 있는 볼륨은 주로 데이터베이스처럼 영속적인 데이터 저장에 권장됩니다.


4. 네트워크 관리 🌐

컨테이너 간의 통신, 또는 컨테이너와 외부 네트워크 간의 통신을 관리하는 명령어들입니다.

4.1. 네트워크 생성: docker network create

사용자 정의 네트워크를 생성합니다. (기본적으로 bridge 네트워크가 제공됩니다.)

  • 기본 문법: docker network create [옵션] <네트워크 이름>

  • 자주 쓰는 옵션:

    • --driver <드라이버>: 네트워크 드라이버 지정 (기본값: bridge, 외 host, overlay 등).
    • --subnet <서브넷>: 네트워크의 IP 범위 지정.
  • 예시:

    docker network create my-app-network

4.2. 네트워크 목록 확인: docker network ls

생성된 네트워크들의 목록을 보여줍니다.

  • 기본 문법: docker network ls
  • 예시:
    docker network ls

4.3. 네트워크 정보 확인: docker network inspect

특정 네트워크의 자세한 정보를 확인합니다. 연결된 컨테이너 정보도 볼 수 있습니다.

  • 기본 문법: docker network inspect <네트워크 이름>
  • 예시:
    docker network inspect my-app-network

4.4. 컨테이너를 네트워크에 연결/해제: docker network connect, docker network disconnect

실행 중인 컨테이너를 특정 네트워크에 연결하거나 해제합니다.

  • 기본 문법:
    • docker network connect <네트워크 이름> <컨테이너 ID 또는 이름>
    • docker network disconnect <네트워크 이름> <컨테이너 ID 또는 이름>
  • 예시:

    docker run -d --name web-server --network my-app-network nginx:latest
    docker run -d --name api-server --network my-app-network node:18-alpine
    
    # 웹 서버가 API 서버에 이름으로 접근 가능: http://api-server:3000
    
    docker network disconnect my-app-network api-server

4.5. 네트워크 제거: docker network rm

네트워크를 제거합니다.

  • 기본 문법: docker network rm <네트워크 이름>
  • 예시:
    docker network rm my-app-network

5. 컨테이너 로그 및 검사 🔍

컨테이너의 상태를 확인하고 문제를 진단하는 데 유용한 명령어들입니다.

5.1. 컨테이너 로그 확인: docker logs

컨테이너에서 발생하는 표준 출력(stdout)과 표준 에러(stderr)를 확인합니다. 디버깅에 필수적입니다.

  • 기본 문법: docker logs [옵션] <컨테이너 ID 또는 이름>

  • 자주 쓰는 옵션:

    • -f, --follow: 실시간으로 로그를 계속해서 출력.
    • --tail <숫자>: 마지막 N줄만 출력.
    • -t, --timestamps: 타임스탬프와 함께 출력.
  • 예시:

    docker logs my-nginx         # my-nginx 컨테이너의 모든 로그
    docker logs -f my-nginx      # my-nginx 컨테이너의 실시간 로그
    docker logs --tail 100 my-nginx # my-nginx 컨테이너의 마지막 100줄 로그

5.2. 컨테이너/이미지/볼륨/네트워크 상세 정보 확인: docker inspect

도커 객체(컨테이너, 이미지, 볼륨, 네트워크 등)의 모든 상세 정보를 JSON 형식으로 출력합니다.

  • 기본 문법: docker inspect <객체 ID 또는 이름>
  • 예시:
    docker inspect my-nginx       # my-nginx 컨테이너의 상세 정보
    docker inspect nginx:latest   # nginx:latest 이미지의 상세 정보
    docker inspect my-app-network # my-app-network 네트워크의 상세 정보

    💡 팁: 특정 정보만 추출하고 싶다면 jq 같은 JSON 파서를 함께 사용하면 좋습니다. 예: docker inspect my-nginx | jq '.[0].NetworkSettings.IPAddress'


6. 리소스 관리 및 통계 📊

컨테이너의 리소스 사용량을 모니터링하고, 내부 프로세스를 확인합니다.

6.1. 컨테이너 리소스 사용량 실시간 확인: docker stats

실행 중인 컨테이너들의 CPU, 메모리, 네트워크 I/O 등 리소스 사용량을 실시간으로 보여줍니다.

  • 기본 문법: docker stats [옵션] [컨테이너 ID 또는 이름...]

  • 자주 쓰는 옵션:

    • --no-stream: 한 번만 정보를 출력하고 종료.
  • 예시:

    docker stats               # 모든 실행 중인 컨테이너
    docker stats my-nginx my-db # 특정 컨테이너만

6.2. 컨테이너 내부 프로세스 확인: docker top

컨테이너 내부에서 실행 중인 프로세스 목록을 보여줍니다.

  • 기본 문법: docker top <컨테이너 ID 또는 이름>
  • 예시:
    docker top my-nginx

7. 정리 및 문제 해결 🧹

도커 환경을 깨끗하게 유지하고, 문제가 발생했을 때 진단하는 데 유용한 명령어들입니다.

7.1. 도커 시스템 정리: docker system prune

사용되지 않는 모든 도커 객체(중지된 컨테이너, 사용되지 않는 이미지, 네트워크, 빌드 캐시 등)를 한 번에 제거합니다. 디스크 공간 확보에 매우 유용합니다.

  • 기본 문법: docker system prune [옵션]
  • 자주 쓰는 옵션:
    • -a, --all: 모든 사용되지 않는 이미지 (dangling 뿐만 아니라 사용되지 않는 모든 이미지) 제거.
    • --volumes: 사용되지 않는 볼륨까지 함께 제거 (기본적으로 볼륨은 제거하지 않음).
  • 예시:
    docker system prune          # 중지된 컨테이너, dangling 이미지, 사용되지 않는 네트워크, 빌드 캐시 제거
    docker system prune -a       # 위 항목 + 사용되지 않는 모든 이미지 제거
    docker system prune --volumes # 위 항목 + 사용되지 않는 볼륨 제거 (가장 강력한 정리)
    docker system prune -a --volumes # 가장 강력한 전체 정리

    ⚠️ 주의: 이 명령어를 실행하면 많은 리소스가 영구적으로 삭제됩니다. 신중하게 사용하세요.

7.2. 이미지 빌드 히스토리 확인: docker history

이미지가 어떤 레이어들을 거쳐 빌드되었는지 확인합니다. 이미지 크기를 줄이거나 빌드 문제를 해결할 때 유용합니다.

  • 기본 문법: docker history <이미지 ID 또는 이름>
  • 예시:
    docker history my-app:1.0

7.3. 도커 이벤트 실시간 확인: docker events

도커 데몬에서 발생하는 모든 이벤트(컨테이너 생성/시작/종료, 이미지 다운로드 등)를 실시간으로 스트리밍하여 보여줍니다.

  • 기본 문법: docker events [옵션]
  • 예시:
    docker events

8. Docker Compose: 다중 컨테이너 애플리케이션 관리 🤝

실무에서는 하나의 컨테이너만으로 애플리케이션을 구성하는 경우는 드뭅니다. 웹 서버, 데이터베이스, 백엔드 API 등 여러 서비스가 유기적으로 연결되어 작동하죠. 이럴 때 Docker Compose를 사용하면 여러 컨테이너를 YAML 파일 하나로 정의하고 관리할 수 있어 엄청나게 편리합니다.

8.1. docker-compose.yml 파일 작성 예시

# docker-compose.yml
version: '3.8' # Docker Compose 파일 형식 버전

services:
  web: # 웹 서비스 (Nginx)
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro # 호스트의 nginx.conf를 읽기 전용으로 마운트
    depends_on: # 이 서비스가 시작되기 전에 의존하는 서비스가 시작되어야 함
      - app

  app: # 백엔드 애플리케이션 서비스 (Node.js 예시)
    build: . # 현재 디렉토리의 Dockerfile로 이미지 빌드
    ports:
      - "3000:3000"
    volumes:
      - .:/app # 현재 디렉토리를 컨테이너의 /app으로 마운트 (개발 시 코드 변경 자동 반영)
    environment: # 환경 변수 설정
      - NODE_ENV=development
      - DB_HOST=db
    depends_on:
      - db

  db: # 데이터베이스 서비스 (MySQL 예시)
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: mysecretpassword
      MYSQL_DATABASE: myapp_db
    volumes:
      - db_data:/var/lib/mysql # 영속적인 데이터 저장을 위한 볼륨 마운트

volumes: # 사용할 볼륨 정의
  db_data:

8.2. Docker Compose 주요 명령어

  • 애플리케이션 실행: docker-compose up docker-compose.yml 파일에 정의된 모든 서비스를 빌드하고 시작합니다.

    • 기본 문법: docker-compose up [옵션]

    • 자주 쓰는 옵션:

      • -d, --detach: 백그라운드에서 실행.
      • --build: 이미지 빌드를 강제로 다시 수행.
      • --force-recreate: 컨테이너를 강제로 다시 생성.
    • 예시:

      docker-compose up -d     # 백그라운드에서 모든 서비스 시작
      docker-compose up --build # 이미지 다시 빌드 후 서비스 시작
  • 애플리케이션 중지 및 제거: docker-compose down docker-compose.yml 파일에 정의된 모든 컨테이너와 네트워크를 중지하고 제거합니다.

    • 기본 문법: docker-compose down [옵션]

    • 자주 쓰는 옵션:

      • --volumes, -v: 서비스에서 사용한 볼륨까지 함께 제거.
      • --rmi all: 사용된 이미지를 모두 제거.
    • 예시:

      docker-compose down        # 컨테이너와 네트워크 중지 및 제거
      docker-compose down -v     # 컨테이너, 네트워크, 그리고 볼륨까지 제거
  • 서비스 상태 확인: docker-compose ps 현재 실행 중인 서비스들의 상태를 보여줍니다.

    • 기본 문법: docker-compose ps
    • 예시:
      docker-compose ps
  • 서비스 로그 확인: docker-compose logs 특정 서비스 또는 모든 서비스의 로그를 확인합니다.

    • 기본 문법: docker-compose logs [옵션] [서비스 이름...]

    • 자주 쓰는 옵션:

      • -f, --follow: 실시간 로그 스트리밍.
    • 예시:

      docker-compose logs         # 모든 서비스의 로그
      docker-compose logs -f app  # app 서비스의 실시간 로그
  • 서비스 내부에서 명령어 실행: docker-compose exec 특정 서비스의 컨테이너 내부에서 명령어를 실행합니다. docker exec와 유사합니다.

    • 기본 문법: docker-compose exec [옵션] <서비스 이름> <실행할 명령어>

    • 자주 쓰는 옵션:

      • -it: 상호작용 가능한 터미널 연결.
    • 예시:

      docker-compose exec app bash # app 서비스 컨테이너 내부로 쉘 접속
      docker-compose exec db mysql -u root -p # db 서비스에서 MySQL 클라이언트 실행

맺음말 ✨

지금까지 실무에서 바로 활용할 수 있는 도커 명령어들을 자세히 살펴보았습니다. 컨테이너, 이미지, 볼륨, 네트워크 관리부터 다중 컨테이너 애플리케이션을 위한 Docker Compose까지, 이 명령어들만 제대로 익혀도 도커를 훨씬 효율적으로 사용할 수 있을 거예요.

가장 좋은 학습 방법은 직접 명령어를 입력해보고, 각 옵션이 어떤 결과를 가져오는지 눈으로 확인하는 것입니다. 처음에는 낯설게 느껴질 수 있지만, 꾸준히 연습하다 보면 어느새 도커가 여러분의 든든한 동반자가 되어줄 것입니다. 💻

이 치트 시트가 여러분의 도커 여정에 큰 도움이 되기를 바랍니다! 궁금한 점이나 더 유용한 팁이 있다면 언제든지 댓글로 공유해주세요! 다음에도 더 유익한 정보로 찾아오겠습니다. 해피 도커링! 🎉

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다