본문 바로가기

보안 이론/클라우드 보안

Docker - Volume, Network

반응형

도커의 기능 중 볼륨과 네트워크에 대하여 알아본다.


도커 볼륨(Volume)

도커 컨테이너 내부의 저장소를 외부에서 관리할 수 있는 기능

도커 컨테이너가 삭제되면 저장소 역시 삭제되기 때문에 볼륨을 이용하여 데이터를 유지할 수 있다.

하나의 볼륨을 여러 컨테이너에 연결하여 사용할 수 있다.

하나의 컨테이너에 여러 개의 볼륨을 연결하여 사용할 수 있다.

여러 컨테이너들의 데이터를 중앙에서 쉽게 관리할 수 있다.

 

내부에서 수정된 내용은 외부에 반영되며 반대로 외부에서 수정해도 내부에 반영된다.

 

Host Bind Mount

도커의 관리없이 호스트 디렉토리에 직접 연결하는 방법

원하는 호스트 위치에 컨테이너의 데이터를 자유롭게 마운트가 가능하다.

컨테이너가 직접 호스트 디렉토리를 조작하기 때문에 보안적으로 권장하지 않는 방법이다.

 

웹 서버의 로그 디렉토리를 바인딩하여 호스트의 디렉토리에서 살펴본다.

# 로그를 저장할 호스트 폴더 생성
mkdir ~/vol

# 볼륨을 연결하여 도커 컨테이너 실행
# -v [호스트 디렉토리 위치]:[컨테이너 디렉토리 위치] : 두 위치를 바인딩하는 옵션
sudo docker run -idt -p 8888:80 -v ~/vol:/var/log/nginx --name=volweb1 nginx

# 바인딩한 폴더 확인
ls ~/vol

# 컨테이너의 상세정보에서 Mounts 정보 확인
sudo docker inspect volweb1

명령어를 실행하고 나면 아래와 같이 로그 폴더의 파일들이 들어와 있는 것을 확인할 수 있다.

inspect 명령어 시 Mounts의 내용

잘 동작하는지 nginx 웹 서버에 직접 접근하여 로그를 확인한다.

tail -f access.log

바인딩된 폴더에 있는 access.log에 로그 정보를 즉시 반영되어 확인할 수 있다.

 

docker volume을 연결

도커의 volume 기능을 이용하여 관리하는 방법 ( /var/lib/docker/volumes에 저장 )

도커에서 여러 가지 기능을 제공하여 관리가 용이하고 호스트에 보안적인 영향을 주지 않는 가장 좋은 방법이다.

 

Volume 생성

# 볼륨 생성
sudo docker volume create --name log_vol

# 전체 볼륨 목록 확인
sudo docker volume ls

# 볼륨 상세 정보 확인
sudo docker volume inspect log_vol

이번에는 두 개의 볼륨을 연결해보기위해 볼륨을 하나 더 생성한다.

sudo docker volume create --name html_vol
sudo docker volume ls

Volume 연결

-v 옵션을 여러 번 사용하여 볼륨을 여러개 연결할 수 있다.

sudo docker run -idt -p 8889:80 \
-v log_vol:/var/log/nginx \
-v html_vol:/usr/share/nginx/html --name=volweb2 nginx

# 컨테이너의 상세정보에서 Mounts 정보 확인
sudo docker inspect -f "{{json .Mounts}}" volweb2

볼륨의 내용은 /var/lib/docker/volumes/log_vol/_data/var/lib/docker/volumes/html_vol/_data에 저장되어 있다.

내용을 보기 위해서는 관리자 권한이 필요하다.

sudo su

ls /var/lib/docker/volumes/log_vol/_data
ls /var/lib/docker/volumes/html_vol/_data

 

html_vol안에 index.html을 수정하고 서버에 접속했을 때 페이지가 변하는지 확인해본다.

cd /var/lib/docker/volumes/html_vol/_data
echo '<h1>Change Page!</h1>' > index.html

(좌)변경 전 / (우)변경 후

 

Volume 삭제

볼륨은 컨테이너를 삭제해도 지워지지 않기 때문에 따로 삭제를 진행해야 한다.

# 볼륨 하나씩 삭제
sudo docker volume rm [볼륨이름]

# 사용하지 않는 볼륨 전체 삭제
sudo docker volume prune

 


 

도커 네트워크(Network)

각 도커 컨테이너들은 격리된 환경이기 때문에 다른 컨테이너와 통신하기 위해 네트워크가 필요하다.

도커의 네트워크는 호스트의 물리 NIC를 이용해 가상 브릿지 네트워크를 생성하여 연결된다.

컨테이너들은 리눅스 네임스페이스 기술을 이용해 각자 독립된 network 공간을 할당받는다.

 

도커의 기본 네트워크들을 확인해보자.

sudo docker network ls

도커의 기본 네트워크는 bridge이다. 

도커 컨테이너 생성 시 네트워크를 따로 설정하지 않으면 기본값으로 적용되며 아래 docker0의 아이피 대역을 갖게 된다.

더 세밀한 설정을 위해 도커 네트워크의 종류를 알아보고 사용해볼 것이다.

 

Bridge

독립적인 네트워크 서브넷을 생성한다.

컨테이너가 생성되면 브리지 네트워크에 컨테이너 인터페이스가 하나씩 바인딩된다.

Docker에서는 NAPT 기능을 사용하여 연결한다

NAPT(Network Address Port Translation)
프라이빗 IP 주소와 함께 포트 번호도 같이 변환하는 기술이다.
프라이빗 IP 주소를 퍼블릭 IP 주소로 변환할 때 프라이빗 IP 주소별로 서로 다른 포트 번호로 변환한다.

 

NAPT / https://imjeongwoo.tistory.com/107

 

 

네트워크 생성

브리지 네트워크 생성 시에는 서브넷과 게이트웨이 주소를 지정해 줄 수 있다.

sudo docker network create --driver bridge \
--subnet 172.20.1.0/24 \
--gateway 172.20.1.1 mynet

네트워크를 생성하면 ifconfig 명령어 시 생성된 네트워크를 확인할 수 있다.

 

컨테이너 연결

컨테이너를 네트워크에 연결하여 생성 후 네트워크 정보를 확인해본다.

# 컨테이너 실행 시 네트워크 연결
sudo docker run -idt -p 8000:80 --net mynet --name netapp1 nginx

# 네트워크 상세정보 확인
sudo docker inspect mynet

# 컨테이너 상세정보 확인
sudo docker inspect netapp1

네트워크 mynet의 상세정보
컨테이너 netapp1의 상세정보

 

Host

독립적인 네트워크를 갖지 않고 호스트의 네트워크 인터페이스를 함께 사용한다.

기본적으로 네트워크가 만들어져 있으므로 따로 생성해줄 필요는 없다.

sudo docker run -idt --net host --name netapp2 nginx

sudo docker inspect netapp2

컨테이너 netapp2의 상세 정보

상세정보를 확인하면 네트워크 정보에 대한 내용은 적혀있지 않다.

그러나 호스트의 네트워크를 사용하기 때문에 호스트 아이피:80로 접속하면 nginx 웹이 뜨는 것을 확인할 수 있다.

 

Container

설정한 컨테이너와 동일한 네트워크 인터페이스를 사용한다.

위에서 생성한 네트워크에 바인딩된 netapp1의 network를 공유해본다.

( nginx로 같은 네트워크에 생성 시 오류가 나서 ubuntu로 생성하였다. )

sudo docker run -idt --net container:netapp1 --name netapp3 ubuntu

# 컨테이너의 네트워크 확인
sudo docker exec ip addr show

netapp3의 ip addr 정보

netapp1의 아이피와 동일하게 나오는 것을 볼 수 있다.

그러나 네트워크, 컨테이너 inspect에서의 상세정보에서는 표시되지 않는다.

mynet의 inspect 결과
netapp3의 insepect 결과

None

격리된 네트워크 영역을 가지나 네트워크 인터페이스가 없는 상태로 생성한다.

sudo docker run -idt --net none --name netapp4 nginx

netapp4의 inspect 결과

외부와의 연결을 되지 않고 내부 루프백(127.0.0.1)만 가능하다.

 

 

네트워크 변경

도커 컨테이너는 네트워크를 유동적으로 설정할 수 있다.

# none -> mynet으로 네트워크 변경
sudo docker network disconnect none netapp4
sudo docker network connect mynet netapp4

# 변경 후 상세정보 확인
sudo docker inspect netapp4
sudo docker inspect mynet

컨테이너 netapp4의 네트워크 정보
네트워크 mynet의 연결된 컨테이너 정보

 

네트워크 삭제

네트워크를 지우기 위해서는 해당 네트워크를 사용하는 컨테이너가 하나도 없어야 한다.

# 네트워크 삭제
sudo docker network rm [네트워크 id]

# 사용하지않는 네트워크 삭제
sudo docker network prune

 


 

도커 볼륨에는 bind 방법Docker voulme을 이용한 방법이 있다.

볼륨을 이용하면 컨테이너를 삭제해도 데이터를 보존할 수 있으며 호스트에서 관리할 수 있다.

 

도커 네트워크는 독립된 네트워크 환경의 컨테이너들을 연결할 수 있다.

네트워크 방식에는 bridge, host, container, none 방식이 있다.

반응형


Calendar
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Visits
Today
Yesterday