Docker

docker network

개발자깡 2024. 3. 27. 13:34

rabbitmq clustering을 구성하기 위해 서로 다른 호스트의 컨테이너끼리 통신이 필요했는데 docker network overlay로 해결을 하게 되어 정리해본다.

 

docker swarm으로 host1에 조인을 먼저 해준다.

 

[host1]

docker swarm init
*토큰이 기억안날때* 
docker swarm join-token manager

 

init은 host1에서만 진행하여도 된다. init할때 나온 join 명령어를 join할 host에서 복붙해준다. 

 

[host2]

docker swarm join --token [token] [ip]:[port]
*join 확인하기*
docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
dkp8vy1dq1kxleu9g4u78tlag *  manager2  Ready   Active        Reachable
dvfxp4zseq4s0rih1selh0d20    manager1  Ready   Active        Leader

 

노드를 확인해보면 host1과host2가 연결된 것을 확인할 수 있다.

*표시는 현재 서버(host2)를 표시한것.

 

여기까지 하면 기본적으로 docker_gwbridge와 ingress라는 네트워크가 생성된다.

docker_gwbridge는 Overlay Network를 Docker Deamon의 물리적 Network에 연결하는 Bridge Network이고,

ingress는 Service되는 Node간 Load Balancing을 하는 Overlay Network이다.

 

[host1]

docker network create -d overlay --attachable overnet

 

여기까지하면 기본적으로 ingress라는 이름으로 overlay swarm이 생성된다.

compose 파일에서 네트워크를 생성할것이 아니라면 사용할 네트워크를 create해준다.

 

[host1, 2]

docker network connect [networkname] [containername]
docker network inspect [networkname]
[
    {
        "Name": "overnet",
        "Id": "26pngezmy4rfnf5i6hou6yt15",
        "Created": "2024-03-26T01:51:21.641722299Z",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.0.3.0/24",
                    "Gateway": "10.0.3.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "8bc03d5b8d83dcb1a99d0f8eae5a4a2ba33b8737fa8c7d553b125604dc1f34c4": {
                "Name": "agw-broker2",
                "EndpointID": "749a679f3ba3a6536e75227146660e29e773dae5c2eca42317fef962594b8257",
                "MacAddress": "02:42:0a:00:03:04",
                "IPv4Address": "10.0.3.4/24",
                "IPv6Address": ""
            },
            "lb-overnet": {
                "Name": "overnet-endpoint",
                "EndpointID": "d834f81be3552ec162f4749794907a7f3478ed9a8cf50f2f93723f51ccbbe446",
                "MacAddress": "02:42:0a:00:03:05",
                "IPv4Address": "10.0.3.5/24",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "4099"
        },
        "Labels": {},
        "Peers": [
            {
                "Name": "d9c07683c75f",
                "IP": "172.30.0.184"
            }
        ]
    }
]

 

기존에 있던 컨테이너에 네트워크 연결해주고 inspect로 확인하면 컨테이너가 잘 연결된걸 확인할 수 있다.

ec2에서 작업한다면 포트열어주기!

  • 2377/tcp : 클러스터 관리
  • 4789/udp : Ingress overlay 네트워크 트래픽
  • 7946/tcp,udp : 노드 간 통신  
docker exec [containername] ping [host IPv4Address]

 

각 host끼리 ping 보내보기.