[Docker] Docker 기본 개념

Docker를 왜 배우는 걸까?

 
현업에서는 Docker를 많이 사용하고 있다. 이 Docker라는 건 왜 많이 사용되는 걸까? Docker를 쓰는 가장 큰 이유는 이식성 때문이다. 이식성이란 특정 프로그램을 다른 곳으로 쉽게 옮겨서 설치 및 실행할 수 있는 특성을 말한다.
 

개발을 하다 보면 팀원 간에 서로 동일한 개발 환경을 맞추는 일이 자주 생긴다. 예를 들어, Docker가 없이 Python으로 머신러닝 모델을 개발하고자 한다면 아래와 같은 과정을 거쳐야 A와 B가 같은 환경에서 프로젝트를 진행할 수 있다.
 

  1. 동일 버전의 Python을 설치하고,
  2. 해당 Python 버전에 대한 venv 가상 환경을 만들어야 하며,
  3. requirements.txt 파일을 만들어 의존성을 공유하고,
  4. pip install -r requirements.txt로 패키지를 설치해야 한다.

 

하지만 이 과정에서도 운영체제나 패키지 간 버전 충돌 등으로 인해 예상치 못한 오류가 발생할 수 있다. 반면 Docker를 사용하면, A 개발자가 애플리케이션이 실행되는 환경 전체(Python 버전, 패키지, OS 등)를 컨테이너로 이미지화할 수 있다. B는 docker run이라는 한 줄로 완전히 동일한 환경에서 프로그램을 실행할 수 있다!
 

따라서 Docker는 아래와 같은 장점들을 가진다고 볼 수 있다.

  • 매번 귀찮은 설치 과정을 일일이 거치지 않아도 된다.
  • 항상 일관되게 프로그램을 설치할 수 있다.(버전, 환경 설정, 옵션, 운영체제 등)
  • 각 프로그램이 독립적인 환경에서 실행되기 때문에 프로그램 간에 서로 충돌이 일어나지 않는다.

 

 

IP와 Port의 개념

 
IP는 네트워크 상에서 특정 컴퓨터를 가리키는 주소를 말한다. 13.250.15.132 같은 값들이 IP 주소가 된다.
 

Port는 한 컴퓨터 내에서 실행되고 있는 특정 프로그램의 주소를 의미한다. 13.250.15.132:3000 같은 값에서 :3000 부분이 포트 번호가 된다.
 

도메인 주소를 누른 후 엔터를 누르면 브라우저(크롬, 익스플로러 등)는 기본으로 80번 포트로 통신을 보내기 때문에 포트 번호를 입력하지 않아도 된다. 80번 포트를 이용하지 않으려면 naver.com:3000처럼 명시해 주어야 한다.
 

포트 번호는 0 ~ 65,535번까지 사용할 수 있다. 그 중에서 0 ~ 1023번까지의 포트 번호는 주요 통신을 위한 규약에 따라 이미 정해져 있다. 이렇게 규약을 통해 역할이 정해져 있는 포트 번호를 잘 알려진 포트(well-known port)라고 부른다.

  • 22번 (SSH, Secure Shell Protocol) : 원격 접속을 위한 포트 번호(EC2 인스턴스 연결 등)
  • 80번 (HTTP) : HTTP로 통신을 할 때 사용
  • 443번 (HTTPS) : HTTPS로 통신을 할 때 사용

 

 

Docker, Container, Image

 
Docker는 컨테이너를 사용하여 각각의 프로그램을 분리된 환경에서 실행 및 관리할 수 있는 툴이다. 중요한 키워드는 컨테이너와 분리된 환경에서 실행할 수 있다는 점이다. Docker는 컨테이너를 실행하는 도구(Container Runtime 중 하나)로, 컨테이너 이미지를 다운로드 받고, 이미지를 기반으로 컨테이너를 실행하며, 컨테이너의 상태를 관리하고 삭제하는 역할을 한다.
 

Container는 도커 Image의 현재 실행 중인 라이브 인스턴스를 말한다. 하나의 컴퓨터 환경 내에서 독립적인 컴퓨터 환경을 구성한 다음에 각 환경에 프로그램을 별도로 설치를 할 수 있게 만든 개념이다. 하나의 컴퓨터 내에서 여러 개의 미니 컴퓨터 환경을 구성할 수 있는 형태라고 보면 된다. 이 미니 컴퓨터를 Docker에서는 Container라고 부른다.

 

컨테이너와 컨테이너를 포함하고 있는 컴퓨터


 

여기서 '컨테이너'와 '컨테이너를 포함하고 있는 컴퓨터'를 구분하기 위해 컨테이너를 포함하고 있는 컴퓨터를 '호스트(host) 컴퓨터'라고 부른다.
 

컨테이너는 아래와 같은 독립성을 가진다.

  • 디스크(저장 공간) : 각 컨테이너마다 서로 각자의 저장 공간을 가지고 있다. 일반적으로 A 컨테이너 내부에서 B 컨테이너 내부에 있는 파일에 접근할 수 없다.
  • 네트워크(IP, Port) : 각 컨테이너마다 고유의 네트워크를 가지고 있다. 컨테이너는 각자의 IP 주소를 가지고 있다.
  • 프로세스 공간 : 컨테이너 내에서 실행되는 프로세스는 해당 컨테이너 내부에서만 보인다.

 

컨테이너는 가상 머신(VM)처럼 전체 운영체제를 복제하는 대신, 호스트 커널을 공유하면서 필요한 라이브러리, 설정, 실행 파일만 포함하므로 가볍고 빠르다. 즉, 하나의 컴퓨터에서 여러 개의 미니 컴퓨터(컨테이너)를 실행하는 것처럼 보이지만, 실제로는 운영체제 위에서 프로세스를 격리해서 실행하는 구조다!
 

Image는 컨테이너를 만들기 위한 정적인 템플릿이다. 이미지는 프로그램 실행에 필요한 코드, 라이브러리, 환경설정, 시스템 도구 등을 포함한 스냅샷이라고 볼 수 있다. 이미지는 읽기 전용이며, 이 이미지를 기반으로 실행한 것이 컨테이너가 된다. 컨테이너는 이미지 위에 읽기/쓰기 계층이 추가되어 실행된다.
 

'INFRA > Docker' 카테고리의 다른 글

[Docker] Docker Compose - 2  (2) 2025.06.17
[Docker] Docker Compose - 1  (4) 2025.06.16
[Docker] Dockerfile  (8) 2025.06.09
[Docker] Docker Volume(도커 볼륨)  (7) 2025.06.04
[Docker] 자주 쓰는 Docker CLI  (2) 2025.06.04