G: 안녕하세요, 개발자 커뮤니티의 모든 분들! 🧑💻✨ 오늘 우리는 현대 개발의 필수 도구로 자리 잡은 도커(Docker)의 세계로 함께 떠나볼 거예요. “도커, 그게 뭔데?”, “명령어가 너무 많아서 복잡해 보여!”라고 느끼셨던 분들도 걱정 마세요! 이 글은 도커를 처음 접하는 분들이 핵심 명령어를 마스터하고, 자신감을 가지고 도커를 활용할 수 있도록 돕기 위해 작성되었습니다.
도커는 애플리케이션을 개발, 배포, 실행하는 데 필요한 모든 것을 컨테이너라는 독립적인 환경에 담아 관리할 수 있게 해주는 혁신적인 플랫폼입니다. “내 컴퓨터에서는 잘 되는데, 왜 서버에서는 안 될까?”라는 고통스러운 질문에 종지부를 찍어줄 마법 같은 도구죠! 🪄
지금부터 도커의 기본 개념부터 필수 명령어, 그리고 실용적인 활용 팁까지 함께 알아보겠습니다. 준비되셨나요? 🚀
1. 도커, 왜 알아야 할까요? (핵심 개념 이해하기) 🤔
도커 명령어를 배우기 전에, 도커가 무엇을 위해 존재하며 어떤 핵심 개념을 가지고 있는지 잠깐 짚고 넘어갈게요. 이 개념들을 이해하면 명령어가 훨씬 직관적으로 다가올 거예요!
-
이미지 (Image): 🖼️ 애플리케이션 실행에 필요한 모든 것(코드, 런타임, 시스템 도구, 라이브러리 등)을 포함하는 읽기 전용 템플릿입니다. 예를 들어,
ubuntu
이미지,nginx
이미지,mysql
이미지 등을 생각할 수 있습니다. 이미지는 일종의 “소프트웨어 설치 CD”라고 보면 됩니다. -
컨테이너 (Container): 📦 이미지의 실행 가능한 인스턴스입니다. 이미지를 바탕으로 생성되며, 독립적인 환경에서 애플리케이션이 격리되어 실행됩니다. 컨테이너는 가볍고 빠르며, 다른 컨테이너나 호스트 시스템에 영향을 주지 않습니다. “설치 CD로 설치한 실제 프로그램”이라고 생각하세요!
-
레지스트리 (Registry): 📊 도커 이미지를 저장하고 공유하는 공간입니다. 가장 유명한 레지스트리는
Docker Hub
입니다. 마치 GitHub가 코드 저장소인 것처럼, Docker Hub는 이미지 저장소라고 보면 됩니다.
이 세 가지 개념을 이해했다면, 이제 도커의 마법을 부릴 준비가 된 것입니다! ✨
2. 도커 필수 명령어 총정리: 이미지 & 컨테이너 관리 🛠️
자, 이제 실전입니다! 도커 명령어를 기능별로 나누어 알아보겠습니다. 터미널(또는 명령 프롬프트)을 열고 직접 따라 해보시는 것을 강력 추천합니다.
2.1. 이미지 관리 명령어 🖼️
애플리케이션을 실행하려면 먼저 이미지가 필요하겠죠? 이미지를 다루는 방법을 알아봅시다.
-
docker pull [이미지명]:[태그]
: 이미지 다운로드 ⬇️- 설명: Docker Hub와 같은 레지스트리에서 이미지를 로컬로 다운로드합니다.
태그
는 이미지의 특정 버전을 나타내며, 생략하면latest
태그가 기본으로 사용됩니다. - 예시:
docker pull ubuntu
: 최신 우분투 이미지를 다운로드합니다.docker pull nginx:1.21
: Nginx 1.21 버전을 다운로드합니다.
- 팁: 처음
docker run
명령어를 사용하면, 해당 이미지가 로컬에 없을 경우 자동으로pull
을 시도합니다.
- 설명: Docker Hub와 같은 레지스트리에서 이미지를 로컬로 다운로드합니다.
-
docker images
: 로컬 이미지 목록 확인 📋- 설명: 내 컴퓨터에 다운로드되어 있는 도커 이미지 목록을 보여줍니다.
- 예시:
docker images
출력 예시:
REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest 132b7f33167f 2 weeks ago 77.8MB nginx 1.21 9e0c527e029c 2 months ago 133MB hello-world latest bf756fb1cdb1 5 months ago 13.3kB
-
docker rmi [이미지 ID 또는 이미지명]:[태그]
: 이미지 삭제 🗑️- 설명: 로컬에 있는 도커 이미지를 삭제합니다. 이미지를 삭제하려면 해당 이미지를 기반으로 실행 중인 컨테이너가 없어야 합니다.
- 예시:
docker rmi ubuntu
:ubuntu:latest
이미지를 삭제합니다.docker rmi 132b7f33167f
: 특정 이미지 ID를 사용하여 이미지를 삭제합니다.
- 팁: 실행 중인 컨테이너가 있어서 삭제가 안 될 경우,
-f
(force) 옵션을 사용할 수 있지만, 주의해서 사용해야 합니다. (docker rmi -f ubuntu
)
-
docker build -t [새 이미지명]:[태그] [Dockerfile 경로]
: 이미지 빌드 🏗️- 설명:
Dockerfile
이라는 스크립트 파일을 사용하여 나만의 커스텀 이미지를 생성합니다. - 예시: (Dockerfile이 현재 디렉토리에 있다고 가정)
docker build -t my-web-app:1.0 .
- 팁:
.
은 Dockerfile이 현재 디렉토리에 있음을 의미합니다.
- 설명:
2.2. 컨테이너 관리 명령어 📦
이제 다운로드하거나 빌드한 이미지를 가지고 실제 애플리케이션을 실행해볼 차례입니다!
-
docker run [옵션] [이미지명]:[태그] [실행할 명령어]
: 컨테이너 생성 및 실행 (가장 중요!) 🚀- 설명: 지정된 이미지로부터 새로운 컨테이너를 생성하고 실행합니다. 다양한 옵션을 통해 컨테이너의 동작 방식을 제어할 수 있습니다.
- 주요 옵션:
-d
(detached): 컨테이너를 백그라운드에서 실행하고 터미널 제어권을 반환합니다. (데몬 모드)-p [호스트 포트]:[컨테이너 포트]
(port): 호스트의 특정 포트를 컨테이너의 특정 포트에 연결합니다. 웹 서버를 외부에 노출할 때 필수적입니다.-v [호스트 경로]:[컨테이너 경로]
(volume): 호스트 시스템의 디렉토리를 컨테이너 내부의 디렉토리와 공유(마운트)합니다. 데이터 영속성을 유지하거나 설정 파일을 외부에서 관리할 때 유용합니다.--name [컨테이너명]
(name): 컨테이너에 알아보기 쉬운 이름을 부여합니다. 이름을 지정하지 않으면 도커가 임의의 이름을 할당합니다.-it
(interactive, tty): 컨테이너와 상호작용할 수 있는 터미널을 연결합니다. 주로 컨테이너 내부로 들어가서 명령어를 실행할 때 사용합니다.--rm
(remove): 컨테이너가 종료될 때 자동으로 삭제되도록 합니다. 일회성 테스트 컨테이너에 유용합니다.
- 예시:
docker run hello-world
:hello-world
이미지를 기반으로 컨테이너를 실행하고 메시지를 출력 후 종료됩니다.docker run -it ubuntu bash
: 우분투 컨테이너를 실행하고 그 안에서 bash 셸에 접속합니다. (exit
하면 컨테이너 종료)docker run -d -p 80:80 --name my-nginx nginx
: Nginx 컨테이너를 백그라운드에서 실행하고, 호스트의 80번 포트를 컨테이너의 80번 포트에 연결하며, 컨테이너 이름을my-nginx
로 지정합니다.docker run -d -p 3000:3000 -v /path/to/my/app:/usr/src/app --name my-node-app node:16-alpine npm start
: Node.js 앱을 실행하며, 호스트의/path/to/my/app
디렉토리를 컨테이너의/usr/src/app
에 마운트합니다.
-
docker ps
: 실행 중인 컨테이너 목록 확인 📊- 설명: 현재 실행 중인 도커 컨테이너들의 목록을 보여줍니다.
-a
(all): 종료된 컨테이너를 포함한 모든 컨테이너 목록을 보여줍니다.- 예시:
docker ps docker ps -a
-
docker stop [컨테이너 ID 또는 컨테이너명]
: 컨테이너 중지 🛑- 설명: 실행 중인 컨테이너를 우아하게(gracefully) 중지합니다.
- 예시:
docker stop my-nginx
docker stop [컨테이너 ID]
-
docker start [컨테이너 ID 또는 컨테이너명]
: 중지된 컨테이너 시작 ▶️- 설명: 이전에 중지된 컨테이너를 다시 시작합니다.
- 예시:
docker start my-nginx
-
docker restart [컨테이너 ID 또는 컨테이너명]
: 컨테이너 재시작 🔄- 설명: 실행 중이거나 중지된 컨테이너를 재시작합니다.
stop
후start
를 한 번에 하는 것과 같습니다. - 예시:
docker restart my-nginx
- 설명: 실행 중이거나 중지된 컨테이너를 재시작합니다.
-
docker rm [컨테이너 ID 또는 컨테이너명]
: 컨테이너 삭제 🧹- 설명: 더 이상 필요 없는 컨테이너를 삭제합니다. 실행 중인 컨테이너는 삭제할 수 없으므로, 먼저
stop
해야 합니다. - 예시:
docker rm my-nginx
docker rm -f my-nginx
: 강제로 삭제합니다 (실행 중이어도 삭제).
- 설명: 더 이상 필요 없는 컨테이너를 삭제합니다. 실행 중인 컨테이너는 삭제할 수 없으므로, 먼저
-
docker exec -it [컨테이너 ID 또는 컨테이너명] [실행할 명령어]
: 컨테이너 내부 명령어 실행 🚪- 설명: 실행 중인 컨테이너 내부에서 특정 명령어를 실행합니다. 컨테이너 내부로 들어가서 디버깅하거나 파일을 확인하고 싶을 때 유용합니다.
-it
: 상호작용 가능한 터미널을 연결합니다.- 예시:
docker exec -it my-nginx bash
:my-nginx
컨테이너 내부의 bash 셸에 접속합니다.docker exec my-nginx ls -l /usr/share/nginx/html
:my-nginx
컨테이너 내부의 특정 경로 파일을 확인합니다.
-
docker logs [컨테이너 ID 또는 컨테이너명]
: 컨테이너 로그 확인 📜- 설명: 컨테이너의 표준 출력(stdout)과 표준 에러(stderr) 로그를 확인합니다. 애플리케이션의 동작 상태나 에러를 파악할 때 필수적입니다.
-f
(follow): 실시간으로 새로운 로그를 계속해서 출력합니다.--tail [숫자]
: 로그의 마지막 N줄만 출력합니다.- 예시:
docker logs my-nginx
:my-nginx
컨테이너의 모든 로그를 출력합니다.docker logs -f my-nginx
:my-nginx
컨테이너의 로그를 실시간으로 따라갑니다. (Ctrl+C로 종료)docker logs --tail 100 my-nginx
:my-nginx
컨테이너의 마지막 100줄 로그를 출력합니다.
3. 도커 유용한 시스템 명령어 & 활용 팁 ✨
도커 환경을 효율적으로 관리하고 디버깅하는 데 도움이 되는 추가 명령어와 팁입니다.
-
docker info
: 도커 시스템 정보 확인 🖥️- 설명: 도커 클라이언트 및 서버(데몬)에 대한 자세한 정보를 보여줍니다. (컨테이너 수, 이미지 수, 스토리지 드라이버 등)
-
docker version
: 도커 버전 정보 확인 🔢- 설명: 도커 클라이언트와 서버의 버전 정보를 보여줍니다.
-
docker system prune
: 사용하지 않는 도커 리소스 정리 (강력 추천!) 🧹- 설명: 더 이상 사용되지 않는 컨테이너, 이미지, 볼륨, 네트워크 등을 한 번에 삭제하여 디스크 공간을 확보합니다. 도커를 사용하다 보면 불필요한 리소스가 많이 쌓이는데, 이 명령어는 디스크 공간 관리에 매우 유용합니다.
- 주요 옵션:
-a
(all): 빌드 캐시를 포함하여 모든 사용되지 않는 리소스를 삭제합니다. (가장 강력한 정리 옵션)
- 예시:
docker system prune
: 중지된 컨테이너, 사용되지 않는 네트워크, 빌드 캐시가 없는 이미지 등을 삭제할지 확인합니다.docker system prune -a
: 이 명령어를 실행하면 사용하지 않는 모든 도커 객체가 제거되므로 주의해서 사용하세요. 실행하기 전에 정말 필요한 데이터가 없는지 확인하세요!
-
docker inspect [컨테이너 ID 또는 이미지 ID]
: 상세 정보 확인 🔍- 설명: 컨테이너나 이미지의 상세 설정(IP 주소, 볼륨 마운트 정보, 네트워크 설정 등)을 JSON 형식으로 출력합니다. 디버깅에 매우 유용합니다.
- 예시:
docker inspect my-nginx
-
Docker Compose (활용 팁) 🏡
- 여러 개의 컨테이너를 함께 정의하고 실행해야 할 때(
웹 서버
+데이터베이스
+백엔드 API
등),docker compose
를 사용하면 YAML 파일 하나로 모든 컨테이너의 설정, 연결, 의존성을 쉽게 관리할 수 있습니다. - 초보자는
docker run
으로 한 개의 컨테이너를 다루는 데 익숙해진 후docker compose
를 학습하는 것을 추천합니다. - 주요 명령어:
docker compose up
:docker-compose.yml
파일에 정의된 서비스들을 시작합니다.docker compose down
:docker compose up
으로 시작된 서비스들을 중지하고 제거합니다.
- 여러 개의 컨테이너를 함께 정의하고 실행해야 할 때(
4. 자주 묻는 질문 및 트러블슈팅 ❓
도커를 사용하다 보면 겪을 수 있는 몇 가지 일반적인 문제와 해결 팁입니다.
-
“Port is already allocated” (포트가 이미 사용 중입니다) 🤕
- 문제:
docker run -p
명령어를 사용할 때, 호스트의 해당 포트가 이미 다른 프로세스(다른 도커 컨테이너, 또는 로컬 PC의 다른 프로그램)에 의해 사용 중인 경우 발생합니다. - 해결:
docker ps -a
로 다른 도커 컨테이너가 해당 포트를 사용하고 있는지 확인하고, 필요하다면 중지하거나 삭제합니다.netstat -tulnp | grep [포트번호]
(Linux/macOS) 또는netstat -ano | findstr :[포트번호]
(Windows CMD) 명령어로 로컬 PC에서 어떤 프로세스가 해당 포트를 사용하고 있는지 확인합니다.docker run
명령어에서 호스트 포트 번호를 다른 비어 있는 포트로 변경합니다. (예:-p 8080:80
대신-p 8081:80
)
- 문제:
-
“No such image: [이미지명]” (해당 이미지가 없습니다) 🖼️❌
- 문제:
docker run
또는docker rmi
등을 실행할 때 지정한 이미지가 로컬에 없거나 오타가 있는 경우 발생합니다. - 해결:
docker images
명령어로 로컬에 어떤 이미지가 있는지 정확히 확인합니다.docker pull [이미지명]:[태그]
명령어로 이미지를 먼저 다운로드합니다.- 이미지 이름 또는 태그에 오타가 없는지 확인합니다.
- 문제:
-
컨테이너가 실행되지 않고 바로 종료됩니다. 🔇
- 문제:
docker run -d
로 컨테이너를 실행했는데docker ps
에 나타나지 않고docker ps -a
로 보면Exited
상태인 경우입니다. 주로 컨테이너 내부의 메인 프로세스가 바로 종료되는 경우 발생합니다. - 해결:
docker logs [컨테이너명]
명령어로 컨테이너의 로그를 확인합니다. 대부분의 경우 여기에 종료의 원인(예: 설정 오류, 필요한 파일 없음, 애플리케이션 크래시 등)이 명시되어 있습니다.-it bash
옵션으로 컨테이너 내부에 접속하여 직접 명령어를 실행해 보거나, 문제가 되는 부분을 디버깅합니다. (예:docker run -it [이미지명] bash
)Dockerfile
에 문제가 없는지 확인하고 다시 이미지를 빌드해 봅니다.
- 문제:
결론: 도커, 두려워 말고 즐기세요! 🎉
지금까지 도커의 핵심 개념부터 이미지 및 컨테이너를 다루는 필수 명령어, 그리고 유용한 활용 팁까지 자세히 살펴보았습니다. 처음에는 복잡해 보일 수 있지만, 몇 번 직접 명령어를 입력하고 결과를 확인하다 보면 금세 익숙해질 거예요!
도커는 개발 환경을 표준화하고, 애플리케이션 배포를 간소화하며, 개발 효율성을 극대화하는 강력한 도구입니다. 이 가이드가 여러분이 도커를 시작하는 데 훌륭한 첫걸음이 되기를 바랍니다.
이제 여러분도 도커를 사용하여 더 스마트하게 개발하고 배포할 수 있습니다! 다음 단계로는 Dockerfile
작성법과 Docker Compose
를 학습하여 여러 컨테이너를 통합 관리하는 방법을 익혀보시는 것을 추천합니다.
궁금한 점이 있다면 언제든지 댓글로 남겨주세요. 여러분의 도커 여정을 응원합니다! 🚀💪