G: 안녕하세요, 개발자 여러분! 👨💻👩💻 현대 개발 환경에서 Docker는 선택이 아닌 필수가 되어가고 있습니다. 가볍고 독립적인 컨테이너를 통해 애플리케이션을 효율적으로 배포하고 관리할 수 있게 해주기 때문이죠. 하지만 처음 접하는 분들에게는 수많은 명령어들이 낯설게 느껴질 수 있습니다.
걱정 마세요! 이 가이드 하나면 Docker의 핵심 개념부터 필수 명령어, 그리고 더 나아가 실무에서 유용하게 쓰일 고급 명령어까지 완벽하게 마스터할 수 있을 거예요. ✨
자, 그럼 Docker의 신세계로 함께 떠나볼까요? 🚢
💡 들어가기 전에: Docker 기본 개념 복습!
명령어를 배우기 전에 Docker의 핵심 구성 요소를 간단히 짚고 넘어갑시다. 이 개념들을 이해하고 나면 명령어들이 훨씬 쉽게 다가올 거예요!
- 이미지 (Image): 🖼️ 애플리케이션 실행에 필요한 모든 것(코드, 런타임, 시스템 도구, 라이브러리 등)을 포함하는 읽기 전용 템플릿입니다. ‘붕어빵 틀’이라고 생각하면 쉬워요.
- 컨테이너 (Container): 📦 이미지를 실행한 독립적인 공간입니다. 이미지는 정적이지만, 컨테이너는 동적으로 실행되고 데이터를 생성할 수 있습니다. ‘붕어빵’ 그 자체죠!
- 레지스트리 (Registry): ☁️ Docker 이미지를 저장하고 공유하는 곳입니다. 가장 대표적인 곳이 바로 Docker Hub입니다.
- 볼륨 (Volume): 💾 컨테이너와 호스트(실제 서버) 간에 데이터를 공유하고, 컨테이너가 삭제되어도 데이터가 보존될 수 있도록 돕는 메커니즘입니다. 컨테이너는 휘발성이 강하기 때문에 데이터 영속성을 위해 필수적이에요.
- 네트워크 (Network): 🔗 여러 컨테이너들이 서로 통신할 수 있도록 해주는 가상 네트워크 환경입니다.
1. 이미지 관리 명령어: 컨테이너의 ‘원천’을 다루다! 🖼️
컨테이너를 만들기 위해서는 먼저 이미지가 필요하겠죠? 이미지와 관련된 필수 명령어들을 알아봅시다.
📥 docker pull
: 이미지 다운로드
Docker Hub나 다른 레지스트리에서 이미지를 로컬로 가져오는 명령어입니다.
- 형식:
docker pull [옵션] [이미지 이름][:태그]
- 예시:
- 최신 Ubuntu 이미지 다운로드:
docker pull ubuntu:latest
- Nginx 웹 서버 이미지 다운로드 (태그를 명시하지 않으면
latest
가 기본값):docker pull nginx
- 특정 버전의 Node.js 이미지 다운로드:
docker pull node:16-alpine
- 최신 Ubuntu 이미지 다운로드:
🏗️ docker build
: Dockerfile로 이미지 생성
직접 정의한 Dockerfile
을 이용해 사용자 지정 이미지를 생성하는 명령어입니다.
- 형식:
docker build [옵션] [빌드 컨텍스트 경로]
- 예시:
- 현재 디렉터리(
.
)의Dockerfile
을 사용하여my-web-app
이라는 이름과1.0
태그로 이미지 생성:docker build -t my-web-app:1.0 .
- 빌드 캐시를 사용하지 않고 이미지 생성:
docker build --no-cache -t my-web-app:1.0 .
- 팁:
-t
옵션은 이미지의 이름(name)과 태그(tag)를 지정하여 나중에 쉽게 찾고 사용할 수 있게 해줍니다.
- 현재 디렉터리(
📸 docker images
또는 docker image ls
: 로컬 이미지 목록 확인
로컬 시스템에 다운로드되거나 빌드된 이미지들을 보여줍니다.
- 형식:
docker images [옵션]
- 예시:
- 모든 로컬 이미지 목록 확인:
docker images
- 중간 빌드 이미지(dangling images)까지 포함하여 모든 이미지 목록 확인:
docker images -a
- 특정 이미지 이름으로 필터링하여 목록 확인:
docker images nginx
- 모든 로컬 이미지 목록 확인:
🗑️ docker rmi
또는 docker image rm
: 이미지 삭제
로컬 시스템에서 더 이상 필요 없는 이미지를 삭제합니다. 컨테이너가 해당 이미지를 사용 중이면 삭제되지 않습니다.
- 형식:
docker rmi [옵션] [이미지 이름/ID]
- 예시:
ubuntu:latest
이미지 삭제:docker rmi ubuntu:latest
- 이미지 ID로 삭제 (부분 ID도 가능):
docker rmi 2a2e4e1a123f # 이미지 ID의 앞 몇 글자로도 삭제 가능
- 컨테이너가 사용 중이어도 강제로 삭제: (주의: 실행 중인 컨테이너에 영향을 줄 수 있음)
docker rmi -f my-web-app:1.0
2. 컨테이너 관리 명령어: 애플리케이션을 ‘실행’하다! 📦
이미지를 통해 컨테이너를 생성하고, 실행하고, 관리하는 명령어는 Docker를 사용하는 가장 기본적인 과정입니다.
▶️ docker run
: 컨테이너 생성 및 실행
이미지를 기반으로 새로운 컨테이너를 생성하고 실행하는 가장 중요하고 많이 사용되는 명령어입니다.
- 형식:
docker run [옵션] [이미지 이름][:태그] [실행할 명령어]
- 주요 옵션:
-d
,--detach
: 컨테이너를 백그라운드에서 실행 (데몬 모드).-p
,--publish
: 호스트 포트와 컨테이너 포트를 연결 (포트 포워딩).--name
: 컨테이너에 이름을 부여하여 나중에 쉽게 참조할 수 있게 함.-it
: 컨테이너와 상호작용할 수 있는 터미널(TTY)을 할당하고, 표준 입력(interactive)을 열어둠.--rm
: 컨테이너가 종료될 때 자동으로 삭제되도록 함. 일회성 작업에 유용.-v
,--volume
: 볼륨을 연결하여 데이터 영속성 확보.--network
: 컨테이너가 사용할 네트워크 지정.-e
,--env
: 컨테이너 내부에 환경 변수 설정.
- 예시:
- Nginx 웹 서버를 백그라운드로 실행하고, 호스트의 80번 포트를 컨테이너의 80번 포트에 연결하며,
my-nginx-web
이라는 이름 부여:docker run -d -p 80:80 --name my-nginx-web nginx
- Ubuntu 컨테이너를 실행하여 bash 쉘에 접속:
docker run -it ubuntu bash
hello-world
컨테이너를 실행하고, 종료되면 자동으로 삭제:docker run --rm hello-world
my-data
볼륨을 컨테이너의/app/data
경로에 마운트하며 컨테이너 실행:docker run -d -v my-data:/app/data --name my-app-with-data my-app:1.0
- Nginx 웹 서버를 백그라운드로 실행하고, 호스트의 80번 포트를 컨테이너의 80번 포트에 연결하며,
📋 docker ps
또는 docker container ls
: 실행 중인 컨테이너 목록 확인
현재 실행 중인 컨테이너들의 목록을 보여줍니다.
- 형식:
docker ps [옵션]
- 주요 옵션:
-a
,--all
: 모든 컨테이너(실행 중이거나 종료된 컨테이너 모두)를 보여줌.-s
,--size
: 컨테이너의 크기를 포함하여 보여줌.-q
,--quiet
: 컨테이너 ID만 보여줌. (다른 명령어와 조합할 때 유용)
- 예시:
- 현재 실행 중인 컨테이너 목록 확인:
docker ps
- 모든 컨테이너(실행 + 중지) 목록 확인:
docker ps -a
- 종료된 모든 컨테이너 ID 확인 (삭제 전 확인용):
docker ps -a -q --filter "status=exited"
- 현재 실행 중인 컨테이너 목록 확인:
🟢 docker start
: 정지된 컨테이너 시작
이전에 stop
명령으로 정지시킨 컨테이너를 다시 시작합니다.
- 형식:
docker start [컨테이너 이름/ID]
- 예시:
docker start my-nginx-web
🛑 docker stop
: 실행 중인 컨테이너 정지
실행 중인 컨테이너를 정지시킵니다. 데이터는 손실되지 않고 컨테이너 상태가 유지됩니다.
- 형식:
docker stop [컨테이너 이름/ID]
- 예시:
docker stop my-nginx-web
🔄 docker restart
: 컨테이너 재시작
컨테이너를 정지했다가 다시 시작합니다. 주로 설정 변경 후 적용할 때 사용됩니다.
- 형식:
docker restart [컨테이너 이름/ID]
- 예시:
docker restart my-nginx-web
❌ docker rm
또는 docker container rm
: 컨테이너 삭제
정지된 컨테이너를 삭제합니다. 실행 중인 컨테이너는 삭제할 수 없으며, 먼저 stop
해야 합니다.
- 형식:
docker rm [옵션] [컨테이너 이름/ID]
- 주요 옵션:
-f
,--force
: 실행 중인 컨테이너도 강제로 삭제 (주의!).-v
,--volumes
: 컨테이너와 연결된 무명 볼륨(anonymous volumes)도 함께 삭제.
- 예시:
my-nginx-web
컨테이너 삭제:docker rm my-nginx-web
- 종료된 모든 컨테이너 한 번에 삭제:
docker rm $(docker ps -a -q)
📜 docker logs
: 컨테이너 로그 확인
컨테이너의 표준 출력(stdout)과 표준 에러(stderr)를 보여줍니다. 문제 해결 시 필수적입니다.
- 형식:
docker logs [옵션] [컨테이너 이름/ID]
- 주요 옵션:
-f
,--follow
: 실시간으로 로그를 계속 보여줌 (tail -f와 유사).--tail [숫자]
: 로그의 마지막 N줄만 보여줌.--since [시간]
: 특정 시간 이후의 로그만 보여줌.
- 예시:
my-nginx-web
컨테이너의 모든 로그 확인:docker logs my-nginx-web
my-nginx-web
컨테이너의 로그를 실시간으로 확인:docker logs -f my-nginx-web
my-nginx-web
컨테이너의 로그 중 마지막 20줄만 확인:docker logs --tail 20 my-nginx-web
🔗 docker exec
: 실행 중인 컨테이너 내부 명령어 실행
실행 중인 컨테이너 내부로 들어가 추가 명령어를 실행할 때 사용합니다. 디버깅이나 컨테이너 내부 환경 확인에 매우 유용합니다.
- 형식:
docker exec [옵션] [컨테이너 이름/ID] [실행할 명령어]
- 주요 옵션:
-it
: 상호작용 터미널 모드 (컨테이너 내에서 쉘 명령을 직접 입력할 때 필수).
- 예시:
my-nginx-web
컨테이너 내부로 들어가 bash 쉘 실행:docker exec -it my-nginx-web bash
my-nginx-web
컨테이너 내부의/etc/nginx
디렉터리 파일 목록 확인:docker exec my-nginx-web ls /etc/nginx
3. 볼륨 관리 명령어: 데이터 영속성 확보! 💾
컨테이너는 기본적으로 휘발성이기 때문에, 중요한 데이터는 볼륨을 통해 관리해야 합니다.
➕ docker volume create
: 볼륨 생성
명명된(named) 볼륨을 생성합니다. 이렇게 생성된 볼륨은 여러 컨테이너에서 재사용할 수 있습니다.
- 형식:
docker volume create [볼륨 이름]
- 예시:
docker volume create my-app-data
📊 docker volume ls
: 볼륨 목록 확인
생성된 볼륨들의 목록을 보여줍니다.
- 형식:
docker volume ls [옵션]
- 예시:
docker volume ls
🔍 docker volume inspect
: 볼륨 상세 정보 확인
특정 볼륨의 상세 정보를 JSON 형식으로 보여줍니다. 실제 저장 경로 등을 확인할 수 있습니다.
- 형식:
docker volume inspect [볼륨 이름]
- 예시:
docker volume inspect my-app-data
🗑️ docker volume rm
: 볼륨 삭제
더 이상 사용하지 않는 볼륨을 삭제합니다.
- 형식:
docker volume rm [볼륨 이름]
- 예시:
docker volume rm my-app-data
4. 네트워크 관리 명령어: 컨테이너 간 통신 설정! 🌐
여러 컨테이너가 서로 통신해야 할 때, 사용자 정의 네트워크를 생성하여 관리하면 효율적입니다.
🌐 docker network create
: 네트워크 생성
사용자 정의 브리지 네트워크를 생성합니다.
- 형식:
docker network create [네트워크 이름]
- 예시:
docker network create my-app-network
- 팁:
my-app-network
에 연결된 컨테이너들은 서로 컨테이너 이름으로 통신할 수 있습니다. (예:ping web-container
)
- 팁:
📉 docker network ls
: 네트워크 목록 확인
생성된 네트워크들의 목록을 보여줍니다. bridge
, host
, none
등 기본 네트워크도 함께 보여줍니다.
- 형식:
docker network ls
- 예시:
docker network ls
🔬 docker network inspect
: 네트워크 상세 정보 확인
특정 네트워크의 상세 정보를 JSON 형식으로 보여줍니다. 연결된 컨테이너 정보도 확인할 수 있습니다.
- 형식:
docker network inspect [네트워크 이름]
- 예시:
docker network inspect my-app-network
🗑️ docker network rm
: 네트워크 삭제
더 이상 사용하지 않는 사용자 정의 네트워크를 삭제합니다.
- 형식:
docker network rm [네트워크 이름]
- 예시:
docker network rm my-app-network
5. 고급 및 유틸리티 명령어: Docker 고수의 길로! 🛠️
지금까지 배운 명령어 외에도 Docker를 더욱 효율적으로 사용하고 문제를 해결하는 데 도움이 되는 유용한 명령어들이 있습니다.
🧐 docker inspect
: Docker 객체 상세 정보 확인
이미지, 컨테이너, 볼륨, 네트워크 등 모든 Docker 객체의 매우 상세한 정보를 JSON 형식으로 보여줍니다. 디버깅에 매우 유용합니다.
- 형식:
docker inspect [객체 ID/이름]
- 예시:
my-nginx-web
컨테이너의 모든 정보 확인:docker inspect my-nginx-web
nginx:latest
이미지의 모든 정보 확인:docker inspect nginx:latest
📈 docker stats
: 컨테이너 리소스 사용량 실시간 모니터링
실행 중인 컨테이너들의 CPU 사용량, 메모리 사용량, 네트워크 I/O 등을 실시간으로 보여줍니다.
- 형식:
docker stats [옵션] [컨테이너 ID/이름...]
- 예시:
- 모든 실행 중인 컨테이너의 리소스 사용량 확인:
docker stats
- 특정 컨테이너의 리소스 사용량 확인:
docker stats my-nginx-web
- 모든 실행 중인 컨테이너의 리소스 사용량 확인:
💾 docker system df
: Docker 디스크 사용량 확인
Docker가 사용하고 있는 디스크 공간을 요약해서 보여줍니다. 이미지, 컨테이너, 볼륨 등 각 항목별로 얼마나 공간을 차지하는지 알 수 있습니다.
- 형식:
docker system df
- 예시:
docker system df
🧹 docker system prune
: 불필요한 Docker 객체 일괄 삭제
더 이상 사용되지 않는 이미지, 컨테이너, 볼륨, 네트워크 등을 한 번에 삭제하여 디스크 공간을 확보합니다. 주기적으로 실행하여 시스템을 깨끗하게 유지하는 것이 좋습니다.
- 형식:
docker system prune [옵션]
- 주요 옵션:
-a
,--all
: 모든 사용되지 않는(dangling) 이미지와 참조되지 않는 이미지를 포함하여 삭제.--volumes
: 사용되지 않는 볼륨도 함께 삭제 (주의: 중요한 데이터가 있을 수 있으니 신중하게 사용).
- 예시:
- 종료된 컨테이너, 사용되지 않는 네트워크, dangling 이미지 삭제:
docker system prune
- 모든 사용되지 않는 객체 (dangling 이미지 포함) 및 사용되지 않는 볼륨까지 삭제:
docker system prune -a --volumes
- 경고: 이 명령은 삭제된 데이터를 복구할 수 없으므로, 실행하기 전에 어떤 데이터가 삭제될지 신중하게 확인하세요.
- 종료된 컨테이너, 사용되지 않는 네트워크, dangling 이미지 삭제:
🔒 docker login
/docker logout
: Docker Hub 로그인/로그아웃
Docker Hub나 다른 레지스트리에 로그인하거나 로그아웃합니다. docker push
명령을 사용하기 전에 필요합니다.
- 형식:
docker login docker logout
📤 docker push
: 이미지를 Docker Hub에 업로드
로컬에 빌드한 이미지를 Docker Hub와 같은 원격 레지스트리에 업로드합니다.
- 형식:
docker push [이미지 이름][:태그]
- 예시:
docker push my-username/my-web-app:1.0
- 팁:
docker build
시 이미지 이름을[Docker Hub 사용자명]/[이미지명]:[태그]
형식으로 지정해야 푸시할 수 있습니다.
- 팁:
6. Docker Compose: 멀티 컨테이너 애플리케이션의 오케스트레이션 🎶 (간략 소개)
Docker Compose는 여러 개의 컨테이너를 함께 정의하고 실행하기 위한 도구입니다. 복잡한 마이크로서비스 아키텍처나 웹 애플리케이션(웹 서버, 데이터베이스, 캐시 서버 등)을 구성할 때 YAML 파일 하나로 모든 설정을 관리할 수 있어 매우 편리합니다.
여기서는 Compose의 명령어까지 상세히 다루지는 않지만, Docker의 전문가가 되기 위해서는 docker-compose.yml
파일 작성법과 기본 명령어들을 익히는 것이 필수적입니다.
- 주요 명령어:
docker-compose up
:docker-compose.yml
파일에 정의된 모든 서비스를 빌드하고 시작.docker-compose down
:docker-compose.yml
파일에 정의된 모든 서비스를 중지하고 삭제.
🌟 Docker 마스터를 위한 팁! 💡
- 공식 문서 활용: 📚 Docker 공식 문서는 가장 정확하고 최신 정보를 담고 있습니다. 궁금한 점이 생기면 언제든 찾아보세요.
- 꾸준한 실습: 💪 명령어를 외우려 하지 말고, 직접 컨테이너를 만들고, 실행하고, 지워보면서 익숙해지는 것이 중요합니다. 작은 프로젝트를 Dockerize 해보는 것도 좋은 방법입니다.
- 문제 해결 능력 키우기: 💡
docker logs
,docker inspect
,docker exec
등의 명령어를 활용하여 컨테이너 내부의 문제를 파악하는 연습을 하세요. - 커뮤니티 활용: 🤝 스택 오버플로우, Docker 포럼 등 활발한 커뮤니티에서 궁금증을 해결하고 다른 사람들의 경험을 공유받으세요.
🏁 마무리하며… 🚀
지금까지 Docker의 핵심 개념부터 이미지, 컨테이너, 볼륨, 네트워크 관리 명령어, 그리고 유용한 고급 명령어들까지 자세히 알아보았습니다. 이 가이드를 통해 Docker에 대한 이해가 깊어지고, 자유자재로 Docker를 다룰 수 있는 자신감을 얻으셨기를 바랍니다. ✨
Docker는 단순히 명령어를 아는 것을 넘어, 애플리케이션 배포와 운영 방식을 혁신하는 강력한 도구입니다. 이 여정은 이제 시작일 뿐이니, 꾸준히 학습하고 실습하면서 Docker 전문가로 거듭나시길 응원합니다! 🌟
혹시 궁금한 점이나 더 알고 싶은 내용이 있다면 언제든지 댓글로 남겨주세요! 💬