Docker 개념 쉽게 이해하기: 컨테이너, 이미지, Dockerfile 완벽 설명

Docker가 필요한 이유: “내 컴퓨터에선 되는데요?” 문제 해결하기

개발 환경과 실제 서버 환경의 차이

제가 처음 개발을 배울 때 가장 당황스러웠던 순간이 있었어요. 분명 내 노트북에서는 완벽하게 돌아가던 프로그램이 회사 서버에 올리니까 에러가 나는 거예요. “내 컴퓨터에선 되는데요?”라는 말은 거의 개발자들 사이의 밈(meme)이 될 정도로 흔한 상황이죠.

이런 일이 발생하는 이유는 간단합니다. 제 노트북은 Windows 10이고 Python 3.9를 쓰는데, 서버는 Ubuntu Linux에 Python 3.8이 설치되어 있었던 거예요. 게다가 제가 설치한 라이브러리 버전과 서버의 라이브러리 버전이 달라서 호환이 안 되는 문제도 있었죠.

Docker 없이 개발할 때 겪는 실제 문제들

실제로 Docker를 사용하기 전에 저는 이런 문제들을 겪었어요:

  • 환경 설정에 하루를 날림: 새로운 팀원이 합류할 때마다 개발 환경 세팅하는 데만 반나절이 걸렸어요. Python 버전 맞추고, MySQL 설치하고, 환경변수 설정하고… 문서대로 했는데도 안 되면 선배 개발자한테 SOS를 쳤죠.
  • 버전 충돌 문제: 프로젝트 A는 Node.js 14를 쓰고, 프로젝트 B는 Node.js 18을 써야 했어요. 한 컴퓨터에서 두 버전을 번갈아 사용하려니 매번 전환하는 게 정말 번거로웠습니다.
  • 배포 시 예측 불가능한 에러: 개발 환경에서는 문제없다가 실제 서버에 올리면 갑자기 “모듈을 찾을 수 없습니다” 같은 에러가 뜨는 거예요.

Docker가 해결해주는 것들

Docker와 Docker Compose 개념 문과생도 이해하는 설명을 시작하면서 가장 먼저 알아야 할 점은, Docker가 바로 이런 문제들을 해결해준다는 거예요. Docker는 애플리케이션과 그것이 실행되는 환경을 하나의 패키지로 묶어버립니다.

쉽게 말하면, 프로그램과 그 프로그램이 돌아가는 데 필요한 모든 것들(운영체제, 라이브러리, 설정 파일 등)을 통째로 담은 “상자”를 만드는 거예요. 이 상자는 Windows든 Mac이든 Linux든 어디서나 똑같이 작동합니다.

Docker 핵심 개념: 컨테이너, 이미지, 그리고 Dockerfile

비유로 이해하는 Docker 구조 (설계도 → 붕어빵 틀 → 붕어빵)

처음 Docker를 배울 때 용어들이 너무 헷갈렸어요. Dockerfile, Image, Container… 다 비슷비슷하게 들리는데 뭐가 뭔지 모르겠더라고요. 그래서 제가 이해한 방식을 붕어빵에 비유해볼게요:

  • Dockerfile = 붕어빵 레시피(설계도): “밀가루 200g, 팥 100g을 넣고 180도에서 5분간 굽는다” 같은 만드는 방법이 적힌 문서예요.
  • Image = 붕어빵 틀: 레시피대로 만들어진 틀이에요. 이 틀로 똑같은 붕어빵을 계속 찍어낼 수 있죠.
  • Container = 실제 붕어빵: 틀을 사용해서 만들어낸 실제로 먹을 수 있는 붕어빵이에요. 하나의 틀로 여러 개의 붕어빵을 만들 수 있듯이, 하나의 이미지로 여러 개의 컨테이너를 실행할 수 있어요.

이미지(Image)와 컨테이너(Container)의 차이

이 부분이 Docker와 Docker Compose 개념 문과생도 이해하는 설명에서 가장 중요한 부분이에요. 제가 초반에 가장 많이 착각했던 게 바로 이미지와 컨테이너를 구분하지 못한 거였거든요.

구분 이미지(Image) 컨테이너(Container)
개념 실행 파일과 환경이 담긴 템플릿 이미지를 실행한 인스턴스
상태 읽기 전용, 변경 불가 실행 중, 데이터 변경 가능
비유 프로그램 설치 파일(.exe) 실제로 실행되고 있는 프로그램
예시 nginx:latest 실행 중인 nginx 웹서버

예를 들어, “nginx”라는 웹서버 이미지를 다운로드한다고 생각해보세요. 이건 프로그램 설치 파일을 받는 것과 같아요. 그리고 이 이미지를 실행하면 컨테이너가 만들어지는데, 이게 실제로 작동하는 웹서버인 거죠. 같은 이미지로 컨테이너를 10개 만들면, 똑같은 웹서버 10개가 동시에 돌아가는 거예요.

Dockerfile이 하는 역할

Dockerfile은 이미지를 만드는 설계도예요. 텍스트 파일 형태로 되어 있고, “이런 운영체제 위에, 이런 프로그램들을 설치하고, 이런 파일들을 복사하고, 이런 명령어를 실행해라” 같은 지시사항들이 순서대로 적혀 있어요.

처음에 저는 Dockerfile을 작성할 때 너무 복잡하게 생각했어요. 하지만 기본 구조는 생각보다 단순해요. 어떤 베이스 이미지를 쓸 건지, 어떤 파일을 복사할 건지, 어떤 명령어를 실행할 건지만 정해주면 돼요.

Docker Hub: 이미지 공유 마켓플레이스

Docker Hub는 앱스토어나 플레이스토어 같은 곳이에요. 전 세계 개발자들이 만든 이미지를 공유하는 공간이죠. MySQL이 필요하면 MySQL 공식 이미지를 다운로드하고, Redis가 필요하면 Redis 이미지를 다운로드하면 돼요.

제가 처음 Docker를 쓸 때 감동했던 게, PostgreSQL 데이터베이스를 설치하는 데 명령어 한 줄이면 끝났다는 거예요. 예전에는 공식 사이트 가서 설치 파일 받고, 경로 설정하고, 환경변수 등록하고… 이런 과정이 필요했는데 말이죠.

Docker와 Docker Compose 개념 문과생도 이해하는 설명 관련 이미지

Docker Compose가 필요한 순간: 여러 서비스를 한 번에 관리하기

실무에서 마주치는 복잡한 시스템 구조

실제 프로젝트를 하다 보면 하나의 애플리케이션만 돌리는 경우는 거의 없어요. 제가 사이드 프로젝트로 간단한 블로그를 만들었을 때도 이런 것들이 필요했어요:

  • 웹 애플리케이션 서버 (Node.js + Express)
  • 데이터베이스 (PostgreSQL)
  • 캐시 서버 (Redis)
  • 프록시 서버 (Nginx)

각각을 Docker 컨테이너로 띄운다고 하면, 4개의 컨테이너를 따로따로 실행해야 하는 거예요. 게다가 이 컨테이너들끼리 통신할 수 있게 네트워크도 설정해야 하고, 데이터베이스 비밀번호 같은 환경변수도 각각 지정해줘야 했죠.

Docker Compose 없이 작업할 때의 불편함

처음에 저는 Docker Compose를 몰라서 각 컨테이너를 수동으로 실행했어요. 터미널에 이런 긴 명령어를 4번 입력해야 했죠:

docker run -d –name postgres -e POSTGRES_PASSWORD=mypassword -p 5432:5432 postgres

docker run -d –name redis -p 6379:6379 redis

그리고 또…

이렇게 하다 보면 실수가 생기기 마련이에요. 포트 번호를 잘못 입력한다든지, 환경변수를 빼먹는다든지… 게다가 다음 날 다시 작업할 때 이 명령어들을 어디에 적어뒀는지 찾느라 시간을 낭비했어요.

docker-compose.yml 파일의 역할과 구조

Docker Compose는 이 모든 불편함을 해결해줘요. docker-compose.yml이라는 하나의 파일에 모든 설정을 적어두면, 명령어 한 줄로 전체 시스템을 실행할 수 있거든요.

YAML 파일은 들여쓰기로 구조를 표현하는 텍스트 파일이에요. JSON보다 읽기 쉽고, XML보다 간결해요. Docker와 Docker Compose 개념 문과생도 이해하는 설명에서 이 부분을 강조하는 이유는, 실무에서 정말 자주 사용하기 때문이에요.

항목 Docker 명령어 (수동) Docker Compose (자동)
컨테이너 실행 각 컨테이너마다 docker run 명령어 입력 docker-compose up 한 번만 입력
네트워크 설정 수동으로 네트워크 생성 및 연결 자동으로 같은 네트워크에 연결
환경변수 관리 명령어에 일일이 입력 파일에 한 번만 작성
재사용성 명령어를 매번 기억하거나 복사 파일 하나로 팀원 모두 공유

명령어 한 줄로 전체 환경 구축하기

docker-compose.yml 파일을 작성해두면, 정말 신기하게도 docker-compose up 명령어 하나로 모든 컨테이너가 순서대로 실행돼요. 데이터베이스가 먼저 준비되고, 그 다음에 웹 애플리케이션이 시작되고… 이런 순서까지 지정할 수 있어요.

제가 가장 편하다고 느낀 건, 새로운 팀원이 들어왔을 때예요. 예전에는 “여기 가서 MySQL 설치하고, 여기서 Node.js 받고…” 이런 식으로 30분 넘게 설명해야 했는데, 이제는 “이 프로젝트 폴더에서 docker-compose up 치면 돼요”라고 말하면 끝이에요.

실전 예제: 간단한 웹 애플리케이션 Docker로 실행해보기

준비물: Docker 설치 확인

우선 Docker가 설치되어 있는지 확인해야 해요. 터미널(Windows는 명령 프롬프트나 PowerShell)을 열고 이렇게 입력해보세요:

docker –version

버전 정보가 나오면 설치가 된 거예요. 2026년 기준으로 Docker Desktop이 가장 쉽게 설치할 수 있는 방법이고, Windows, Mac, Linux 모두 지원해요. 만약 설치가 안 되어 있다면 Docker 공식 사이트에서 다운로드하면 됩니다.

단일 컨테이너 실행 예제 (Nginx 웹서버)

가장 간단한 예제로 Nginx 웹서버를 실행해볼게요. Nginx는 정적 파일을 서비스하는 웹서버예요. 터미널에서 이 명령어를 입력해보세요:

docker run -d -p 8080:80 –name my-nginx nginx

이 명령어가 하는 일을 풀어서 설명하면:

  • docker run: 컨테이너를 실행해라
  • -d: 백그라운드에서 실행해라 (detached mode)
  • -p 8080:80: 내 컴퓨터의 8080 포트를 컨테이너의 80 포트와 연결해라
  • –name my-nginx: 이 컨테이너의 이름을 my-nginx로 지어라
  • nginx: nginx 이미지를 사용해라

이제 웹브라우저를 열고 http://localhost:8080에 접속해보세요. “Welcome to nginx!” 페이지가 보이면 성공이에요. 처음 이걸 봤을 때 정말 신기했어요. 복잡한 설치 과정 없이 명령어 한 줄로 웹서버가 돌아가다니!

Docker Compose로 다중 컨테이너 실행 (웹서버 + 데이터베이스)

이번엔 Docker Compose를 사용해서 웹 애플리케이션과 데이터베이스를 함께 실행해볼게요. 프로젝트 폴더를 하나 만들고, 그 안에 docker-compose.yml 파일을 만들어주세요.

파일 내용의 기본 구조는 이렇게 생겼어요:

Editor’s Pick

인체공학 버티컬 마우스
장시간 코딩 손목 보호

자세히 보기

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

  • version: Docker Compose 파일 버전
  • services: 실행할 컨테이너들의 목록
  • 각 서비스마다: 사용할 이미지, 포트, 환경변수 등을 지정

예를 들어 웹 애플리케이션과 PostgreSQL 데이터베이스를 함께 실행하는 설정에는 web 서비스와 db 서비스를 정의하고, 웹 서비스가 데이터베이스 서비스에 연결될 수 있도록 설정해요.

설정 파일을 작성한 후, 프로젝트 폴더에서 이 명령어를 실행하면:

docker-compose up -d

두 개의 컨테이너가 동시에 실행돼요. 로그를 확인하고 싶으면 docker-compose logs를 입력하면 되고, 전부 종료하고 싶으면 docker-compose down을 입력하면 돼요.

제가 처음 Docker Compose를 썼을 때 실수한 게 있어요. 들여쓰기를 탭(Tab)으로 했다가 에러가 난 거예요. YAML 파일은 반드시 스페이스(Space)로 들여쓰기를 해야 해요. 이것 때문에 30분을 헤맸던 기억이 나네요.

자주 사용하는 기본 명령어 모음

Docker와 Docker Compose 개념 문과생도 이해하는 설명을 마무리하면서, 실제로 자주 사용하는 명령어들을 정리해볼게요:

작업 Docker 명령어 Docker Compose 명령어
컨테이너 실행 docker run [이미지명] docker-compose up
백그라운드 실행 docker run -d [이미지명] docker-compose up -d
실행 중인 컨테이너 확인 docker ps docker-compose ps
로그 확인 docker logs [컨테이너명] docker-compose logs
컨테이너 중지 docker stop [컨테이너명] docker-compose stop
컨테이너 삭제 docker rm [컨테이너명] docker-compose down

저는 초반에 컨테이너를 중지하는 것(stop)과 삭제하는 것(rm)의 차이를 몰랐어요. stop은 프로그램을 종료하는 거고, rm은 아예 지워버리는 거예요. 데이터를 보존하고 싶으면 stop만 하면 되고, 깨끗하게 초기화하고 싶으면 down으로 삭제하면 돼요.

자주 묻는 질문 (FAQ)

Q. Docker와 가상머신(VM)은 뭐가 다른가요?

이건 제가 처음 Docker를 배울 때 가장 헷갈렸던 부분이에요. 둘 다 “격리된 환경”을 만든다는 점에서 비슷하지만, 작동 방식이 완전히 달라요.

가상머신은 하드웨어 자체를 가상화해요. 내 컴퓨터 위에 가짜 컴퓨터를 하나 더 만드는 거죠. 그래서 운영체제를 통째로 설치해야 하고, 부팅 시간도 오래 걸리고, 용량도 GB 단위로 먹어요.

반면 Docker 컨테이너는 호스트 운영체제의 커널을 공유해요. 운영체제를 통째로 설치하는 게 아니라, 필요한 라이브러리와 애플리케이션만 격리해서 실행하는 거예요. 그래서 훨씬 가볍고(MB 단위), 빠르게 실행되고(몇 초), 리소스도 적게 먹어요.

Q. Docker를 실무에서 어떻게 활용하나요?

제 경험을 바탕으로 말씀드리면, Docker는 개발부터 배포까지 전 과정에서 사용돼요. 로컬 개발 환경을 Docker Compose로 구성하면 팀원들이 모두 동일한 환경에서 작업할 수 있어요. “내 컴퓨터에선 되는데요?” 문제가 사라지는 거죠.

테스트 환경에서도 유용해요. CI/CD 파이프라인에서 Docker 컨테이너 안에서 자동화된 테스트를 실행하면, 매번 동일한 환경에서 테스트가 이루어져요. 그리고 실제 서비스 배포 시에도 Docker 이미지를 서버에 올려서 실행하면, 개발 환경과 운영 환경의 차이로 인한 문제가 거의 없어요.

2026년 현재는 클라우드 환경(AWS, Google Cloud, Azure)에서도 Docker를 기본으로 지원하기 때문에, Docker를 알면 클라우드 배포도 훨씬 쉬워져요.

Q. Windows/Mac에서도 Docker를 사용할 수 있나요?

네, 가능해요! Docker Desktop이라는 프로그램을 설치하면 Windows와 Mac에서도 Docker를 사용할 수 있어요. 저도 Mac을 쓰는데 아무 문제 없이 잘 쓰고 있어요.

다만 알아둘 점이 있어요. Docker는 원래 Linux 기술이에요. 그래서 Windows나 Mac에서는 Docker Desktop이 내부적으로 경량 Linux 가상머신을 띄워서 그 안에서 Docker를 실행해요. 사용자 입장에서는 차이를 못 느끼지만, 가끔 파일 시스템 성능이 Linux에서보다 느릴 수 있어요.

Windows 사용자라면 WSL2(Windows Subsystem for Linux 2)와 함께 사용하는 걸 추천해요. 성능도 좋아지고, Linux 환경과 거의 동일하게 작업할 수 있거든요.

Q. Docker Compose와 Kubernetes는 어떤 관계인가요?

이건 제가 회사에서 실제로 겪었던 혼란이에요. “Docker Compose를 쓰는데 Kubernetes도 배워야 하나요?”라고 물어봤더니, 선배가 이렇게 설명해줬어요.

Docker Compose는 주로 로컬 개발이나 소규모 프로젝트에 적합해요. 하나의 서버에서 여러 컨테이너를 관리하는 용도죠. 설정도 간단하고, 배우기도 쉬워요. Docker와 Docker Compose 개념 문과생도 이해하는 설명에서 Docker Compose를 중점적으로 다룬 이유도 입문자에게 적합하기 때문이에요.

반면 Kubernetes는 여러 서버에 걸쳐 수백, 수천 개의 컨테이너를 관리하는 도구예요. 대규모 운영 환경에서 사용하는 거죠. 자동 스케일링, 로드밸런싱, 자동 복구 같은 고급 기능들이 있어요.

입문 단계에서는 Docker와 Docker Compose만 확실히 이해하는 게 중요해요. 나중에 큰 프로젝트를 하게 되거나 회사에서 필요하면 그때 Kubernetes를 배워도 늦지 않아요.

Q. Docker 이미지가 너무 커지면 어떻게 하나요?

제가 처음 Dockerfile을 작성했을 때 이미지 크기가 2GB가 넘었어요. 왜 이렇게 큰지 확인해보니, 개발 도구나 임시 파일들이 다 포함되어 있더라고요.

이미지 크기를 줄이는 몇 가지 팁이 있어요. 첫째, alpine 같은 경량 베이스 이미지를 사용하는 거예요. 둘째, 멀티 스테이지 빌드를 사용해서 빌드에만 필요한 파일들은 최종 이미지에 포함시키지 않는 거예요. 셋째, 불필요한 파일들은 .dockerignore 파일에 추가해서 제외시키는 거예요.

이런 최적화를 통해 제 이미지를 200MB까지 줄일 수 있었어요. 이미지가 작으면 다운로드도 빠르고, 배포 시간도 단축되니까 꼭 신경 써야 할 부분이에요.

마치며: Docker 학습 로드맵과 다음 단계

Docker와 Docker Compose 개념 문과생도 이해하는 설명을 마치면서, 제가 Docker를 배우면서 느낀 점들을 공유하고 싶어요.

처음에는 “이게 왜 필요하지?”라는 생각이 들었어요. 제 컴퓨터에서 프로그램 실행하는 게 어렵지 않은데, 왜 굳이 Docker를 써야 하나 싶었죠. 하지만 팀 프로젝트를 하면서, 그리고 실제로 서비스를 배포하면서 Docker의 진가를 느꼈어요.

“환경 설정에 시간 낭비하지 않기”, “어디서든 동일하게 실행되기”, “팀원들과 환경 공유하기” – 이런 것들이 얼마나 중요한지 직접 겪어보니 알겠더라고요.

Docker를 배우는 로드맵을 추천드리자면:

  1. 기본 개념 이해: 이 글에서 다룬 이미지, 컨테이너, Dockerfile, Docker Compose 개념을 확실히 이해하세요.
  2. 간단한 실습: 공식 이미지들(nginx, mysql, redis 등)을 직접 실행해보면서 명령어에 익숙해지세요.
  3. 직접 Dockerfile 작성: 본인이 만든 간단한 프로젝트를 Docker 이미지로 만들어보세요. Python 스크립트든, Node.js 앱이든 상관없어요.
  4. Docker Compose 활용: 실제 프로젝트처럼 여러 서비스를 연결해보세요. 웹 앱 + 데이터베이스 조합으로 시작하는 게 좋아요.
  5. 최적화와 보안: 이미지 크기 줄이기, 멀티 스테이지 빌드, 보안 취약점 스캔 등을 배워보세요.

저도 아직 배우는 중이에요. 가끔 에러가 나면 당황하고, “이게 왜 안 되지?”하면서 구글링하는 시간이 더 많아요. 하지만 그 과정에서 하나씩 배워가는 재미가 있어요.

2026년 현재 Docker는 거의 모든 개발 환경에서 표준처럼 사용되고 있어요. 처음엔 어렵게 느껴질 수 있지만, 한번 익숙해지면 Docker 없이는 개발하기 힘들 정도로 유용해요.

여러분도 이 글을 읽고 Docker와 Docker Compose 개념 문과생도 이해하는 설명이 조금이라도 와닿았다면, 지금 바로 Docker Desktop을 설치하고 첫 컨테이너를 실행해보세요. 제가 처음 “Welcome to nginx!” 페이지를 봤을 때의 그 신기함을, 여러분도 곧 느낄 수 있을 거예요.

개발은 완벽하게 이해하고 시작하는 게 아니라, 일단 해보면서 배우는 거니까요. 에러가 나도 괜찮아요. 저도 여전히 에러를 마주하면서 배우고 있으니까요. 함께 성장해나가요!

Docker와 Docker Compose 개념 문과생도 이해하는 설명 상세 정보

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤