Docker 입문 가이드 – 컨테이너 하나로 개발 환경 고민 끝내기

새로운 프로젝트를 시작할 때마다 개발 환경을 처음부터 다시 세팅해 본 경험, 한 번쯤은 있으시죠? Python 버전이 안 맞고, Node.js가 충돌하고, 데이터베이스 설치에서 막히고… 이런 삽질을 반복하다 보면 정작 코드를 작성할 시간은 점점 줄어듭니다. Docker는 바로 이 문제를 깔끔하게 해결해 주는 도구입니다.
2026년 현재, Docker는 더 이상 대기업 인프라 엔지니어만 쓰는 도구가 아닙니다. 개인 개발자, 블로거, 취미 프로그래머까지 누구나 일상적으로 사용하고 있고, AI 도구들과 결합하면 명령어 몇 줄로 복잡한 환경을 뚝딱 만들어 낼 수 있습니다. 이 글에서는 Docker를 한 번도 써보지 않은 분도 따라 할 수 있도록, 개념부터 실전 활용까지 차근차근 안내해 드리겠습니다.
Docker가 뭔가요? 왜 필요한가요?
Docker를 한마디로 설명하면 ‘내 컴퓨터 안에 작은 컴퓨터를 만드는 기술’입니다. 좀 더 정확히 말하면, 애플리케이션과 그 실행에 필요한 모든 것(운영체제 라이브러리, 설정 파일, 의존성 패키지 등)을 하나의 패키지로 묶어서 어디서든 동일하게 실행할 수 있게 해주는 컨테이너 플랫폼입니다.
가상머신(VM)과 뭐가 다른가요?
예전에는 이런 격리 환경을 만들려면 VirtualBox 같은 가상머신을 사용했습니다. 하지만 가상머신은 운영체제 전체를 통째로 올려야 하기 때문에 무겁고 느렸죠. Docker 컨테이너는 호스트 운영체제의 커널을 공유하면서 필요한 부분만 격리하기 때문에, 가상머신 대비 훨씬 가볍고 빠릅니다.
- 가상머신: 운영체제 전체 포함 → 수 GB, 부팅에 수십 초~수 분
- Docker 컨테이너: 필요한 라이브러리만 포함 → 수십 MB~수백 MB, 실행에 1~2초
즉, Docker를 쓰면 내 컴퓨터가 무거워지지 않으면서도 깨끗하게 격리된 환경을 마음껏 만들고 지울 수 있습니다.
일상에서 Docker가 빛나는 순간들
Docker는 거창한 서버 운영뿐 아니라, 아주 일상적인 상황에서도 유용합니다.
- “내 컴퓨터에선 되는데?” 문제 해결: 팀원 모두가 동일한 환경에서 개발하니 환경 차이로 인한 버그가 사라집니다.
- 새 기술 빠르게 맛보기: Redis, MongoDB, PostgreSQL 같은 데이터베이스를 설치 없이 한 줄 명령어로 바로 실행해 볼 수 있습니다.
- 프로젝트별 환경 분리: A 프로젝트는 Python 3.10, B 프로젝트는 Python 3.12를 사용해도 서로 충돌하지 않습니다.
- 깨끗한 PC 유지: 이것저것 설치했다가 지워도 찌꺼기가 남지 않습니다. 컨테이너를 삭제하면 끝이니까요.
- 블로그·사이드 프로젝트 배포: 로컬에서 만든 환경을 그대로 서버에 올릴 수 있어 배포가 간단해집니다.
Docker 설치하기 – 운영체제별 가이드
Docker를 시작하려면 먼저 Docker Desktop을 설치해야 합니다. Docker Desktop은 Windows, macOS, Linux 모두 지원하며, GUI 환경까지 제공해서 초보자도 편리하게 사용할 수 있습니다.
Windows에서 설치하기
Windows 10/11 Pro 이상이라면 WSL2(Windows Subsystem for Linux 2)를 기반으로 Docker를 실행할 수 있습니다.
- 1단계: PowerShell을 관리자 권한으로 열고 wsl –install 명령어를 실행하여 WSL2를 활성화합니다.
- 2단계: Docker 공식 사이트에서 Docker Desktop for Windows를 다운로드하고 설치합니다.
- 3단계: 설치 과정에서 ‘Use WSL 2 instead of Hyper-V’ 옵션을 선택합니다.
- 4단계: 설치 완료 후 재부팅하면 시스템 트레이에 Docker 아이콘이 나타납니다.
Windows Home 에디션도 WSL2를 지원하므로 동일한 방법으로 설치할 수 있습니다. 2026년 현재 Docker Desktop의 개인 사용은 완전 무료이니 부담 없이 설치하세요.
macOS에서 설치하기
macOS는 더 간단합니다. Docker 공식 사이트에서 Docker Desktop for Mac을 다운로드하고 dmg 파일을 실행하면 됩니다. Apple Silicon(M 시리즈)과 Intel 칩 모두 지원합니다. 설치 후 Applications 폴더에서 Docker를 실행하면 메뉴바에 고래 아이콘이 나타납니다.
Linux에서 설치하기
Linux에서는 Docker Engine을 직접 설치하는 것이 일반적입니다. Ubuntu 기준으로 아래 명령어를 순서대로 실행하면 됩니다.
- sudo apt update로 패키지 목록을 갱신합니다.
- sudo apt install docker.io docker-compose-v2로 Docker와 Docker Compose를 설치합니다.
- sudo usermod -aG docker $USER로 현재 사용자를 docker 그룹에 추가합니다(sudo 없이 Docker를 사용하기 위함).
- 로그아웃 후 다시 로그인하면 적용됩니다.
설치 확인
어떤 운영체제든 설치가 끝났다면, 터미널(또는 명령 프롬프트)을 열고 아래 명령어를 입력해 보세요.
docker –version
Docker version 27.x.x 같은 버전 정보가 출력되면 성공입니다. 추가로 docker run hello-world를 실행하면 Docker Hub에서 테스트 이미지를 받아와 “Hello from Docker!” 메시지를 보여줍니다. 이 메시지가 보이면 Docker가 완벽하게 작동하고 있다는 뜻입니다.
Docker 핵심 개념 3가지만 기억하세요
Docker를 사용하기 전에 딱 세 가지 개념만 이해하면 됩니다. 이 세 가지를 알면 나머지는 자연스럽게 따라옵니다.
1. 이미지(Image) – 설계도
이미지는 컨테이너를 만들기 위한 설계도입니다. 건축에 비유하면 건물의 청사진이라고 할 수 있죠. 이미지에는 운영체제, 필요한 소프트웨어, 설정 파일 등 컨테이너 실행에 필요한 모든 정보가 담겨 있습니다.
이미지는 Docker Hub라는 공개 저장소에서 수만 개를 무료로 받을 수 있습니다. Python, Node.js, MySQL, Redis, WordPress 등 거의 모든 유명 소프트웨어의 공식 이미지가 준비되어 있어요.
2. 컨테이너(Container) – 실제 건물
컨테이너는 이미지를 기반으로 실제로 실행 중인 인스턴스입니다. 설계도(이미지)로 지은 건물(컨테이너)이라고 생각하면 됩니다. 같은 이미지로 여러 개의 컨테이너를 동시에 만들 수도 있습니다.
컨테이너는 독립된 환경에서 실행되기 때문에, 한 컨테이너에서 무슨 일이 일어나도 다른 컨테이너나 호스트 시스템에 영향을 주지 않습니다. 문제가 생기면 컨테이너를 삭제하고 다시 만들면 그만이죠.
3. Dockerfile – 나만의 설계도 만들기
Dockerfile은 이미지를 만드는 레시피 파일입니다. “Ubuntu를 기반으로, Python 3.12를 설치하고, 내 코드를 복사해서 넣어라”와 같은 지시사항을 한 줄씩 적어두면, Docker가 이 레시피를 읽고 자동으로 이미지를 만들어 줍니다.
Dockerfile의 기본 구조는 아주 직관적입니다.
- FROM: 기반이 될 이미지를 지정합니다. (예: FROM python:3.12-slim)
- WORKDIR: 작업 디렉터리를 설정합니다. (예: WORKDIR /app)
- COPY: 호스트의 파일을 컨테이너로 복사합니다. (예: COPY . .)
- RUN: 명령어를 실행합니다. (예: RUN pip install -r requirements.txt)
- CMD: 컨테이너가 시작될 때 실행할 기본 명령어입니다. (예: CMD [“python”, “app.py”])
지금 바로 써보는 Docker 필수 명령어 10가지
이론은 여기까지면 충분합니다. 이제 실제로 손을 움직여 보겠습니다. Docker에서 가장 자주 쓰는 명령어 10가지를 실습과 함께 정리했습니다.
이미지 관련 명령어
- docker pull nginx: Docker Hub에서 nginx 이미지를 다운로드합니다. 마치 앱스토어에서 앱을 내려받는 것과 같습니다.
- docker images: 내 컴퓨터에 저장된 모든 이미지 목록을 보여줍니다.
- docker rmi nginx: 더 이상 필요 없는 이미지를 삭제합니다. 디스크 공간이 부족할 때 유용합니다.
- docker build -t my-app .: 현재 디렉터리의 Dockerfile을 읽어서 ‘my-app’이라는 이름의 이미지를 만듭니다.
컨테이너 관련 명령어
- docker run -d -p 8080:80 nginx: nginx 컨테이너를 백그라운드(-d)에서 실행하고, 내 컴퓨터의 8080번 포트를 컨테이너의 80번 포트에 연결(-p)합니다. 브라우저에서 localhost:8080을 열면 nginx 기본 페이지가 나타납니다.
- docker ps: 현재 실행 중인 컨테이너 목록을 보여줍니다. ‘docker ps -a’를 쓰면 중지된 컨테이너까지 모두 볼 수 있습니다.
- docker stop [컨테이너ID]: 실행 중인 컨테이너를 정지합니다.
- docker start [컨테이너ID]: 정지된 컨테이너를 다시 시작합니다.
- docker rm [컨테이너ID]: 정지된 컨테이너를 삭제합니다.
- docker exec -it [컨테이너ID] bash: 실행 중인 컨테이너 내부로 들어가서 직접 명령어를 실행할 수 있습니다. 마치 SSH로 서버에 접속하는 것과 비슷합니다.
처음엔 이 10가지만 알아도 Docker의 80%는 활용할 수 있습니다. 나머지는 필요할 때 하나씩 찾아보면 충분합니다.
실전: Docker Compose로 개발 환경 한 방에 구성하기
실제 프로젝트에서는 웹 서버, 데이터베이스, 캐시 서버 등 여러 서비스를 동시에 띄워야 하는 경우가 대부분입니다. 이때 컨테이너를 하나씩 실행하는 건 번거롭겠죠? Docker Compose가 이 문제를 해결해 줍니다.
Docker Compose는 여러 컨테이너를 하나의 YAML 파일로 정의하고, 명령어 한 줄로 모두 실행·중지할 수 있게 해주는 도구입니다. Docker Desktop을 설치하면 기본으로 포함되어 있어 별도 설치가 필요 없습니다.
실습: 블로그용 WordPress 환경 만들기
WordPress와 MySQL 데이터베이스를 Docker Compose로 한 번에 띄워 보겠습니다. 프로젝트 폴더에 docker-compose.yml 파일을 만들고 아래 내용을 작성합니다.
파일명: docker-compose.yml
- version: ‘3.8’로 Compose 파일 버전을 지정합니다.
- services 아래에 db와 wordpress 두 가지 서비스를 정의합니다.
- db 서비스: mysql:8.0 이미지를 사용하고, 환경 변수로 루트 비밀번호와 데이터베이스명을 지정합니다. volumes를 통해 데이터를 영구 저장합니다.
- wordpress 서비스: wordpress:latest 이미지를 사용하고, 8080:80 포트 매핑으로 브라우저에서 접속할 수 있게 합니다. depends_on으로 db가 먼저 시작되도록 순서를 지정합니다.
이제 터미널에서 해당 폴더로 이동한 뒤 아래 명령어를 실행합니다.
docker compose up -d
이 한 줄이면 MySQL과 WordPress가 동시에 실행됩니다. 브라우저에서 localhost:8080을 열면 WordPress 설치 화면이 반겨줍니다. 놀랍지 않나요? MySQL을 따로 설치하지도, 복잡한 설정을 하지도 않았는데 완전한 WordPress 환경이 만들어졌습니다.
작업이 끝나면 docker compose down 한 줄로 모든 컨테이너를 깔끔하게 정리할 수 있습니다. 다시 필요하면 docker compose up -d를 실행하면 되고, 데이터는 볼륨에 그대로 남아 있으니 걱정 없습니다.
실습: Python + Redis 개발 환경 만들기
이번에는 좀 더 개발자 친화적인 예제를 살펴보겠습니다. Python 웹 애플리케이션과 Redis 캐시 서버를 함께 구성해 보겠습니다.
docker-compose.yml 파일에 다음과 같이 두 가지 서비스를 정의합니다.
- app 서비스: build: . 으로 현재 디렉터리의 Dockerfile을 사용해 이미지를 빌드합니다. volumes에 현재 디렉터리를 마운트하면 코드를 수정할 때마다 컨테이너에 바로 반영됩니다(핫 리로드).
- redis 서비스: redis:alpine 이미지를 사용합니다. alpine 태그는 경량화된 리눅스 기반이라 이미지 크기가 매우 작습니다.
이처럼 Docker Compose를 사용하면 팀원 누구든 docker compose up -d 한 줄로 동일한 개발 환경을 즉시 구성할 수 있습니다. “내 컴퓨터에선 되는데?” 문제가 완전히 사라지는 거죠.
Docker 볼륨과 네트워크 – 데이터와 통신 관리하기
Docker를 제대로 활용하려면 볼륨과 네트워크에 대해서도 알아둘 필요가 있습니다. 이 두 가지를 이해하면 컨테이너를 훨씬 유연하게 다룰 수 있습니다.
볼륨(Volume) – 데이터를 안전하게 보관하기
컨테이너는 기본적으로 휘발성입니다. 컨테이너를 삭제하면 그 안의 데이터도 함께 사라집니다. 데이터베이스처럼 데이터가 유지되어야 하는 경우에는 볼륨을 사용해야 합니다.
볼륨은 컨테이너 외부(호스트 머신)에 데이터를 저장하는 방식입니다. 컨테이너가 삭제되어도 볼륨의 데이터는 그대로 남아 있고, 새 컨테이너를 만들 때 같은 볼륨을 연결하면 이전 데이터를 그대로 사용할 수 있습니다.
- docker volume create my-data: ‘my-data’라는 이름의 볼륨을 생성합니다.
- docker run -v my-data:/var/lib/mysql mysql: MySQL 컨테이너의 데이터 디렉터리를 볼륨에 연결합니다.
- docker volume ls: 모든 볼륨 목록을 확인합니다.
- docker volume rm my-data: 볼륨을 삭제합니다.
네트워크(Network) – 컨테이너끼리 대화하기
Docker Compose로 여러 컨테이너를 띄우면, 같은 Compose 파일에 정의된 서비스들은 자동으로 같은 네트워크에 연결됩니다. 덕분에 서비스 이름만으로 서로 통신할 수 있습니다.
예를 들어, 위의 WordPress 예제에서 WordPress 컨테이너는 ‘db’라는 호스트명으로 MySQL에 접속합니다. IP 주소를 알 필요가 전혀 없죠. Docker가 내부 DNS를 자동으로 관리해 주기 때문입니다.
이 기능이 특히 편리한 이유는, 개발 환경에서든 운영 환경에서든 서비스 이름이 동일하기 때문에 설정을 바꿀 필요가 없다는 점입니다.
Docker 실전 꿀팁 – 초보자가 흔히 겪는 문제와 해결법
Docker를 처음 사용하면 몇 가지 예상치 못한 문제를 만나게 됩니다. 미리 알아두면 시간을 크게 절약할 수 있는 팁들을 정리했습니다.
1. 디스크 공간이 부족해요
Docker를 오래 사용하다 보면 사용하지 않는 이미지, 중지된 컨테이너, 연결 해제된 볼륨이 쌓여서 디스크 공간을 상당히 차지합니다. 이럴 때는 아래 명령어 하나로 불필요한 리소스를 한꺼번에 정리할 수 있습니다.
docker system prune -a
이 명령어는 중지된 컨테이너, 사용하지 않는 네트워크, 태그 없는 이미지 등을 모두 삭제합니다. 볼륨까지 삭제하려면 –volumes 플래그를 추가하면 됩니다(데이터가 날아갈 수 있으니 주의하세요).
현재 Docker가 사용하는 디스크 공간을 확인하려면 docker system df 명령어를 사용하세요.
2. 포트 충돌이 발생해요
“port is already allocated” 에러가 나면, 해당 포트를 이미 다른 프로그램이 사용하고 있다는 뜻입니다. 호스트 측 포트 번호를 다른 것으로 바꾸면 해결됩니다. 예를 들어 8080이 사용 중이면 -p 8081:80처럼 다른 포트를 지정하세요.
3. 컨테이너가 바로 종료돼요
docker run으로 컨테이너를 실행했는데 바로 종료되는 경우가 있습니다. 이는 컨테이너 안에서 실행할 프로세스가 없거나 즉시 끝나는 명령어가 설정되어 있기 때문입니다. docker logs [컨테이너ID]로 로그를 확인하면 원인을 파악할 수 있습니다.
4. 파일 권한 문제가 발생해요
Linux에서 Docker를 사용할 때 호스트와 컨테이너 간 파일 권한이 맞지 않는 경우가 종종 있습니다. Dockerfile에서 USER 지시어를 사용하거나, 볼륨 마운트 시 사용자 ID를 맞춰주면 해결됩니다.
5. 빌드 캐시를 활용하세요
Dockerfile을 작성할 때 자주 변경되는 부분(코드 복사 등)은 아래쪽에, 잘 바뀌지 않는 부분(패키지 설치 등)은 위쪽에 배치하세요. Docker는 각 단계를 캐시하기 때문에, 변경되지 않은 단계는 다시 실행하지 않습니다. 이 순서만 지켜도 빌드 시간이 수 분에서 수 초로 단축될 수 있습니다.
예를 들어, Python 프로젝트라면 requirements.txt를 먼저 복사하고 pip install을 실행한 뒤, 그 다음에 나머지 소스 코드를 복사하는 것이 좋습니다. 소스 코드가 바뀌어도 패키지 설치 단계는 캐시에서 재사용되기 때문입니다.
6. .dockerignore 파일을 꼭 만드세요
.gitignore와 비슷한 역할을 합니다. Docker 이미지를 빌드할 때 불필요한 파일(node_modules, .git, 로그 파일 등)을 제외시켜 이미지 크기를 줄이고 빌드 속도를 높일 수 있습니다.
한 걸음 더: Docker를 활용한 실용적인 프로젝트 아이디어
Docker의 기본을 익혔다면, 실제로 뭔가 만들어 보는 것이 가장 좋은 학습 방법입니다. 개인 개발자나 취미 프로그래머가 시도해 볼 만한 프로젝트 아이디어를 소개합니다.
1. 개인 블로그 로컬 테스트 환경
WordPress, Ghost, Hugo 같은 블로그 플랫폼을 Docker로 로컬에 띄워서 테마나 플러그인을 서버에 반영하기 전에 미리 테스트할 수 있습니다. 문제가 생겨도 컨테이너를 삭제하고 다시 만들면 되니 부담이 없습니다.
2. 홈 미디어 서버
Jellyfin이나 Plex 같은 미디어 서버를 Docker로 운영하면 NAS나 데스크톱에서 영화, 음악, 사진을 관리하고 스트리밍할 수 있습니다. Docker Compose로 미디어 서버, 다운로드 클라이언트, 자막 검색기 등을 한 번에 구성할 수 있죠.
3. 개인 대시보드
Homarr, Heimdall 같은 대시보드 앱을 Docker로 띄우면, 자주 사용하는 서비스들의 링크와 상태를 한눈에 볼 수 있는 개인 포털 페이지를 만들 수 있습니다. 특히 여러 컨테이너 서비스를 운영하고 있다면 필수입니다.
4. CI/CD 파이프라인 구축
GitHub Actions나 GitLab CI에서 Docker를 활용하면 코드를 푸시할 때마다 자동으로 테스트하고 배포하는 파이프라인을 구축할 수 있습니다. 개인 프로젝트에도 CI/CD를 적용하면 코드 품질이 확연히 올라갑니다.
5. 로컬 AI 실험 환경
Ollama, LocalAI 같은 로컬 AI 도구를 Docker로 띄워서 다양한 AI 모델을 실험해 볼 수 있습니다. GPU가 있는 환경이라면 NVIDIA Container Toolkit을 설치하면 컨테이너 안에서도 GPU 가속을 사용할 수 있습니다.
Docker Desktop의 유용한 GUI 기능들
명령어가 아직 익숙하지 않다면 Docker Desktop의 GUI를 적극 활용하세요. 생각보다 편리한 기능이 많습니다.
- 컨테이너 관리: 실행, 정지, 삭제, 로그 확인을 클릭 한 번으로 할 수 있습니다.
- 이미지 관리: 다운로드된 이미지 목록을 보고, 불필요한 것을 쉽게 삭제할 수 있습니다.
- 볼륨 관리: 볼륨의 크기와 연결된 컨테이너를 한눈에 확인할 수 있습니다.
- 리소스 모니터링: 각 컨테이너의 CPU, 메모리, 네트워크 사용량을 실시간으로 모니터링할 수 있습니다.
- Extensions: Docker Desktop 확장 프로그램을 통해 데이터베이스 관리, 로그 분석 등 추가 기능을 설치할 수 있습니다.
특히 2026년에 추가된 Docker AI Assistant 기능은 자연어로 Docker 관련 질문을 하면 답변과 함께 적절한 명령어를 제안해 줘서, 초보자에게 매우 유용합니다.
마무리 – Docker, 한번 써보면 돌아갈 수 없습니다
Docker는 처음에 낯설게 느껴질 수 있지만, 막상 써보면 “왜 진작 안 썼지?”라는 생각이 드는 도구입니다. 개발 환경 세팅에 쓰던 시간을 아끼고, 깨끗한 PC를 유지하면서, 새로운 기술을 부담 없이 맛볼 수 있다는 것은 정말 큰 장점입니다.
이 글에서 다룬 내용을 한 번 정리해 보겠습니다.
- Docker는 가볍고 빠른 격리 환경을 제공하는 컨테이너 플랫폼입니다.
- 이미지, 컨테이너, Dockerfile 세 가지 개념만 이해하면 시작할 수 있습니다.
- Docker Compose를 사용하면 여러 서비스를 한 번에 관리할 수 있습니다.
- 볼륨으로 데이터를 안전하게 보관하고, 네트워크로 컨테이너 간 통신을 관리합니다.
- 디스크 정리, 빌드 캐시, .dockerignore 등의 팁을 활용하면 더 효율적으로 사용할 수 있습니다.
오늘 당장 Docker Desktop을 설치하고, docker run hello-world 한 줄부터 시작해 보세요. 그 작은 한 걸음이 여러분의 개발 생활을 훨씬 편하게 만들어 줄 것입니다. 궁금한 점이 있다면 댓글로 남겨주세요. 함께 이야기 나누겠습니다!
Photo by Daniil Komov on Pexels


