2015.03.10 16:23

아쉽지만 docker는 실행중인 컨테이너에 실시간으로 포트를 오픈하는 기능을 제공하지는 않는다. 


아래와 같은 방법들로 다시 시작해야 한다.


1. 컨테이너의 변경 사항이 없다면.. stop 후 docker run에 -p 옵션을 추가하여 실행하면 될 것이다.


2. 컨테이너의 변경 사항이 있다면 docker commit를 사용해서 변경된 내용이 적용된 컨테이너를 만들어서 -p 옵션으로 재실행한다. 


docker stop running_container

docker commit running_container new_container

docker run -p newport:newport new_container


저작자 표시 비영리 동일 조건 변경 허락
신고
2015.03.10 12:00

docker는 컨테이너를 실행하면서 컨테이너의 가상 디바이스에 RFC 1918 에 기술된 내용에 따라 private 영역의, 임의의 IP를 할당한다.


masquerading rule (표현이 재밌네 ^^)에 따라 할당한다고 하는데 상세한 건 "이 문서" 를 참고 바람.


어쨌든 중요한 건 ,host server에서 임의로 설정하기 때문에 이렇게 주어진 IP는 외부에서 알 수 없다.


container에 포함된 각종 어플리케이션에서는, 자신의 IP를 얻어와서 외부의 container 혹은 솔루션에 알려주어도 외부에서는 해당 컨테이너로 접근할 수 없다.


외부에서 container 자신에게 접속하게 하려면 (routable ip address를 사용하는) host 서버의 IP주소와 docker run 시 -p 옵션을 통해 호스트와 자신이 오픈하려는 포트를 매핑할 때 기술했던 호스트 서버의 Port를 전달해야만 한다. 하지만 host 서버의 IP 주소를 알아오는 방법은 수동으로 전달하지 않는 한, 존재하지 않는다.


이런 문제점을 해결하기 위해서는 routable ip address 할당이 필요하다.



일단 container에 할당된 IP를 알아보자. 


host 서버에서는 inspect 로 확인 가능하다.

docker inspect [container name] | grep IPAddress


(IP값만 딱!! 뽑아보기)

docker inspect [container name] | grep IPAddress | awk '{print $2}' | tr -d '",n'


혹은 exec를 사용해 운영중인 컨테이너로 접속해서 확인도 가능하다. 

docker exec -it [container name] bash

ifconfig


가장 간단한 방법은 docker run 시 --net=host라고 지정하는 것이다. 이 옵션을 사용하면 실행될 컨테이너의 eth0 interface에는 host의 eth0가 매핑된다. 간단한 서비스의 경우 큰 문제는 없지만, 같은 IP가 두개인 서버가 생기는 것과 유사한 문제가 발생할 수 있으니 주의가 필요하다. 물론 상황에 따라 유용할 수 있으니 알아두자.

(* 이곳 에서 --net=host로 검색하면 쉽게 내용을 찾아 볼 수 있다.)


두번째로는 dhcp 서버를 세팅하여 사용하는 방법이다. 이 글을 처음 쓸 때 이 부분을 정리하기 위해 작성을 시작했으나 회사 사정으로 dhcp 서버를 구성하려면 별도 스위치 장비를 활용해 기존 네트웍에서 분리를 해야 한다는 답변을 들었다. (c class 부족으로 늘리려면 회사 전체적으로 네트웍 설정을 바꿔야 한다고 한다. OTL ~~)


그래서 가장 잘 설명된 사이트 링크로 대체한다. "이곳"과 "저곳" 을 참고하실.. 나도 나중에 참고해서 다시 이 부분을 갱신해야 겠다. 


또다른 방법으로는 "pipework" 를 사용한 방법이 있다. 


글이 어째 용두사미가 되버렸네. dhcp 서버 딱 막히는 순간부터 맥 빠져버렸네. ㅠ_ㅜ






저작자 표시 비영리 동일 조건 변경 허락
신고


티스토리 툴바