G: 안녕하세요, 개발자 및 IT 실무자 여러분! 🚀
오늘날 소프트웨어 개발과 배포 환경에서 도커(Docker)는 선택이 아닌 필수가 되어가고 있습니다. “내 컴퓨터에서는 잘 되는데, 서버에서는 왜 안돼?” 같은 지긋지긋한 문제를 해결해주고, 개발부터 배포까지 일관된 환경을 제공하여 효율성을 극대화시켜주죠. ✨
하지만 막상 도커를 사용하다 보면 수많은 명령어와 옵션들 때문에 혼란스러울 때가 많습니다. docker run
, docker build
, docker ps
… 도대체 어떤 명령어를 언제 써야 하는지, 어떤 옵션이 유용한지 헷갈리셨다면 잘 찾아오셨습니다!
이 글에서는 실무에서 가장 많이 사용하고, 알아두면 작업 효율을 몇 배나 높여줄 도커 명령어들을 치트 시트 형태로 정리해 보았습니다. 각 명령어의 핵심 기능과 함께 유용한 옵션, 그리고 바로 따라 해볼 수 있는 예시까지 꼼꼼하게 담았으니, 이 글 하나로 여러분의 도커 실력을 한 단계 업그레이드할 수 있을 거예요. 💪
💡 도커 명령어의 기본 구조
도커 명령어는 대부분 다음의 구조를 따릅니다.
docker [관리 객체] [명령어] [옵션] [인자]
예시:
docker run -d -p 80:80 nginx
:run
은nginx
이미지를 기반으로 컨테이너를 실행하는 명령어입니다.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보다 빠름)
⚠️
kill
은stop
보다 빠르게 컨테이너를 종료하지만, 컨테이너 내부 프로세스가 정상적으로 종료될 시간을 주지 않습니다.
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
- Nginx 컨테이너 내부에 Bash 쉘 접속:
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 .
👉
.
은 현재 디렉토리를 빌드 컨텍스트로 지정합니다.
- 현재 디렉토리의 Dockerfile로 이미지 빌드:
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까지, 이 명령어들만 제대로 익혀도 도커를 훨씬 효율적으로 사용할 수 있을 거예요.
가장 좋은 학습 방법은 직접 명령어를 입력해보고, 각 옵션이 어떤 결과를 가져오는지 눈으로 확인하는 것입니다. 처음에는 낯설게 느껴질 수 있지만, 꾸준히 연습하다 보면 어느새 도커가 여러분의 든든한 동반자가 되어줄 것입니다. 💻
이 치트 시트가 여러분의 도커 여정에 큰 도움이 되기를 바랍니다! 궁금한 점이나 더 유용한 팁이 있다면 언제든지 댓글로 공유해주세요! 다음에도 더 유익한 정보로 찾아오겠습니다. 해피 도커링! 🎉