Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

■ Apache2 설치하여 웹서버 실행

도커는 기본적으로

도커 컨테이너 외부에 노출

컨테이너는 가상머신과 마찬가지 IP주소를 할당받는다.

기본적으로 도커는 컨테이너에 172.17.0.x 의 IP를 순차적 할당한다.

컨테이너를 생성한 후 ifconfig로 네트워크 인터페이스를 확인한다.

할당(내부 네트워크)을 받는다.

외부로 컨테이너의 어플리케이션을 노출하기 위해서는 컨테이너IP 와 호스트IP를 바인딩 해야 한다.

<외부로 노출하는 도커 컨테이너 실행 예>

Code Block
Code Block
[root@localhost ~]# docker run -i -t --name network_test ubuntu:14.04
Unable to find image ' webserver -p 80:80 ubuntu:14.04' locally
14.04: Pulling from library/ubuntu
c954d15f947c: Downloading [========================>                          ]   36.2MB/72.95MB
c3688624ef2b: Download complete 
848fe4263b3b: Download complete 
23b4459d3b04: Download complete 
36ab3b56c8f1: Download complete 
Digest: sha256:e1c8bff470c771c6e86d3166607e2c74e6986b05bf339784a9cab70e0e03c7c3
Status: Downloaded newer image for 

-p 는 컨테이너의 포트를 호스트의 포트와 바인딩한다.

Note

[호스트포트] : [컨테이너포트]


<다음은 호스트 7777 포트를 컨테이너의 80포트와 바인딩의 예>

Code Block
# docker run -i -t -p 3306:3306 -p 192.168.56.101:7777:80 ubuntu:14.04
root@932ac299b590root@c2e5af01206c:/# apt-get update
root@932ac299b590root@c2e5af01206c:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:02  
          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:13 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1086 (1.0 KB)  TX bytes:0 (0.0 B)
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

아무런 설정이 없었기때문에 이 컨테이너는 외부에 접근 할 수 없으며 도커가 설치된 호스트에서만 접근이 가능하다.

외부에 컨테이너의 어플리케이션을 노출하기 위해서는 컨테이너IP 와 호스트IP를 바인딩 해야 한다.

Code Block
[root@localhost ~]# docker run -i -t --name mywebserver -p 80:80 ubuntu:14.04
root@4107b91f969d:/# [root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES
4107b91f969d        ubuntu:14.04        "/bin/bash"         31 seconds ago      Up 30 seconds       0.0.0.0:80->80/tcp   mywebserver
932ac299b590        ubuntu:14.04        "/bin/bash"         5 minutes ago       Up 5 minutes                             network_test

-p 옵션은 컨테이너의 포트를 호스트포트와 바인딩하여 연결할 수 있게 설정한다.

-p의 옵션 형식은 다음과 같다.

[호스트포트] : [컨테이너포트]

호스트의 7777 포트를 컨테이너 80 포트와 연결하려면 7777:80 와 같이 입력하며

호스트의 특정 아이피를 사용하려면 192.168.0.100:7777:80 과 같이 바인딩할 아이피와 포트를 명시한다.

여러개의 포트를 외부에 개발하게되면 -p 옵션을 어러번 사용할수 있다.

Code Block
[root@localhost ~]# docker run -i -t -p 3306:3306 -p 192.168.56.101:7777:80 ubuntu:14.04

실행이 완료되면 [도커엔진호스트IP] : 80 으로 접근이 가능하다.

호스트의 IP와 포트를 컨테이너의 아이피와 포트로 연결한다는 개념은 매우 중요하다.

172대역을 가진 컨테이너의 NAT IP와 80번 포트로 서비스하므로 여기에 접근하려면

apt-get install -y apache2
root@c2e5af01206c:/# service apache2 start

호스트의 특정 IP 를 사용하기 위하여, 192.168.56.101:7777:80 으로 바인딩할 IP로 명시,

여러개의 포트를 외부에 노출하기 위하여 -p 옵션을 여러개 사용한다.

Info

컨테이너 내에서 아파치를 실행 했을때..다음과 같은 오류가 난다면...

Starting web server apache2 AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message

[/etc/apache2/apache2.conf] 파일에서 "ServerName localhost" 설정 후 저장.  

service apache2 restart 또는 start 하면 된다.


다음과 같이 브라우저에서 실행을 하면 [호스트IP] : 192.168.56.101:7777 으로 접근이 가능.

Image Added

호스트의 IP 와 포트를 컨테이너의 IP 와 포트로 연결한다는 개념은 172 대역을 가진 컨테이너의 NAT IP 와 80번 포트로 서비스한다고 여겨짐.

즉, 172.17.0.x :80으로 접근할 수 있다.


■ 도커 컨테이너 외부노출 아키텍처

draw.io Diagram
bordertrue
viewerToolbartrue
fitWindowfalse
diagramName컨테이너 외부노출 아키텍처
simpleViewerfalse
width
diagramWidth331
revision1



■ Nginx 설치하여 웹서버 실행

Code Block
# docker run -d -p 8000:80 nginx:latest
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
8176e34d5d92: Pull complete
5b19c1bdd74b: Pull complete
4e9f6296fa34: Pull complete
Digest: sha256:4771d09578c7c6a65299e110b3ee1c0a...
Status: Downloaded newer image for nginx:latest
03c80ecf37dc0012f74ad2c6a66e1d5c13bd60d81bc7728c9815d05e7d784e36

[root@localhost ~]# curl localhost:8000
<!DOCTYPE html>
<html>
<head>
...
</html>


다음과 같이 브라우저에서 실행을 하면 [호스트IP] : 8000 으로 접근이 가능하다.

Image Added

여러개 컨테이너들의 포트를 사용하고 게시하고 있다면 docker port 로 도커가 할당한 포트를 확인 후 적용 해야 할 것이다172.17.0.x :80으로 접근할 수 있다.