도커(Docker)란?

도커는 소프트웨어 개발과 배포를 도와주는 컨테이너(Container) 기술입니다. 도커를 사용하면 애플리케이션을 빌드하고, 배포하고, 실행하는 전체 과정을 훨씬 쉽게 관리할 수 있습니다.
주요 개념
Docker Image: 애플리케이션과 그 실행에 필요한 모든 설정이 포함된 스냅샷입니다. 컨테이너를 만들기 위해 반드시 필요한 재료라고 할 수 있습니다.
Docker Container: 이미지를 기반으로 실행되는 독립된 프로세스입니다. 독립된 환경에서 애플리케이션을 실행하기 때문에, 서로 다른 컨테이너는 서로 간섭하지 않습니다.
Docker Hub: 이미지를 공유하고 배포할 수 있는 중앙 저장소입니다. 다른 사람이 만들어 놓은 이미지를 가져다 쓸 수도 있고, 내가 만든 이미지를 올려서 공유할 수도 있습니다.
Dockerfile: 이미지를 만들기 위한 스크립트 파일입니다. 이미지를 빌드하는 과정과 필요한 명령어들을 순서대로 기술합니다.
☕ 커피로 쉽게 이해하는 Docker
개발자들의 수액이라고 할 수 있는 커피를 예시로 들어보겠습니다. 제가 커피 가게를 하나 창업했는데 잘 되어서 프랜차이즈화하여 다른 지점을 낸다고 가정해봅시다. 재료가 있다 하더라도 커피를 만드는 과정이나 비율이 조금씩 다르면 맛이 달라질 수 있습니다. 그렇게 되면 안 되기 때문에, 본점에서 사용하는 재료들을 밀키트로 만들어 다른 지점에 제공합니다. 그러면 다른 지점에서도 본점의 커피와 똑같은 맛을 낼 수 있습니다. 도커도 마찬가지입니다. 우리가 실행하는 프로그램은 환경이 다르면 결과도 달라질 수 있습니다. 데이터베이스 버전, 패키지 충돌, 경로 설정 문제 등 여러 가지 복합적인 요소들이 있기 때문입니다. 이것을 해결하기 위해 도커가 필요합니다. 도커는 어떤 환경에서든 언제나 같은 결과를 보장하기 위해 존재하는 도구입니다.
커피 비유 Docker 개념
| 비유 | Docker 개념 |
| 밀키트 | Docker Image |
| 밀키트로 만든 커피 | Docker Container |
| 커피 제작 레시피 | Dockerfile |
| 커피 프랜차이즈 본사 창고 | Docker Hub |
레시피(Dockerfile)와 밀키트(Image)만 있다면, 어떤 컴퓨터에서든 똑같은 프로그램을 실행할 수 있습니다. 도커는 단순히 프로그램만 패키징하는 것이 아니라 실행 환경까지 함께 패키징하기 때문에 실행을 보장할 수 있습니다.
도커의 필요성
개발자 A와 B가 함께 프로그램을 개발하고 배포한다고 가정해봅시다. 이때 아래와 같은 상황이 생길 수 있습니다.
- Java 버전이 서로 다른 경우
- 사용하는 라이브러리 버전이 다른 경우
- 실수로 특정 설정 파일이나 코드를 빠뜨린 경우
이런 상황에서는 분명히 문제가 생기게 됩니다. 이를 해결해 주는 것이 바로 도커입니다. 도커는 이 모든 것을 이미지 하나에 담아 어떤 상황에서도 똑같이 동작하도록 만들어 줍니다.
정리
- Docker Image : 실행에 필요한 모든 것을 담은 패키지입니다.
- Docker Container : 이미지를 실행한 인스턴스(프로그램)입니다.
- Dockerfile : 이미지를 어떻게 만들지 정의한 레시피 파일입니다.
- Docker Hub : 이미지를 저장하고 공유하는 중앙 저장소입니다.
도커 컨테이너를 공사장이나 항구의 컨테이너 박스로 떠올리기 쉽지만, Docker Container는 이미지를 실행한 프로그램이라고 이해하시는 것이 정확합니다.
포트 매핑
컨테이너는 자체 네트워크를 가지고 있기 때문에, 기본적으로 외부에서 접근할 수 없습니다. -p 옵션으로 호스트 포트와 컨테이너 포트를 연결해야 외부에서 접근이 가능합니다. 이것을 포트 매핑이라고 합니다.

# 호스트 8080 -> 컨테이너 8080
docker run -p 8080:8080 example-health-app:v1.0
-p 8080:8080 은 호스트의 8080번 포트로 요청이 들어오면, 컨테이너의 8080번 포트로 전달하라 는 의미입니다.
형식은 -p 호스트포트:컨테이너포트 순서입니다. 왼쪽이 내 컴퓨터(호스트), 오른쪽이 컨테이너라고 기억하시면 편합니다.
환경변수 주입
컨테이너 실행 시 -e 옵션을 사용하면 환경변수를 주입할 수 있습니다.
docker run -e SPRING_PROFILES_ACTIVE=local \
-e SPRING_DATASOURCE_URL=jdbc:mysql://... \
example-health-app:v1.0
위 명령어를 실행하면 아래와 같이 설정이 적용됩니다.
| 환경 변수 | 값 |
| SPRING_PROFILES_ACTIVE | local |
| SPRING_DATASOURCE_URL | jdbc:mysql://... |
데이터베이스 주소나 실행 환경(local, dev, prod 등)처럼 상황에 따라 바뀌는 설정값을 이미지에 직접 넣지 않고, 실행 시점에 외부에서 주입할 수 있어서 유연하게 활용할 수 있습니다.
태그
태그는 도커 이미지를 버전별로 구분하고 싶을 때 사용합니다. 이미지 빌드 시 태그를 따로 지정하지 않으면, 자동으로 latest 태그가 붙게 됩니다.
# 태그 지정 O
docker build -t example-health-app:v1.0 .
# 태그 지정 X → latest 자동 적용
docker build -t example-health-app .
latest는 단순히 태그를 지정하지 않았을 때 붙는 기본값입니다. 실제로 가장 최신 버전임을 자동으로 보장하지는 않으므로, 운영 환경에서는 v1.0, v1.1 처럼 명시적인 태그를 사용하는 것을 권장합니다.
Docker 빌드
Docker 빌드를 하기 전에 먼저 Dockerfile이 필요합니다. 앞서 커피 비유로 설명드렸지만 다시 정리하자면, Dockerfile은 Docker 이미지 생성에 필요한 설정값을 담고 있는 스크립트 파일입니다. 내부에 명시된 옵션값에 따라 컨테이너의 런타임 환경, 의존성 패키지, 실행 명령어가 정의됩니다.
Dockerfile 옵션
| 옵션 | 설명 |
| FROM | 컨테이너 런타임 환경을 지정합니다. 버전을 명시하지 않으면 최신 버전을 사용합니다. |
| WORKDIR | 컨테이너 내부의 작업 디렉토리입니다. 이후 명령어들이 이 경로를 기준으로 실행됩니다. |
| RUN | 이미지 빌드 시점에 실행할 명령어입니다. 패키지 설치 등에 사용합니다. |
| EXPOSE | 컨테이너 실행 시 외부에 열어줄 포트를 명시합니다. |
| CMD | 컨테이너 실행 시점에 실행할 명령어입니다. RUN과 실행 시점이 다른 점을 주의해야 합니다. |
RUN과 CMD의 차이가 헷갈리기 쉽습니다. RUN은 이미지를 만들 때, CMD는 이미지를 실행할 때 동작한다고 기억하시면 됩니다.
Dockerfile 예시
# 런타임 환경: Node.js 14 버전
FROM node:14
# 작업 디렉토리 설정
WORKDIR /app
# 의존성 파일 복사 및 설치
COPY package*.json ./
RUN npm install
# 소스코드 전체 복사
COPY . .
# 외부에 열어줄 포트
EXPOSE 8080
# 컨테이너 실행 시 앱 시작
CMD ["node", "server.js"]
Docker 빌드 명령어
Dockerfile 작성이 끝났다면, 터미널에서 아래 명령어를 입력하여 이미지를 빌드할 수 있습니다.
# 기본 빌드
docker build [Dockerfile 경로]
# 태그를 함께 지정하는 경우 (권장)
docker build -t example-health-app:v1.0 .
Dockerfile 경로나 파일 이름이 잘못된 경우 에러가 발생할 수 있습니다. 명령어 실행 위치와 경로를 꼭 확인해 주세요.
Docker 실행 (Docker Run) - 컨테이너 생성 및 실행
이미지 빌드가 완료되었다면, 이제 해당 이미지를 실행할 차례입니다. docker run 명령어는 이미지를 읽어 컨테이너를 생성하고 실행하는 명령어입니다.
docker run -p [호스트 포트]:[컨테이너 포트] [Image ID]
# 예시
docker run -p 8080:8080 example-health-app:v1.0
💡 앞서 설명드린 포트 매핑(-p 옵션) 을 이 시점에 함께 지정해 주어야 외부에서 컨테이너에 접근할 수 있습니다.
도커(Docker) 전체 흐름 정리
| 단계 | 명령어 | 설명 |
| 1단계 | Dockerfile 작성 | 이미지 설정 정의 |
| 2단계 | docker build | 이미지 생성 |
| 3단계 | docker run | 컨테이너 생성 및 실행 |
'Etc > Web & CS' 카테고리의 다른 글
| 프로그래밍 언어(Programming Language) (0) | 2026.03.15 |
|---|---|
| 아키텍처(Architecture) (0) | 2026.03.13 |
