[Docker] Docker 입문: 이미지, 컨테이너, Registry, Docker Engine 정리

2026. 6. 23. 15:20·Back-end/DevOps

개발할 때는 잘 실행되던 애플리케이션이 서버에 배포하자마자 오류가 나는 경우가 있다.

  • 운영체제, 라이브러리 버전, 실행 환경이 다르기 때문

⇒ Docker는 이런 환경 차이를 줄이기 위해 등장한 컨테이너 기반 플랫폼이다.

Docker란?

‘컨테이너화’를 사용하여 응용 프로그램의 배포, 확장 및 관리를 자동화할 수 있는 오픈 소스 플랫폼이다

  • 코드, 실행 시간, 시스템 도구 및 라이브러리를 포함하여 응용 프로그램을 실행하는 데 필요한 모든 것을 가볍고 격리된 환경으로 포함한다.
  • 응용 프로그램과 해당 종속성을 표준화된 단위로 패킺앟여 다양한 환경에서 일관되게 배포하고 실행하기 쉽게 만들어준다.

사용 이유

Docker를 사용하는 가장 큰 이유는 environment disparity(환경 격차)라는 문제를 해결하는 것이다.

내 컴퓨터에서는 되는데 서버에서는 안 되는 문제

기존에 내 컴퓨터가 Windows라고 하고, 실제 프로덕션 서버를 Linux라고 할 때 프로덕션 서버에 프로그램을 올리자 환경이 적절히 구성되어 있지 않으니 잘 안돌아간다

  • 이 외에도 종속성, 라이브러리 버전, 운영 체제 구성의 차이로 인해 문제가 종종 발생을 하기도 하였다

Docker의 해결방식

Docker는 이런 문제를 런타임 환경을 표준화함으로써 이 문제를 해결하였다. 애플리케이션 코드와 특정 종속성을 단일 단위로 묶어 개발자 노트북, 테스트 서버 또는 클라우드 클러스터 등 어떤 환경에서든 소프트웨어가 동일하게 실행되도록 보장하였다.

  • 휴대성: 로컬 컴퓨터, 클라우드, 온프레미스 서버 등 어디에서든 실행 가능
  • 일관성: 개발, 테스트 및 운영 환경에서 동일한 동작
  • 경량화: 앱별로 완전한 운영체제가 필요하지 않으며, 컨테이너는 호스트 커널을 공유
  • 확장성: 마이크로서비스 및 Kubernetes, Docker Swarm과 같은 오케스트레이터에 이상적
  • 효율성: 몇 초 만에 시작되며 시스템 리소스를 적게 사용

컨테이너화란?

  • 응용 프로그램을 실행하는 데 필요한 모든 것을 포함한 가벼우며 격리된 환경을 제공
    • 단, VM처럼 운영체제 전체를 포함하는 것이 아니라 호스트 OS의 커널을 공유하고, 필요한 실행 환경과 라이브러리만 이미지에 포함한다.
  • 코드, 실행 시간, 시스템 도구 및 라이브러리 등을 포함하여 응용 프로그램과 해당 종속성을 표준화된 단위로 패키징하여 일관되게 배포하고 실행하는 것이 컨테이너화의 목적

즉, 어플리케이션을 개발 후 사용자가 실행할 때 필요한 환경들은 한번에 패키징하여 별 다른 설치 없이 한 번에 실행시켜주도록 하는 것


VM vs 컨테이너

비교 요소 가상 머신 (VM) 도커 (Docker)
구조 하드웨어 위에 호스트 OS와 게스트 OS로 구성 호스트 OS 위에서 동작하며 컨테이너화된 애플리케이션 실행
성능 하이퍼바이저로 인한 오버헤드로 약간의 성능 저하 컨테이너화로 인한 가벼운 성능 손실
시작 시간 VM을 시작하기 위해 시간이 필요 컨테이너는 몇 초 내에 시작 가능
자원 사용량 독립적인 자원을 사용하여 오버헤드 발생 호스트의 커널 및 자원을 공유하여 효율적인 자원 사용
확장성 가상 머신은 더 많은 하드웨어를 추가하여 확장 가능 도커는 컨테이너를 복제하여 수평으로 확장 가능
격리성 격리된 환경을 제공하여 보안을 강화 호스트와 컨테이너 간 격리가 상대적으로 약함
관리 용이성 VM은 완전한 운영 체제를 관리해야 함 도커는 이미지와 컨테이너를 사용하여 관리 용이

Docker 아키텍처 및 작동 방식

클라이언트 - 서버 아키텍처를 사용

Client

  • Docker 데몬과 통신하여 Docker 컨테이너를 빌드, 실행 및 배포하는 데 도움
  • 데몬과 같은 시스템에서 실행되거나, Docker 클라이언트를 Docker 데몬에 원격으로 연결할 수 있음
  • Docker 클라이언트와 데몬은 유닉스 소켓이나 네트워크를 통한 REST API를 이용하여 서로 상호 작용한다
  • Docker 명령어를 사용하여 컨테이너를 실행, 관리, 모니터링하고, 이미지를 빌드하거나 다운로드할 수 있음
  • Docker 명령어를 통해 Docker Host와 상호작용 하는 역할

Docker Host

  • Docker Host는 Docker Engine이 설치되어 컨테이너를 실행하고 관리하는 환경이다. 물리 서버, 가상 머신, 클라우드 인스턴스 등이 Docker Host가 될 수 있다.
  • Docker 데몬을 실행하여 컨테이너를 생성, 시작, 중지 및 관리를 수행하는 역할을 수행
  • Client의 요청을 받아들이고 컨테이너를 생성, 시작, 중지, 제거하는 등의 작업을 수행
    • 또한, 호스트 운영 체제의 리소를 사용하여 컨테이너를 실행하고 관리

Docker Registry

  • Docker 이미지를 저장 및 관리하는 중앙 집중 식 저장소
  • 공식적인 도커 레지스트리로, 도커 허브(Docker Hub)를 통해서 Docker 이미지를 공유하고 검색할 수 있도록 함
    • 또한, 개인이나 기업은 독립적인 도커 레지스트리를 구축하여 이미지를 안전하게 저장하고 관리할 수 있다

Docker 클라이언트, 도커 호스트, 도커 레지스트리 간 흐름

  1. Client → Docker Host
  • 클라이언트(Client)는 도커 명령어(Docker run, build, pull, …)를 사용하여 도커 호스트(Docker Host)에 요청
  1. Docker Host
  • 도커 호스트(Docker Host)는 클라이언트(Client)의 요청을 받아들이고 해당 요청에 따라 컨테이너를 생성, 중지, 제거하거나 이미지를 관리
  1. Docker Host → Registry
  • 만약 클라이언트(Client)가 이미지를 생성하거나 업로드하려면, 도커 호스트(Docker Host)는 해당 이미지를 도커 레지스트리(Registry)에 업로드
  1. Registry
  • 도커 레지스트리(Registry)는 이미지를 저장하고 관리하는 중앙 집중식 저장소입니다. 도커 호스트(Docker Host)에서는 도커 레지스트리(Registry)에 이미지를 업로드하거나 다운로드할 수 있다.
  1. Docker Host → Client
  • 컨테이너가 종료되면, 도커 호스트(Docker Host)는 해당 컨테이너의 상태와 결과를 클라이언트(Client)에게 반환
  • 이러한 과정들을 통하여 클라이언트, 도커 호스트, 도커 레지스트리는 도커 환경에서 상호작용하며 이미지 업로드와 다운로드, 컨테이너의 생성과 관리 등의 작업을 수행

구성 요소

Docker의 주요 구성 요소 중 일부

  • Docker Engine:  컨테이너 생성 및 관리를 담당하는 핵심 부분인 Docker 데몬을 포함
  • Dockerfile: 이미지를 빠르게 생성하는 단계를 설명하는 파일
  • Docker 이미지:  애플리케이션 코드와 종속성을 포함하는 컨테이너를 생성하는 데 사용되는 읽기 전용 템플릿
  • Docker Hub: 컨테이너 이미지를 찾고 공유하는 데 사용되는 클라우드 기반 저장소
  • Docker Registry: Docker 이미지를 저장하는 분산 시스템으로, 이미지를 공개 모드와 비공개 모드 모두에 저장할 수 있다.

Docker Engine

Docker Engine이 없다면 Docker 이미지를 빌드하거나 컨테이너를 실행할 수 없다

  • 클라이언트는 Docker 명령 (docker build, docker run 등)을 보낸다.
  • 데몬은 이러한 명령어를 수신하고 컨테이너 작업을 수행
  • REST API는 이러한 통신을 가능하게 하는 인터페이스

즉, Docker Engine은 Docker 클라이언트와 데몬을 연결하여 컨테이너를 효율적으로 구축하고 관리함으로써 컨테이너화를 가능하게 하는 런타임


Dockerfile

DSL(도메인 특화 언어)을 사용하며 Docker 이미지를 생성하는 명령어를 포함

  • 이미지를 빠르게 생성하기 위한 프로세스를 정의
  • 애플리케이션을 개발할 때 Docker 데몬이 모든 명령어를 위에서부터 순서대로 실행하므로 Dockerfile을 순서대로 작성하는 것이 좋다

※Docker 이미지는 Dockerfile을 사용하여 생성된다


Docker 이미지

Docker 이미지는 컨테이너를 생성하기 위한 읽기 전용 템플릿이다.

애플리케이션 코드, 런타임, 라이브러리, 환경 변수, 실행 명령 등이 레이어 형태로 포함되어 있다.

  • 애플리케이션 코드, 런타임, 라이브러리, 환경 변수 및 구성 등 애플리케이션 실행에 필요한 모든 것을 포함하는 실행 가능한 패키지 역할을 함

작동 방식

  • 이 이미지는 컨테이너를 어떻게 생성해야 하는지를 정의한다.
  • 어떤 소프트웨어 구성 요소가 실행될지, 그리고 어떻게 구성될지를 지정한다.
  • 이미지가 실행되면 Docker 컨테이너가 된다.

컨테이너와의 관계

  • Docker 이미지 → Blueprint(정적, 읽기 전용).
  • Docker 컨테이너 → 해당 이미지의 실행 중인 인스턴스 (동적, 실행 가능)

Docker 컨테이너

Docker 이미지의 경량 실행 가능한 인스턴스

애플리케이션 코드와 모든 종속성을 함께 패키징하여 격리된 환경에서 실행한다. 컨테이너를 사용하면 개발자 노트북, 테스트 서버, 프로덕션 환경 등 다양한 환경에서 애플리케이션을 빠르고 안정적으로 실행할 수 있다.

  • Docker 이미지가 실행될 때 컨테이너가 생성된다.
  • 호스트 시스템에서 독립적인 프로세스로 실행되지만 호스트 시스템의 운영 체제 커널을 공유한다.
  • 여러 컨테이너가 서로 간섭하지 않고 동일한 시스템에서 실행할 수 있다.

이미지와의 관계:

  • Docker 이미지 → Blueprint(정적, 읽기 전용).
  • Docker 컨테이너 → 해당 이미지의 실행 중인 인스턴스 (동적, 실행 가능)

Docker Hub

저장소 서비스이며, 클라우드 기반 서비스로 사용자는 인터넷을 통해 언제 어디서든 Docker 컨테이너 이미지를 Docker Hub에 Push하거나 Docker 컨테이너 이미지를 가져올 수 있다

  • 리포지토리 서비스: 사용자가 인터넷을 통해 어디에서든 컨테이너 이미지를 푸시 (업로드) 하거나 풀(다운로드) 할 수 있는 글로벌 스토리지 허브 역할을 한다.
  • 이미지 관리: 누구나 접근할 수 있는 공개 레지스트리 또는 특정 사용자나 팀만 접근할 수 있는 비공개 레지스트리에 이미지를 호스팅할 수 있는 유연성을 제공한다.
  • 협업: 표준화된 환경을 팀이 찾고, 재사용하고, 공유할 수 있도록 하여 DevOps 워크플로를 간소화한다.
  • 접근성: 모든 주요 운영 체제와 호환되는 오픈 소스 무료 도구이다.
  • 리소스 라이브러리: Nginx, Python, Ubuntu와 같은 인기 소프트웨어의 수백만 개의 “공식 이미지”를 호스팅하여 프로젝트를 위한 검증된 시작점을 제공한다.

Registry와 Hub의 차이

  • Docker Registry는 Docker 이미지를 저장하고 배포하는 저장소이다.
  • Docker Hub는 Docker에서 공식적으로 제공하는 대표적인 공개 Registry 서비스이다.

Docker 명령어

Docker는 컨테이너 관리 프로세스를 간소화하는 강력한 소프트웨어로 자리매김했습니다. Docker는 원활한 개발 및 배포 워크플로우를 보장하는 데 도움이 됩니다. 다음은 일반적으로 사용되는 몇 가지 Docker 명령어입니다.

  • Docker Run: 이미지에서 컨테이너를 실행하는 데 사용되며, 런타임 옵션과 명령어를 지정
  • Docker Pull: Docker Hub와 같은 컨테이너 레지스트리에서 컨테이너 이미지를 로컬 컴퓨터로 가져옴
  • Docker ps: 명령어는 실행 중인 컨테이너와 컨테이너 ID, 사용 이미지, 상태 등의 중요한 정보를 표시하는 데 도움 됨
  • Docker Stop: 실행 중인 컨테이너를 안전하게 종료하고 컨테이너 내부의 프로세스를 종료하는 데 도움이 된다.
  • Docker Start: 중지된 컨테이너를 다시 시작하여 이전 상태에서 작업을 재개하는 데 도움이 된다.
  • Docker 로그인: Docker 레지스트리에 로그인하여 비공개 저장소에 접근할 수 있도록 도와준다.

정리

결국 Docker는 “내 컴퓨터에서는 됐는데 서버에서는 안 돼요”라는 문제를 줄이기 위해 애플리케이션과 실행 환경을 하나의 컨테이너 단위로 패키징하는 기술이다. Docker를 사용하면 개발, 테스트, 운영 환경을 더 일관성 있게 유지할 수 있고, 컨테이너 기반 배포와 확장도 훨씬 쉬워진다.


참고 자료

https://adjh54.tistory.com/352

https://velog.io/@seokbin/신입을-위한-도커-기본-사용법

https://www.geeksforgeeks.org/devops/introduction-to-docker/

'Back-end > DevOps' 카테고리의 다른 글

Nginx는 왜 등장했을까? Apache 구조의 한계와 이벤트 기반 웹 서버 이해하기  (0) 2026.06.26
'Back-end/DevOps' 카테고리의 다른 글
  • Nginx는 왜 등장했을까? Apache 구조의 한계와 이벤트 기반 웹 서버 이해하기
dev_Hyeonjoon
dev_Hyeonjoon
스프링이랑 자바 공부 중 입니다!!
  • dev_Hyeonjoon
    Hyeonjoon's code
    dev_Hyeonjoon
  • 전체
    오늘
    어제
    • 분류 전체보기 (61) N
      • CS (6)
        • Architecture (4)
        • Algorithm (2)
      • Front-end (10)
        • JavaScript (0)
        • React-project (5)
        • Vanilla[JS]-project (5)
        • study (0)
      • Tools (1)
        • GitHub (1)
        • AI (0)
      • Back-end (35) N
        • Java (27)
        • Architecture (2) N
        • JPA (0)
        • Trouble Shooting (1)
        • Spring (2)
        • DevOps (2)
      • Trouble Shooting (2)
        • Python (1)
      • 자격증 (1)
      • 알고리즘 (0)
      • 회고 (6)
        • 기타 (6)
        • 독서록 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    바닐라js
    형변환
    군대에서코딩
    파이썬
    객체지향
    리액트
    Til
    아키텍처
    vanillajs
    Spring
    백엔드
    자바기초
    토이프로젝트
    OOP
    backend
    사지방코딩
    자바
    코딩
    자바공부
    Java
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
dev_Hyeonjoon
[Docker] Docker 입문: 이미지, 컨테이너, Registry, Docker Engine 정리
상단으로

티스토리툴바