일단은 프로그래머 나부랭이

Docker container를 외부에서 직접 접근해보자 본문

Linux

Docker container를 외부에서 직접 접근해보자

하필이면 도대체가 2021. 5. 15. 22:05

Docker container를 사용하다 보면 가끔 불편할 때가 있습니다.
제 경우, 가끔씩 container를 하나의 테스트 장비처럼 이용할 때가 있습니다.
물론 docker host장비에서 개발 및 테스트를 병행하면 크게 문제는 없겠습니다만, 가끔은 docker host가 아닌 다른 장비에서 container에 접근해야 할 경우가 있습니다.
그때마다 하던 고민은 '외부 장비에서 container에 접속할 때, port forwarding을 하지 않고 직접 접근할 방법은 없을까?'에 대한 고민이었습니다.

그리고 열심히 구글링을 하던 결과 (어쩌면 당연하게도) docker docs에서 방법을 찾았습니다.
바로 ipvlan을 이용하는 것입니다.

(참고 : https://docs.docker.com/network/ipvlan/)
ipvlan이란? 
검증된 네트워크 가상화 기술로, 컨테이너는 기존의 Linux bridge를 사용한 격리 대신 Linux ethernet interface 또는 하위 interface와 연결되고, 물리적 네트워크를 분리하기 때문에 가볍다.
ipvlan 사용을 위해서는 docker host의 Linux 커널 버전은 4.2 이상이어야 한다.
(docker docs가 제공한 설명을 의역함)
(번역이 허접해서) 말로는 이해가 어려우니 아래의 예시를 봅시다.

 

출처 : https://docs.docker.com/network/ipvlan/

요컨대 container가 docker host와 같은 대역의 ip주소를 갖게 된다는 의미로 풀이됩니다.
그래서 한번 해봤습니다.

우선 docker network를 추가합니다.

docker network  create -d ipvlan \
--subnet=192.168.0.0/24 --gateway=192.168.0.1 \
-o parent=[ex : eth0 / docker host의 ethernet device name] (mode 옵션 생략시 l2모드로 생성됨) \
ipvlan_test

그리고 새로 생성한 ipvlan_test network에 속하는 container 생성
(이후 container에 접속하여 openssh-server만 설치했습니다. 이유는 ssh 접속 가능한지 확인하기 위해)

docker run -dit --privileged --name centos_7 --net=ipvlan_test --ip 192.168.0.201 centos:7 /sbin/init

 

우선, 공유기의 ip list에서 container가 나타나는지 확인해 봤습니다.

192.168.0.201은 제가 container에 할당한 ip입니다.
다행히도 ip 주소가 잘 할당된 모양입니다.
그런데 container와 mac 주소가 동일한 장치가 2개나 더 보입니다.

이는 제가 container를 생성한 환경과 관련이 있습니다.
현재 centos_7이라는 container의 Docker host는 Ubuntu VM입니다.
그리고 이 Ubuntu VM은 Windows Tablet PC에 생성되어 있습니다.
현재의 네트워크 상황을 정리하자면 아래와 같습니다.

현재 네트워크 환경, 덧붙혀서 빨간선은 하고자 하는 것

하나의 공유기 안에서 위와 같은 형태의 network를 구성중입니다.
그리고 그림과 같이 ssh 접속을 시도하여 docker host가 아닌 외부장치에서 container로 ssh 접속을 시도하여, 외부 장치가 container에 직접 접근이 가능한지 검증해볼 생각입니다.

container id와 ssh로 접속한 container의 hostname이 같다. 즉, 성공이다.

성공했습니다.
ipvaln network를 이용하면 외부 장비에서도 container에 직접 접근이 가능합니다


ipvlan과 macvlan의 차이
macvlan network 이용해도 ipvlan과 유사하게 동작합니다.
차이점은 다음과 같습니다.
 - macvlan의 경우 docker host와 container의 mac주소가 서로 다르다.
   이 때문에 docker host 장비에서 'promiscuous mode'를 할 수 있어야 한다.
 - macvlan의 경우 docker host의 kernal 버전이 낮더라도 사용이 가능하다.

그래서 centos 7 VM(kernal 3.x)에서 macvlan으로 container를 생성해본 결과, ipvlan과 마찬가지로 외부에서 container로 직접 접근은 가능했습니다.
(다만 container에서 yum package 설치가 불가능했는데, 'promiscuous mode'와 관련이 있지 않을까 싶습니다.)

'Linux' 카테고리의 다른 글

(Ubuntu) CLI 또는 GUI 부팅 모드 전환  (0) 2021.05.03
Centos 7 NFS 설정 방법  (0) 2020.11.16
docker로 jenkins 시작하기  (1) 2020.11.09
core dump 분석시 참고할 만한 글  (0) 2020.09.23
centos 7에 onedrive 연결하기  (2) 2020.04.27

Comments