본문 바로가기

도커 기초 이해 - 컨테이너 개념부터 실전 명령어까지 한번에 정리

도커가 뭔지 모르겠다면 이 글부터 읽으세요. 가상머신과의 차이, 이미지와 컨테이너 개념, 핵심 명령어를 실무 중심으로 쉽게 설명합니다.


도커 기초 이해 - 컨테이너 개념부터 실전 명령어까지 한번에 정리

서버 환경 설정하다가 "내 컴퓨터에서는 되는데 서버에서는 안 돼요"라는 말을 해본 적 있으신가요? 개발자라면 한 번쯤 겪어봤을 이 문제를, 도커(Docker)는 근본적으로 해결해 줍니다. 도커 기초 이해만 제대로 잡아두면 서버 배포와 개발 환경 구성이 훨씬 수월해집니다.

도커란 무엇인가

도커는 애플리케이션을 컨테이너라는 격리된 환경에 패키징해서 실행하는 플랫폼입니다. 2013년 솔로몬 하이크스(Solomon Hykes)가 처음 공개한 이후, 현재 전 세계 개발자의 약 53%가 사용하고 있을 정도로 표준 도구가 되었습니다.

쉽게 비유하면 이렇습니다. 택배 상자에 물건과 완충재를 함께 넣어 보내면, 어디서 열어도 동일한 상태로 도착하죠. 도커 컨테이너도 마찬가지입니다. 코드, 런타임, 라이브러리, 설정 파일을 하나의 상자에 담아서 어떤 서버에서든 동일하게 실행합니다.

  • 운영체제에 의존하지 않는 일관된 실행 환경 제공
  • 개발-스테이징-운영 서버 간 환경 차이 제거
  • 마이크로서비스 아키텍처의 핵심 인프라

가상머신과 컨테이너의 차이

도커 기초 이해에서 가장 먼저 정리해야 할 부분이 가상머신(VM)과 컨테이너의 차이입니다. 둘 다 격리된 환경을 제공하지만, 작동 방식이 완전히 다릅니다.

구분가상머신(VM)컨테이너(Docker)
격리 수준OS 전체 격리프로세스 수준 격리
부팅 시간수십 초 - 수 분1초 이내
디스크 용량수 GB - 수십 GB수십 MB - 수백 MB
성능 오버헤드높음 (하이퍼바이저)거의 없음 (커널 공유)
밀도서버당 10-20개서버당 수백 개 가능

가상머신은 게스트 OS를 통째로 올려야 하기 때문에 무겁습니다. 반면 컨테이너는 호스트 OS의 커널을 공유하면서 필요한 라이브러리와 바이너리만 포함합니다. 그래서 실행 속도가 빠르고 리소스 소모가 적습니다.

도커 컨테이너는 가상머신을 대체하는 것이 아니라, 애플리케이션 배포의 관점에서 더 가볍고 효율적인 대안을 제공하는 기술입니다. 보안 격리가 최우선인 경우에는 여전히 VM이 적합합니다.

이미지와 컨테이너 핵심 개념

도커를 처음 접하면 이미지(Image)와 컨테이너(Container)라는 용어가 헷갈립니다. 핵심만 짚겠습니다.

이미지(Image)

이미지는 실행에 필요한 모든 것을 담은 읽기 전용 템플릿입니다. 프로그래밍의 클래스와 비슷합니다. Node.js 애플리케이션이라면 Node 런타임, npm 패키지, 소스 코드, 설정 파일이 모두 이미지 안에 들어갑니다.

컨테이너(Container)

컨테이너는 이미지를 기반으로 실제로 실행되는 인스턴스입니다. 클래스로 만든 객체(인스턴스)와 같습니다. 하나의 이미지로 여러 컨테이너를 동시에 실행할 수 있습니다.

  • 이미지 = 레시피 (변경 불가)
  • 컨테이너 = 레시피로 만든 요리 (실행 중 상태 변경 가능)
  • 레지스트리 = 레시피를 공유하는 저장소 (Docker Hub 등)

레이어 구조

도커 이미지는 여러 개의 읽기 전용 레이어로 구성됩니다. 예를 들어 Ubuntu 베이스 레이어 위에 Python 설치 레이어, 그 위에 앱 코드 레이어가 쌓이는 방식입니다. 이미 다운받은 레이어는 캐싱되므로, 비슷한 이미지를 여러 개 받아도 공통 레이어는 한 번만 다운로드됩니다.

실무에서 바로 쓰는 도커 명령어

도커 설치 후 가장 자주 사용하는 명령어를 정리했습니다. 이것만 알아도 기본적인 운영이 가능합니다.

명령어설명사용 예시
docker pull이미지 다운로드docker pull nginx:latest
docker run컨테이너 생성 및 실행docker run -d -p 80:80 nginx
docker ps실행 중인 컨테이너 목록docker ps -a (전체 목록)
docker stop컨테이너 중지docker stop 컨테이너ID
docker rm컨테이너 삭제docker rm 컨테이너ID
docker images로컬 이미지 목록docker images
docker logs컨테이너 로그 확인docker logs -f 컨테이너ID
docker exec실행 중인 컨테이너에 명령 실행docker exec -it 컨테이너ID bash

docker run 명령어의 주요 옵션도 익혀두면 좋습니다.

  • -d : 백그라운드에서 실행 (detached 모드)
  • -p 호스트포트:컨테이너포트 : 포트 매핑
  • -v 호스트경로:컨테이너경로 : 볼륨 마운트 (데이터 영속성)
  • --name : 컨테이너 이름 지정
  • -e : 환경 변수 전달
  • --rm : 컨테이너 종료 시 자동 삭제
참고: docker ps -a 로 확인하면 중지된 컨테이너가 쌓여 있는 경우가 많습니다. docker system prune 명령어로 사용하지 않는 컨테이너, 이미지, 네트워크를 한 번에 정리할 수 있습니다. 다만 운영 환경에서는 삭제 대상을 반드시 확인한 후 실행하세요.

Dockerfile 작성 기초

Dockerfile은 도커 이미지를 빌드하기 위한 설정 파일입니다. 간단한 Node.js 앱의 Dockerfile을 예로 살펴보겠습니다.

주요 명령어를 하나씩 정리하면 다음과 같습니다.

  • FROM : 베이스 이미지 지정. node:20-alpine처럼 경량 이미지를 선택하면 최종 이미지 크기를 줄일 수 있습니다
  • WORKDIR : 작업 디렉토리 설정. 이후 명령어가 이 경로에서 실행됩니다
  • COPY : 호스트 파일을 이미지 안으로 복사
  • RUN : 이미지 빌드 시 실행할 명령어. npm install 등 의존성 설치에 사용
  • EXPOSE : 컨테이너가 사용하는 포트를 문서화 (실제 포트 개방은 -p 옵션으로)
  • CMD : 컨테이너 시작 시 실행할 기본 명령어

빌드 최적화 팁

COPY package*.json을 먼저 실행하고 npm install을 한 뒤, 그 다음에 소스 코드를 COPY하는 순서가 중요합니다. 소스 코드만 변경됐을 때 npm install 레이어 캐시를 재활용할 수 있기 때문입니다. 이 순서만 지켜도 빌드 시간이 3-5배 단축됩니다.

팁: .dockerignore 파일을 꼭 만드세요. node_modules, .git, .env 같은 불필요한 파일이 이미지에 포함되면 크기가 커지고 보안 위험도 생깁니다. 웹 서비스를 배포할 때 파비콘 생성기로 만든 파비콘 파일 같은 정적 에셋은 포함하되, 소스 원본 PSD 파일 등은 제외하는 식으로 관리하면 이미지 경량화에 도움이 됩니다.

도커 입문자를 위한 실전 팁

도커 기초 이해를 끝냈다면, 실전에서 바로 적용할 수 있는 팁들을 정리합니다.

1단계: 로컬에서 먼저 연습하기

Docker Desktop(Windows/Mac)이나 Docker Engine(Linux)을 설치하고, nginx 공식 이미지로 간단한 웹 서버를 띄워보세요. docker run -d -p 8080:80 nginx 한 줄이면 됩니다. 브라우저에서 localhost:8080에 접속하면 nginx 기본 페이지가 보입니다.

2단계: 자신의 프로젝트를 컨테이너화하기

실제 프로젝트에 Dockerfile을 작성해보는 것이 가장 빠른 학습법입니다. 처음에는 단일 컨테이너로 시작하고, 익숙해지면 Docker Compose로 여러 서비스를 연결하는 구성을 시도해보세요.

3단계: Docker Compose로 확장하기

실무에서는 웹 서버, 데이터베이스, 캐시 서버 등 여러 컨테이너를 동시에 관리합니다. Docker Compose는 docker-compose.yml 파일 하나로 이 모든 서비스를 정의하고, docker compose up 명령어 한 줄로 전체 환경을 실행할 수 있게 해줍니다.

자주 하는 실수 3가지

  • latest 태그에 의존하기 - latest는 항상 최신 버전을 가리키므로, 빌드할 때마다 다른 버전이 설치될 수 있습니다. 반드시 node:20.11 같은 구체적인 버전 태그를 사용하세요
  • 컨테이너 안에 데이터 저장하기 - 컨테이너를 삭제하면 내부 데이터도 사라집니다. 데이터베이스 파일이나 업로드 파일은 반드시 볼륨(-v 옵션)으로 호스트에 마운트해야 합니다
  • 루트 유저로 실행하기 - 보안상 Dockerfile에서 USER 명령어를 사용해 비루트 사용자로 실행하는 것이 권장됩니다

도커는 한 번 익혀두면 개발 환경 구성, 테스트, 배포 전 과정에서 시간을 절약해 줍니다. 오늘 바로 Docker Desktop을 설치하고, nginx 컨테이너 하나를 띄워보세요. 그 작은 첫 경험이 컨테이너 기술 전체를 이해하는 출발점이 됩니다.

3일 무료체험큰손탐지기, 지금 바로 시작하세요

설치 없이 웹에서 바로 사용 가능 · PC & 모바일 지원

무료체험 시작
카카오톡 상담