Docker

Docker란?

KimMinJun 2025. 7. 30. 13:38

Docker란?

컨테이너를 사용하여 각각의 프로그램을 분리된 환경에서 실행 및 관리할 수 있는 툴이다.

 

사실 아직 Docker의 이론만 공부하고, 사용해보기 전이라 크게 와닿지는 않는다.

Docker를 공부하는 '프론트엔드 개발'을 공부하는 사람으로써,

매번 사이드 프로젝트 할 때마다 같은 개발 환경을 설정하기 귀찮아서 찾아보다가 Docker를 공부하게 되었다.

앞으로도 '프론트엔드의 입장'에서 글을 정리해나갈 생각이다.

 

이론 공부하면서 Docker를 왜 배워야 하는지에 대한 궁금증 정리는 전 글에 정리해두었다.

2025.07.29 - [Docker] - <프론트가> Docker를 왜 배워야 할까.

 

<프론트가> Docker를 왜 배워야 할까.

Docker를 왜 배워야 할까결론부터 말하자면, 특정 프로그램을 다른 곳으로 쉽게 옮겨서 설치 및 실행할 수 있는 '이식성' 때문이다.이러한 이식성은 다음과 같은 상황에 장점이 보인다.환경 일관

jun-coding.tistory.com

 

컨테이너란?

컨테이너란 하나의 컴퓨터 환경 내에서 독립적인 컴퓨터 환경을 구성해서,

각 환경에 프로그램을 별도로 설치할 수 있게 만든 개념이다.

 

Windows 운영체제를 사용하면, 여러 사용자를 만들어서 사용할 수 있다.

각 사용자는 독립된 환경이기 때문에 필요한 프로그램을 각 사용자별로 설치해야 한다.

컨테이너도 이와 비슷한 개념이다.

 

하나의 컴퓨터 환경 내에서 여러 개의 '독립된 실행 환경'을 구성할 수 있는 형태이다.

이 '독립된 실행 환경'을 '컨테이너'라고 부른다.

그리고 이 컨테이너를 포함하고 있는 컴퓨터를 '호스트 컴퓨터'라고 부른다.

 

컨테이너의 독립성

위에서 컨테이너는 '독립된 실행 환경'이라고 했다.

구체적으로 어떤것이 독립된 환경일까?

 

먼저, 프로세스와 파일시스템이 독립적이다.

각 컨테이너는 자체 파일시스템, 네트워크, 런타임 환경을 가지고 돌아간다.

예를 들어, 한 컨테이너에서 `npm install`로 잘못된 패키지를 설치하거나 node_modules가 꼬여도,

옆에 있는 다른 컨테이너에는 전혀 영향이 없다.

또한, 파일시스템이 독립적이기 때문에 A컨테이너에서 B컨테이너에 있는 파일에 접근할 수 없다.

 

두 번째로, 의존성과 환경이 독립적이다.

컨테이너마다 Node.js, yarn, npm 등 설치 버전, 환경변수를 자유롭게 설정할 수 있다.

A컨테이너에 있는 프로젝트는 Node.js 20,

B컨테이너에 있는 프로젝트는 Node.js 16을 사용해도

서로 충돌 없이 각각 자기만의 환경을 쓴다.

 

세 번째로, 실행 중인 프로세스가 독립적이다.

컨테이너마다 독립된 PID 네임스페이스를 사용해서,

한 컨테이너에서 실행 중인 프로그램은

다른 컨테이너에 보이지 않고, 직접 접근하거나 통제할 수 없다.

 

마지막으로, 네트워크 영역이 독립적이다.

각 컨테이너마다 고유의 네트워크를 가지고 있다.

따라서 컨테이너는 각자의 IP 주소를 가지고 있다.

특히, 컨테이너마다 별도의 가상 네트워크를 구성할 수 있기 때문에,

특정 컨테이너끼리만 통신하게 제한하거나,

내부망/외부망을 세분화할 수도 있다.

 

도커 이미지란?

도커 이미지는 컨테이너라는 실행 환경을 만들기 위한 설계도나 템플릿 같은 존재이다.

 

예를 들어, React 프로젝트를 만들고,

자주쓰는 axios, Tanstack Query같은 라이브러리를 설치해서 이미지로 만들었다고 하자.

이 이미지를 Docker로 실행시키면 이 프로젝트가 컨테이너 환경에서 실행된다.

나중에 똑같이 세팅해야 할 때도, 복잡한 설치 과정을 거칠 필요 없이 실행할 수 있다.

 

즉, 이미지는 애플리케이션을 실행하는 데 필요한 코드,

라이브러리, 설정, 환경 등 프로그램을 실행하는 데 필요한 모든 것을 포함하고 있다.

 

도커 이미지의 특징

도커 이미지는 불변성, 재사용성 이란 특징을 가지고 있다.

 

도커 이미지는 한 번 만들어진 이미지는 변경되지 않고 그대로 유지된다.

만약 새로운 수정이 필요하면 새로운 이미지를 다시 만들어야 한다.

 

또한, 만들어둔 하나의 이미지로 여러 컨테이너를 실행할 수 있다.

따라서 개발 환경, 테스트, 배포 등에 일관성을 보장해준다.