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 |