프로그래밍/도커

도커] 외부에서 도커 컨테이너의 웹페이지에 접근하는 방법.

Hwan2 2020. 5. 16. 22:23
반응형

1. 들어가기


한가지 가정을 해 봅시다.


어떤 언어가 되었건 도커를 사용해 웹서버를 만들었습니다.


그럼 단순히 ip주소와 port번호를 입력한다고 해당 웹 페이지에 접속할 수 있을까요??


결론은 설정을 단 하나도 안해놨다면 불가능 합니다.


그럼 지금부터 접속하는 방법에 대해, 원리를 설명하면서 예기해 보겠습니다.






2. 필요한 설정.


  • 도커의 --cap-add=NET_ADMIN를 이용한 컨테이너 네트워크 인터페이스 설정.
  • 컨테이너를 만들 때 도커 포트와 실제 OS의 포트를 동기화.
  • 컨테이너에 올라와있는 서버 포트 개방.

이정도가 되겠습니다.





3. 포트 동기화


포트 동기화를 하는 이유 설명.


가정.

1. 현재 도커에는 우분투 이미지가 올라가 있고 우분투 위에 파이썬으로 만든 웹페이지가 있다고 가정합니다.

2. 웹페이지 포트설정은 10022로 되어있습니다.

3. 클라이언트가 서버주소와 포트번호로 웹페이지에 접근을 시도하고 있습니다.






다음 사진은 클라이언트 요청 메시지가 서버로 도착한 순간입니다.





서로 포트만 열려있고 연결되어 있지는 않습니다.


따라서 요청 메시지는 도커에 가기전에 도커를 실행시키고 있는 서버OS에서 막히게 됩니다.


이걸 해주기위해 컨테이너를 만들 때 -p 10022:10022 를 해줘야 합니다.



위 명령을 실행한 후 컨테이너를 실행시키게 되면 다음과 같은 모습이 됩니다.



연결됐죠??(도킹 성공....)






4. 리눅스에서 포트 개방하기


도커에서 포트만 동기화 해줬다고 해서 다된건 아닙니다. 


포트는 동기화 되어있지만 실제 리눅스에선 막혀있을 수도 있거든요.


때문에 iptables를 통해 해당 포트를 열어줍시다.


포트를 열어주는 명령어는 다음과 같습니다.


$ iptables -I INPUT -p tcp --dport 10022 -j ACCEPT


iptabes가 설치 안되시면 다음과 같이 실행해주시기 바랍니다.


$ apt_get update

$ apt_get install iptables-persistent





하지만 다음과 같은 에러메시지를 띄웁니다.

"getsockopt failed strangely: Operation not permitted"


열 수 있는 권한이 없답니다.


이때 필요한 명령어가 바로

--cap-add=NET_ADMIN

입니다.





5. --cap-add=NET_ADMIN???


도커에서 도는 컨테이너는 결국 프로세스입니다.

즉, 환경이 다른 운영체제를 사용하고 있는 것 같지만 실상 프로세스란 소리입니다.


해당 컨테이너에 있는 운영체제(프로세스)는 도커에 의해 실행되고 접근이 됩니다.

원격접속?? 비슷한 개념이죠.


리눅스에서 포트를 개방하는 것은 굉장히 민감한 부분이기 때문에 리눅스의 네트워크 스텍에 접근이

가능하도록 도커에서 권한을 부여해야 합니다.


이때 쓰이는 권한이 바로 위 명령어 입니다.





6. 설정을 하고 접근해보자!!


우선 저희는 해당 이미지에서 새로운 컨테이너를 만들어야 합니다.




저는 빨간색 밑줄 친 ubuntu 이미지로 해보겠습니다.





_> docker run --cap-add=NET_ADMIN -it --name port_open_server -p 10022:10022 ubuntu



run : 컨테이너를 만드는 명령어 입니다.


--cap-add=NET_ADMIN : 해당 컨테이너에 네트워크 스텍 접근권한을 부여하는 것입니다.


-it : 터미널 입력 모드


--name : 해당 컨테이너의 이름을 지정해 주는 것입니다.


-p : 현재 OS 포트와 도커 컨테이너의 포트를 동기화 시켜줍니다.


ubuntu : 컨테이너를 만들 이미지파일 이름입니다.





이제 포트를 개방하고 웹페이지 실행을 해보겠습니다.


포트 개방




웹 페이지 실행




접속 성공!!





끝.!!


반응형