개발을 하다 보면 "내 컴퓨터에서는 잘 되는데, 서버에서는 왜 안 되지?"라는 상황을 자주 마주하게 된다.
팀원끼리 macOS, Windows 등 각자 다른 운영체제와 개발 환경을 사용하다 보면 발생하는 고질적인 문제다.
이러한 환경의 차이를 극복하고, 애플리케이션을 어디서든 동일하게 실행할 수 있도록 도와주는 것이 도커(Docker)다.

1. Docker란?
소프트웨어 개발에서 오랫동안 문제가 되었던 중 하나는 '환경 차이'가 있다. 다들 팀원을 꾸려서 프로젝트를 진행할 때, 서로의 환경이 달라서 문제가 되었던 경험이 있을 것이다.
- OS 차이 (Windows / Linux / Mac)
- 라이브러리 버전 차이
- 의존성 충돌
- 설정 파일 불일치
위와 같은 문제를 해결하기 위해서 탄생한 것이 Docker로 애플리케이션을 신속하게 구축, 테스트, 배포할 수 있도록 해주는
소프트웨어 플랫폼이다.
도커는 소프트웨어를 컨테이너(Container)라는 표준화된 유닛으로 패키징하며, 이 컨테이너 안에는 라이브러리, 시스템 도구, 코드 등 애플리케이션을 실행하는 데 필요한 모든 것이 포함되어 있다.
가상머신과 달리 무거운 OS커널을 통쨰로 올리지 않고 호스트 OS의 커널을 공유하므로, 훨씬 가볍고 빠르게 동작하는 장점이 있다.
즉, 도커는 컨테이너를 사용하여 각각의 프로그램을 분리된 환경에서 실행 및 관리할 수 있는 도구라고 볼 수 있다.
Docker를 쓰는 이유는 아래에 4가지가 있다.
- 이식성: 특정 프로그램을 다른 곳으로 쉽게 옮겨서 설치 및 실행할 수 있는 특성
- 확장성: 매번 귀찮은 설치 과정 없이 쉽게 응용 프로그램을 확장할 수 있다.
- 일관성: 항상 일관되게 프로그램을 설치할 수 있다. (버전, 환경 설정, 옵션, OS 등)
- 격리된 환경: 각 프로그램이 독립적인 환경에서 실행되기 떄문에 프로그램 간에 충돌이 일어나지 않는다.
2. 기본 구성 요소
도커 이미지 (Docker Image)
- 애플리케이션을 실행하는 데 필요한 모든 설정(코드, 런타임, 시스템 도구, 라이브러리 등)을 포함하고 있는
읽기 전용(Read-only) 템플릿 - 하나의 이미지로 동일한 환경을 가진 여러 개의 컨테이너를 생성할 수 있다.
도커 컨테이너 (Docker Container)
- 도커 이미지를 바탕으로 실행되는 격리된 프로세스 공간입니다.
- 객체 지향 프로그래밍의 인스턴스(Instance)에 해당합니다.
- 실제로 애플리케이션이 구동되는 환경이며, 각 컨테이너는 독립적으로 실행되므로 서로 간섭하지 않습니다.
도커 레지스트리 (Registry) & 도커 허브 (Hub)
- 도커 레지스트리는 빌드된 도커 이미지를 저장하고 배포하는 저장소
- 도커 허브(Docker Hub)는 도커에서 공식적으로 제공하는 가장 대표적인 퍼블릭 레지스트리
- 깃허브(GitHub)처럼 누군가 만들어둔 이미지를 다운로드(Pull)하거나, 내가 만든 이미지를 업로드(Push)하여 공유할 수 있다.
3. 시스템 및 인프라 요소
도커 엔진 (Docker Engine)
- 도커를 실행하고 관리하는 핵심 소프트웨어(데몬)
- 백그라운드에서 동작하며, 사용자가 입력한 명령어(CLI)를 API 형태로 전달받아 이미지를 빌드하거나 컨테이너를 실행하는 등 실질적인 작업을 수행
도커 볼륨 (Docker Volume)
- 컨테이너는 기본적으로 종료되거나 삭제되면 내부 데이터도 함께 날아가는 휘발성을 지닌다.
- 이를 방지하기 위해 컨테이너 내부의 데이터를 호스트 컴퓨터의 물리적인 저장 공간에 연결하여 데이터를 영구적으로
보존(영속성)하는 기능이 바로 도커 볼륨이다. - 데이터베이스(DB) 데이터를 안전하게 보관할 때 필수적
도커 네트워크 (Docker Network)
- 각각 격리된 컨테이너들이 서로 통신하거나, 외부 인터넷망과 연결될 수 있도록 돕는 가상의 네트워크 환경
- 예를 들어, 웹 서버 컨테이너와 데이터베이스 컨테이너가 서로 데이터를 주고받기 위해서는 같은 도커 네트워크 안에 연결되어 있어야한다.
4. 확장 도구
도커파일 (Dockerfile)
- 나만의 도커 이미지를 생성하기 위한 설계도이자 설정 파일
- 어떤 베이스 OS를 사용할지, 어떤 패키지를 설치할지, 소스 코드는 어디에 복사할지 등의 빌드 과정을 스크립트로 차례대로 작성합니다.
- 이 파일을 빌드하면 새로운 도커 이미지가 생성
도커 컴포즈 (Docker Compose)
- 여러 개의 컨테이너를 하나의 통합된 애플리케이션처럼 일괄적으로 묶어서 실행하고 관리하는 도구
- "docker-compose.yml" 파일 하나에 설정을 정의해둔다.
- 예를 들어 React 프론트엔드, Spring Boot 백엔드, 데이터베이스 컨테이너를 각각 띄우지 않고, 컴포즈 명령어 한 줄로 세 개의 컨테이너를 한 번에 실행하고 연결할 수 있다.
5. 총정리
| 명칭 | 설명 |
| Dockerfile | 어떤 환경을 만들지 기록한 설계도 (Recipe) |
| Docker Image | 계도대로 만들어진 실행 파일의 묶음 (Template) |
| Docker Container | 이미지를 실제로 실행시킨 독립적인 프로세스 (Instance) |
| Docker Engine | 컨테이너를 관리하고 실행하는 핵심 심장부 |
| Docker Volume | 컨테이너가 사라져도 데이터는 남도록 하는 저장소 |
| Docker Network | 컨테이너끼리, 혹은 외부와 소통하게 해주는 통로 |
| Docker Hub | 이미지를 저장하고 공유하는 GitHub 같은 공간 |
| Docker Compose | 여러 개의 컨테이너를 명령어 한 줄로 관리하는 도구 |
'프로그래밍' 카테고리의 다른 글
| JWT, Security에 대해서 (0) | 2026.05.26 |
|---|---|
| [Docker] Docker 컨테이너 Life Cycle (0) | 2026.05.17 |
| [Docker] Docker가 실행되지 않는 문제 해결 (0) | 2026.05.13 |
| [Spring Boot] Spring Boot의 버전을 낮추는 법 (0) | 2026.04.01 |
| [ IntelliJ / MySQL ] 자바프로젝트, MySQL 연동하기 (0) | 2026.03.16 |