[회사 내부용] Docker 학습회(컨테이너 간 통신)

14792 단어 사내 학습회Docker
저번에서 나는 컨테이너를 사용하여 응용 프로그램을 실행하는 마이크가 이미 전달되었다고 믿는다.

컨테이너 통신


프로그램을 실행할 수 있다면 다른 용기와 통신하고 싶은 상황에 직면하게 될 것이다.
컨테이너 간의 통신은 두 종류로 나뉜다.

서로 다른 호스트에서 실행되는 용기 간의 통신



이 경우 연결원 컨테이너는 대상 컨테이너를 연결해 운행하는 컨테이너 본체의 IP 주소로만 통신하면 된다.
서비스 할인을 이유로 컨테이너 호스트를 의식하지 않으려면 후술한 오버레이 네트워크를 사용하지만 본 보도는 상세하게 처리하지 않습니다.

같은 호스트 내에서 이동하는 다른 용기 간의 통신



이번에는 주로 이쪽에 관한 기록이다.

Docker 네트워크


Docker는 컨테이너 간의 통신을 지원하며 기본적으로 Docker Engine에 3개의 네트워크를 만듭니다.
$ docker network ls
NETWORK ID          NAME                         DRIVER              SCOPE
fea25e294b20        bridge                       bridge              local
3762bcd6bffb        host                         host                local
f21c4ff0a40e        none                         null                local
DRIVER라는 프로젝트가 있기 때문에 먼저 설명해 드리겠습니다.
DRIVER 이름
설명
bridge
용기 안에서 링 인터페이스lo와 가상 인터페이스eth0를 제작한다.eth0 동일한 bridge 네트워크에 고유한 IP 주소가 할당됩니다.eth0 호스트에 연결된 가상 인터페이스를 포트를 통해 공개할 수 있습니다.bridge 네트워크는 단일 호스트 내에서 완성됩니다.
host
호스트의 인터페이스는 직접 사용될 것이다.
none
인터페이스가 생성되지 않습니다.
overlay
여러 호스트에 걸쳐 bridge 네트워크를 만들 수 있습니다.overlay 네트워크는 KVS가 관리해야 합니다. 현재는 Consuul, Etcd, Zookeeper를 지원합니다.
특별한 이유만 없으면bridge 네트워크를 선택하면 됩니다.
아무것도 지정하지 않았을 때 docker run 기본bridge 네트워크에 가입하십시오.
그러나 기본적인bridge네트워크는 서비스 발견(이름이 해결되지 않음)을 지원하지 않기 때문에 이 네트워크를 이용하여 컨테이너와 통신할 때 스스로 IP 주소를 찾아 통신 대상에게 지정해야 하지만 현실적이지 않다.

사용자 정의bridge 네트워크


bridge 네트워크를 직접 만들 수도 있습니다.
사용자 정의bridge 네트워크 지원 서비스 할인.

사용자 정의bridge 네트워크 만들기


특별히 의미 있는 시스템 구성은 아니지만 구별이 쉽기 때문에 다음과 같은 구성을 만들고 싶습니다.
환경은 Docker for Mac이지만 다른 환경도 기본적으로 변경되지 않습니다.

bridge 네트워크 만들기
$ docker network create --driver bridge web
3bc07243ffaeec96d384b7310bee747cba5b3afa5971ed30ae8eb08e3cae4176
$ docker network ls
NETWORK ID          NAME                         DRIVER              SCOPE
fea25e294b20        bridge                       bridge              local
3762bcd6bffb        host                         host                local
f21c4ff0a40e        none                         null                local
3bc07243ffae        web                          bridge              local
$ docker network inspect web
[
    {
        "Name": "web",
        "Id": "3bc07243ffaeec96d384b7310bee747cba5b3afa5971ed30ae8eb08e3cae4176",
        "Created": "2017-05-18T12:39:05.685712535Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.19.0.0/16",
                    "Gateway": "172.19.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

아파치 컨테이너 가동


아파치 컨테이너 가동
$ docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
10a267c67f42: Already exists
0782edf7745a: Pull complete
f3a72c4d9d02: Pull complete
dd6ec65d8a55: Pull complete
1b7920e1c0df: Pull complete
5b99e4053015: Pull complete
e720548ad189: Pull complete
Digest: sha256:72b55a7c15a4ee3d56ff19f83b57b82287714f91070b1f556a54e90da5eee3fa
Status: Downloaded newer image for httpd:latest
$ docker run -d -p 8080:80 --name=apache --net=web httpd
a274776cd3cc274e4ab72d7a2964532fd0b6de0620f5d2235c3b0cab927d5f14
$ curl -v localhost:8080
* Rebuilt URL to: localhost:8080/
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET / HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Thu, 18 May 2017 12:48:59 GMT
< Server: Apache/2.4.25 (Unix)
< Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
< ETag: "2d-432a5e4a73a80"
< Accept-Ranges: bytes
< Content-Length: 45
< Content-Type: text/html
<
<html><body><h1>It works!</h1></body></html>
* Connection #0 to host localhost left intact
Apache는 부팅 후 호스트 OS 측에서 포트를 공개할 수 있음을 확인했습니다.

시동 컨테이너


시동 컨테이너
$ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
ff3d52d8f55f: Pull complete
b05436c68d6a: Pull complete
961dd3f5d836: Pull complete
Digest: sha256:12d30ce421ad530494d588f87b2328ddc3cae666e77ea1ae5ac3a6661e52cde6
Status: Downloaded newer image for nginx:latest
$ docker run -d -p 8090:80 --name=nginx --net=web nginx
40839a2909d25769f3a2b3a40d51fd348ffd8b24d5005612d146217a08e02270
$ curl -v localhost:8090
* Rebuilt URL to: localhost:8090/
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8090 (#0)
> GET / HTTP/1.1
> Host: localhost:8090
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.13.0
< Date: Thu, 18 May 2017 12:52:08 GMT
< Content-Type: text/html
< Content-Length: 612
< Last-Modified: Tue, 25 Apr 2017 11:30:31 GMT
< Connection: keep-alive
< ETag: "58ff3357-264"
< Accept-Ranges: bytes
<
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
* Connection #0 to host localhost left intact
이것도 가동됐고 호스트 OS 측에서 nginx가 포트를 공개할 수 있다는 것을 확인했다.

웹 클라이언트 컨테이너 시작


웹 클라이언트 컨테이너 시작
$ docker pull centos
Using default tag: latest
latest: Pulling from library/centos
343b09361036: Pull complete
Digest: sha256:bba1de7c9d900a898e3cadbae040dfe8a633c06bc104a0df76ae24483e03c077
Status: Downloaded newer image for centos:latest
$ docker run -it --rm --name=client --net=web centos bash
[root@e95e6b29aed4 /]#

웹 클라이언트 컨테이너에서 다른 컨테이너에 http 요청


일단 아파치.
Apache에 요청
[root@e95e6b29aed4 /]# curl -v apache
* About to connect() to apache port 80 (#0)
*   Trying 172.19.0.2...
* Connected to apache (172.19.0.2) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: apache
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Thu, 18 May 2017 12:57:03 GMT
< Server: Apache/2.4.25 (Unix)
< Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
< ETag: "2d-432a5e4a73a80"
< Accept-Ranges: bytes
< Content-Length: 45
< Content-Type: text/html
<
<html><body><h1>It works!</h1></body></html>
* Connection #0 to host apache left intact
컨테이너 이름으로 통신이 가능합니다.
다음은 nginx.
nginx에 요청
[root@e95e6b29aed4 /]# curl -v nginx
* About to connect() to nginx port 80 (#0)
*   Trying 172.19.0.3...
* Connected to nginx (172.19.0.3) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: nginx
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.13.0
< Date: Thu, 18 May 2017 12:59:15 GMT
< Content-Type: text/html
< Content-Length: 612
< Last-Modified: Tue, 25 Apr 2017 11:30:31 GMT
< Connection: keep-alive
< ETag: "58ff3357-264"
< Accept-Ranges: bytes
<
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
* Connection #0 to host nginx left intact
이쪽도 컨테이너 이름으로 통신했다.
이상은 컨테이너 간의 통신에 관한 끝입니다.
마지막
Bridge 네트워크 내의 통신이기 때문에 호스트 측에 각각 공개된port(8080 또는 8090)이 아닙니다
원래 컨테이너 자체인 리스텐의 포트(80)도 접근할 수 있으니 지켜봐 달라.
이상한 점이 있으면 지적해 주세요. 고칠게요.

좋은 웹페이지 즐겨찾기