본문 바로가기

CI-CD/Docker

Docker- Network

Network

Docker network를 통해서 컨테이너를 연결하고 다른 네트워크와는 격리할 수 있다.

 

기본적으로 bridge라는 이름의 기본 네트워크가 주어진다. 만일 run 명령을 실행할 때 컨테이너를 연결할 별도의 network를 명시해주지 않는다면 기본적으로 bridge 네트워크에 연결이 된다.

 

현재 존재하는 network들의 목록은 다음 명령어로 확인 가능하다.

// docker network 목록 확인
$ docker network ls

 

확인한 네트워크들 중에서 확인하고 싶은 네트워크가 있다면 다음 명령어로 확인 가능하다.

// 네트워크 확인
$ docker inspect [network 명]

 

예를 들어 두개의 컨테이너 (my_container1, my_container2)를 my_bridge라는 docker 네트워크에 연결하는 일련의 과정은 다음과 같다.

 

1. my_bridge 생성

// my_bridge network 생성
$ docker network create my_bridge

2. 컨테이너 생성 및 연결

$ docker run -itd --name my_container1 --network my_bridge busybox
$ docker run -itd -p 8080:80 --name my_container2 --network my_bridge nginx

 

 

생성한 my_bridge 네트워크에 두개의 컨테이너를 연결했으니 inspect 명령으로 확인해보자.

ubuntu@worker-1:~$ docker inspect my_bridge
[
    {
        "Name": "my_bridge",
        "Id": "6f9b0625593efaca5681e176a1e6166b0b302414b6309528a3031227803dfb11",
        "Created": "2024-05-10T02:12:49.782431089Z",
        "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,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "3bfede8db7183996550c6e360fc96c9143001cd9e76ee6da9d84e1ba641ee661": {
                "Name": "my_container1",
                "EndpointID": "bdfd52dafcf09df7eec08dbfa935d8e604b16eca17a30642aa09227dab317983",
                "MacAddress": "02:42:ac:13:00:02",
                "IPv4Address": "172.19.0.2/16",
                "IPv6Address": ""
            },
            "fed21a11496bce7d732d77a2c8f959573cbb8011b8835f8e7b49b6ffda222866": {
                "Name": "my_container2",
                "EndpointID": "2d1a736665c9b446a83dfd0b8eb83ef5a807d9477546367d294b32a2f1f58c84",
                "MacAddress": "02:42:ac:13:00:03",
                "IPv4Address": "172.19.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

서브넷은 172.19.0.0/16로 설정되어 있고, 네트워크 게이트웨이는 172.19.0.1이다.

내부에는 두개의 컨테이너(my_container1, my_container2)가 존재하는 것을 확인할 수 있다.

구조도는 다음과 같다.

 

사설 네트워크(my_bridge) 내부의 컨테이너와 다른 네트워크의 컨테이너들은 서로 격리되어 있기에 서로 통신을 할 수 없다.

 반면에 같은 네트워크 내부의 컨테이너들끼리는 컨테이너 명을 통해서 통신을 할 수 있는데, 컨테이너가 재시작 되는 경우 내부 ip가 변경되므로 이름을 통한 통신은 굉장한 장점이라고 볼 수 있다.

 

이런 식으로 동일한 my_container1에서 my_container2에 이름을 명시하여 ping 요청도 보내 줄 수 있다(서로 통신 확인).

 

반면에 다른 네트워크에 있는 odin이라는 컨테이너에 통신 요청을 보내는 경우에는 서로 네트워크가 달라서 격리되어 있어 동작이 제대로 수행되지 않는 것을 볼 수 있다.

 


Reference

Docker networking is CRAZY!! (you NEED to learn it) (youtube.com)

 

'CI-CD > Docker' 카테고리의 다른 글

Docker- Volume  (0) 2024.04.21
Docker- Docker Compose  (0) 2024.04.17
Docker- Docker file  (0) 2024.04.16
Docker- redis 실행  (0) 2024.04.14
Docker- 명령어  (0) 2024.03.17