Docker

05. [Docker] 도커 네트워크

drizzle0925 2022. 2. 17. 12:46
728x90

내 컴퓨터의 운영체제와 도커 컨테이너를 네트워크적으로 연결하는 방법을 소개합니다.

 

일단 docker가 없이 웹 서버를 사용하는 방법에 대해 알아보겠습니다.

웹서버를 사용하기 위해서는 2대의 컴퓨터가 필요합니다.

 

한대의 컴퓨터에는 웹 브라우저가 설치되어 있고, 또 한대의 컴퓨터에는 웹 서버가 설치되어 있습니다.

 

그다음에는 웹 페이지를 파일로 만들어서 저장장치의 특정 디렉터리에 위치시켜야 합니다.

지금부터 데이터가 저장된 공간을 파일 시스템이라고 부르겠습니다.

 

예를 들어서 파일 시스템 내부에 있는 usr/local/apache2/htdocs/라는 디렉터리에 index.html 파일을 위치시켰다고 가정해보겠습니다.

 

그리고 웹서버에게 누가 웹페이지를 요청하면 이 디렉터리에서 찾아야 돼!라고 설정을 해둡니다.

 

한편, 컴퓨터에는 65000개의 포트라는 개념이 있어서 컴퓨터에 설치되어 있는 여러 소프트웨어들을 네트워크 적으로 구분해줍니다.

저게 없다면 이 컴퓨터로 접속이 들어왔을 때 어떤 소프트웨어가 그 접속을 마중 나갈지 알 수가 없죠

 

자 우리의 웹 서버는 80 포트에서 접속을 대기하고 있도록 설정되어 있습니다.

 

우리가 지금 사용하는 아파치 웹 서버가 그렇게 설정되어 있습니다.

그리고 웹서버가 설치된 주소는 example.com이라고 가정합니다.

 

자 이제 접속을 시작해 봅시다.

이런 주소를 주소창에 입력합니다. 그리고 엔터를 탕하고 치면 웹브라우저는 example.com에 접속합니다.

 

 

이때 80번 포트로 접속하게 됩니다.

 

80번 포트에는 웹 서버가 대기 중이기 때문에 웹서버로 요청이 전달됩니다.

 

웹 서버는 /usr/local/apache2/htdocs/에서 index.html 파일을 찾습니다.

 

index.html 파일을 읽어서 웹 브라우저에게 index.html의 코드를 전달하면 이 과정이 끝납니다.


이번에는 docker를 사용해서 웹 서버를 사용하는 방법에 대해서 살펴보겠습니다.

지금까지는 컴퓨터에 웹 서버를 직접 설치했지만 도커를 이용하면 웹 서버가 container에 설치됩니다.

 

그럼 이 Container가 설치된 운영체제를 무엇이라고 부르는지 궁금하지 않나요?

바로 docker host라고 부릅니다.

 

하나의 docker host에는 여러 개의 container가 만들어질 수 있겠죠.

container와 host 모두 독립적인 실행환경이기 때문에 각자 독립적인 포트와 파일 시스템을 가지고 있습니다.

 

자 이제 웹 브라우저로 웹 서버에 접속을 시작해 봅니다.

접속이 될까요? 안됩니다.

 

현재 host와 container의 연결이 끊겨 있기 때문입니다.

그럼 어떻게 하면 될까요?

host의 80번 포트와 container의 80번 포트를 연결해주면 됩니다.

container를 실행하는 명령을 docker run httpd에서 docker run -p 80:80 httpd로 변경합니다.

host와 container 포트가 연결된 것입니다.

앞에 80은 host의 포트이고 뒤에 80은 컨테이너의 포트입니다.

이렇게 설정을 해주면 host에 80번으로 들어온 신호가 container의 80번 포트로 전송되는 것입니다. 

 

이렇게 연결된 포트로 신호를 전달하는 것을 port forwarding이라고 합니다.

그럼 요청 신호가 웹서버로 전송되고 나머지 과정은 이전과 같습니다.

 

만약에 접속경로가 8000번 포트로 변경되었다면 어떻게 해야 할까요?

 

-p 옵션의 앞에 값을 8000으로 변경해야 합니다. 

그럼 이렇게 신호가 전달되겠죠?

나머지는 같습니다.

 

자 그럼 우리의 웹 서버를 사용하러 출발합시다.

windows라면 명령 프롬프트를 mac이라면 terminal을 실행시킵니다.

 

apache를 설치하지 않았다면 아래 명령어를 입력하여 apache server를 설치합니다.

docker pull httpd

 

docker desktop > Images > httpd 우측에 RUN 버튼을 클릭합니다.

 

옵션을 열어서 이름은 ws2라고 입력합니다.

포트는 우리의 localhost의 몇 번 포트로 들어왔을 때 container의 80번 포트로 보낼 것인가를 지정하는 것인데요.

container의 80번 포트는 container 그리고 image를 만든 사람이 이 image에 설치되어 있는 process에 접속할 때는 80번 포트로 접속해야 합니다.라고 설정을 해놨기 때문에 저거 80으로 되어 있는 겁니다.

 

localhost를 80이라고 하면 localhost 80 포트로 들어오면 container 80번 포트로 포트 포워딩하겠다는 뜻이고 8080이라고 하면 8080으로 들어왔을 때 container의 80번 포트로 보내겠다는 뜻입니다. 다 입력했다면 Run 버튼을 클릭합니다.

 

Run 버튼을 누르면 ws2라는 container가 생성이 된 것입니다.

 

 

docker desktop에서는 이렇게 하면 되는데 커맨드 라인에서는 어떻게 해야 되나 교차 학습해봅시다.

docker run에 [OPTIONS]에 지정을 하시면 됩니다.

 

 스크롤을 아래로 내려면 다양한 옵션들을 확인할 수 있습니다.

이 중에서 -p라는 옵션이 있습니다. publish의 줄임말이죠.

container의 포트를 host로 연결한다.라는 설정입니다.

 

docker ps 명령어를 이용하여 지금 실행되고 있는 container를 확인해 보겠습니다.

확인해보니까 조금 전 우리가 만든 ws2 container가 host 8080 포트를 container 80 포트로 포트 포워딩하는 것을 확인할 수 있습니다.

 

또 하나의 container를 만들어보겠습니다.

이름은 ws3로 설정하고 8081 포트로 들어오면 80으로 연결하겠다.라는 내용의 명령어를 작성합니다.

docker run --name ws3 -p 8081:80 httpd

 

실행이 됐고, docker ps를 확인해 보겠습니다.

잘 실행이 되었고, 8081을 80으로 보낸다고 되어 있습니다.

 

드디어 우리가 만든 웹 서버를 사용해보겠습니다.

웹 브라우저를 실행하고 localhost:8080/index.html로 접속합니다.

 

접속을 확인할 때는 docker desktop에서 logs를 켜놓고 접속하거나 페이지를 새 로고 침해서 로그가 출력되는지 확인합니다.

 

커맨드 라인에서 만들었던 8081로도 접속을 해봅니다.

8081 역시 접속이 잘되고 리로드를 할 때마다 잘 접속이 되고 있다는 의미로 로그가 갱신되는 것을 확인할 수 있습니다.

 

 

이렇게 해서 우리가 생성한 httpd라고 하는 애플리케이션을 드디어 실행할 수 있는 상태가 되신 겁니다.

728x90