DevOps

Docker의 Volume과 Network를 알아보자

stars_one 2025. 2. 11. 05:02

 

1. Volume과 Network를 알고 싶다

 

프로젝트를 진행할 때 마다 

docker-compose를 사용하여 프로젝트 초기 세팅을 진행한다.

docker-compose는 극강의 편리함을 제공해주기 때문에

쓰지 않을 수가 없는데, 사용하다 보면 volume, network 옵션을 확인할 수 있다.

 

매번 프로젝트를 진행했지만, volume은 컨테이너가 사용하는 데이터 공간,

network는 컨테이너간 소통하기 위한 것 정도만 알았다.

 

이번 기회에 알아보도록 하자

 


 

 2. Volume

volume왜 존재하는가? - 데이터를 보관하기 위해서

(보통 /var/lib/docker/volumes/ 위치에 볼륨 폴더가 생성된다)

 

그렇다면 뭐가 좋아서 사용하는 거야?

아래와 같은 여러가지 이유 때문이다

 

더보기

- 컨테이너는 사용하고 사라지는데, 볼륨을 사용하면 컨테이너가 사라져도

데이터는 그대로 남아 있다(데이터 영속성)

 

- 볼륨이 존재하면 여러 컨테이너가 같은 데이터를 공유할 수 있다.

굳이 데이터를 복사해서 사용할 필요가 없다는 것!

 

- 볼륨은 데이터를 백업하거나 다른 컴퓨터로 옮기기도 편하고,

많은 양의 데이터를 다룰 때 볼륨을 쓰면 데이터를 더 빠르게 처리할 수 있게 해준다

 

- 볼륨을 사용하면 중요한 데이터를 컨테이너 밖에 안전하게 보관 가능하다

 

- 볼륨을 사용하면 코드가 변경되어도 데이터는 그대로 유지되기 때문에 

개발이나 운영할 때 편리하다.

 

이렇게 볼륨을 쓰면 데이터를 더 잘 다루고, 여러 컨테이너에서 공유하거나, 데이터를 안전하게 관리하는데 도움이 된다는 것!

 

아래 사진은 container의 데이터 보관방식을 알려준다.

bind mount, volume, tmpfs mount 로 3가지 방식이 존재한다 

(Docker 공식 사이트는 volume을 가장 추천한다고 한다)

bind mount, volume, tmpfs mount

 

 


 

3. bind mount

바인드 마운트는 뭣이여?

바인드 마운트는 컴퓨터의 특정 폴더나 파일을

Docker 컨테이너 안에서 직접 쓸 수 있게 해주는 것.

볼륨보다 기능이 좀 덜하지만, 특정 상황에서 유용하다.

 

바인드 마운트는 컴퓨터 안의 정확한 위치(절대 경로)에 있는 파일이나 폴더를 사용하는데

그래서 컨테이너가 어디에 있든, 그 파일이나 폴더를 똑같이 쓸 수 있다.

컴퓨터에서 어떤 폴더나 파일을 골라서 도커 컨테이너에 붙여넣는 것과 비슷하다.

 

바인드 마운트를 사용하면 컨테이너에서 컴퓨터의 특정 파일이나 폴더를 쉽게 접근하고 사용할 수 있다.

이런 방식은 특정 개발 작업이나 데이터를 다룰 때 도움이 될 수 있다.

 


4. tmpfs mount

tmpfs 마운트는 뭔가요?

tmpfs 마운트는 컴퓨터 메모리를 사용해서 일시적인 데이터를 저장하는 방법이다.

이 방법은 컨테이너 안에서 잠깐 필요한 데이터를 다룰 때 유용하다.

 

보통 컨테이너가 임시 데이터를 만들 때,

이걸 영구적으로 저장하지 않고 메모리에만 잠시 두고 싶을 때 사용한다.

 

tmpfs 마운트는 컴퓨터의 일반 파일 시스템 대신 메모리를 사용해서 데이터를 저장하는데,

메모리를 사용하므로 데이터를 빠르게 읽고 쓸 수 있어서 컨테이너의 성능이 좋아진다

 

하지만, 이 방식으로 저장된 데이터는 해당 컨테이너에서만 사용할 수 있고, 다른 컨테이너와 공유는 안 된다는 것!

 

tmpfs 마운트는 컨테이너가 잠깐 필요한 데이터를 메모리에 저장하고 싶을 때 사용하면 좋다.

이렇게 하면 데이터를 빠르게 처리할 수 있고, 컨테이너가 끝나면 자동으로 데이터도 사라져서 편리하다는 장점이 있다.

 


 

5. Docker Network

도커 네트워크는 도커 컨테이너끼리 서로 통신할 수 있게 도와주는 네트워크이다.

이걸 쓰면 컨테이너들이 서로 통신하는 걸 더 쉽게 할 수 있고, 보안도 더 강하게 만들 수 있다.

 

실제 비즈니스 애플리케이션을 컨테이너화할 때, 여러 개의 컨테이너가 서로 협력해야 목표를 달성할 수 있다.

그래서 각각의 컨테이너가 서로 소통할 수 있는 방법이 필요한데,,,

이를 위해 컨테이너들 사이에서 데이터 패킷을 주고받을 수 있는 경로, 즉 네트워크를 설정해야 한다.

 

도커에서는 이런 네트워크를 쉽고 효율적으로 구축할 수 있도록 도와주는 간단한 네트워크 모델을 만들었다.

이 모델을 컨테이너 네트워크 모델(CNM)이라고 부른다.

이 모델은 컨테이너 네트워크를 구현할 때 필요한 기본 요건들을 정해준다.

 

Docker Container Network Model

 

스토리로 바라보는 도커 네트워크

  • 샌드박스: 샌드박스는 컨테이너를 외부 세계로부터 완전히 분리해서 바깥에서 들어오는 네트워크 연결은 이 샌드박스 안의 컨테이너로는 들어올 수 없다. 그런데 컨테이너가 완전히 소통 불가능하면 큰 쓸모가 없자나? 그래서 여기에 엔드포인트가 필요한 것이여.
  • 엔드포인트: 엔드포인트는 외부 세계와 샌드박스(컨테이너가 아닌) 사이의 연결점이다. 이게 컨테이너를 안전하게 지켜주고, 엔드포인트는 샌드박스를 다음 요소인 네트워크에 연결한다.
  • 네트워크: 네트워크는 엔드포인트에서 다른 엔드포인트로, 결국은 컨테이너에서 다른 컨테이너로 데이터를 보내는 길이라는 것이지
  • 하나의 네트워크 샌드박스 안에는 여러 개의 엔드포인트가 있을 수 있다. 즉, 하나의 샌드박스 안에 있는 컨테이너는 네트워크에 전혀 연결되지 않거나, 여러 네트워크에 동시에 연결될 수 있다. 예를들어, 세 개의 샌드박스 중 하나는 엔드포인트를 통해 두 개의 네트워크에 동시에 연결된 상태일 수 있다라는 것.
  • 이 네트워크 모델은 꽤 범용적이어서. 개별 컨테이너가 네트워크 안, 어디에서 작동하는지는 정하지 않고 모든 컨테이너가 한 호스트에서 실행될 수도 있고(로컬), 여러 호스트에 걸쳐 있을 수도 있다(글로벌).
  • 물론 CNM은 그냥 네트워크가 어떻게 작동하는지 설명하는 모델일 뿐이고 실제로 네트워크를 사용하려면 CNM을 구현해야 한다. 로컬이든 글로벌이든, CNM을 구현하는 여러 방법이 있다.

 

우리에게 웹 API, 제품 카탈로그, 데이터베이스 세 개의 서비스로 이루어진 애플리케이션이 있다고 가정하자.

이때 우리는 웹 API가 제품 카탈로그와는 통신할 수 있지만, 데이터베이스와는 통신하지 못하게 하고 싶다면?

 

반면, 제품 카탈로그는 데이터베이스와도 통신할 수 있으면 좋다.

이걸 해결하는 방법 중 하나는 웹 API와 데이터베이스를 서로 다른 네트워크에 두고,

제품 카탈로그는 두 네트워크에 모두 연결하면? 원하는 대로 통신 구조를 설정할 수 있다.

 

여러 네트워크에 연결된 컨테이너

 

각 네트워크는 외부에서 오는 권한 없는 접근으로부터 리소스를 보호해서 더 많은 보안을 제공하는데,

그래서 애플리케이션을 만들고 운영할 때 여러 네트워크를 사용하는 게 좋다.

그리고 서로 꼭 통신해야 하는 서비스들만 같은 네트워크에 두자.

 

방금 본 예제에서는 웹 API가 데이터베이스와 직접 통신할 필요가 없으니까,

이 둘을 다른 네트워크에 두었다. 이렇게 하면 만약 해커가 웹 API를 해킹해도,

제품 카탈로그 서비스를 먼저 해킹하지 않고서는 데이터베이스에 접근하기 어렵다.

 

마지막으로, 도커 네트워크의 종류에 대해서 알아보자,

  1. 브리지 네트워크: Docker 쓸 때 가장 많이 보게 되는 기본 네트워크. 한 컴퓨터 안에서 여러 Docker 컨테이너가 서로 통신할 수 있게 해준다. 컨테이너를 이 네트워크에 붙이면, Docker가 알아서 IP 주소를 준다. 호스트 밖의 다른 네트워크랑은 일단 따로 동작하는데 포트 매핑이라는 걸 사용하면, 바깥에서도 컨테이너에 접근할 수 있게 할 수 있다.
  2. 공용 네트워크: 사실 Docker에서 '공용 네트워크'라는 말은 흔히 안 쓰이는데, 보통 외부에서 접근할 수 있게 하려면, 브리지 네트워크에 포트를 열어주거나, 아니면 '호스트 네트워크'라고 해서 컨테이너가 직접 우리 컴퓨터의 네트워크를 쓰게 하는 방법이 있다.
  3. 사설 네트워크: 특별한 컨테이너끼리만 통신할 수 있는 네트워크. Docker에서는 사용자가 직접 네트워크를 만들고, 그 안에 원하는 컨테이너만 연결할 수 있다. 이렇게 하면 다른 컨테이너나 외부 네트워크와는 격리되어서, 더 안전하게 정보를 주고받을 수 있다.

'DevOps' 카테고리의 다른 글

CI/CD는 뭘까, 도대체 왜 사용하는걸까? (Github Actions)  (0) 2025.02.11