Docker 컨테이너(container)는 격리된 환경에서 돌아가기 때문에 기본적으로 다른 컨테이너와의 통신이 불가능하다. 하지만 여러 개의 컨테이너를 하나의 Docker 네트워크(network)에 연결시키면 서로 통신이 가능해진다. 컨테이너 간 네트워킹이 가능하도록 도와주는 Docker 네트워크에 대해 알아보도록 하자.
docker network ls
명령어를 사용하면 현재 생성되어 있는 Docker 네트워크 목록을 조회할 수 있다.
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
143496b94e57 bridge bridge local
311d6534f79f host host local
aa89f58200a6 none null local
bridge, host, none은 Docker 데몬(daemon)이 실행되면서 디폴트로 생성되는 네트워크이다. 대부분의 경우에는 이러한 디폴트 네트워크를 이용하는 것 보다는 사용자가 직접 네트워크를 생성해서 사용하는 것이 권장된다.
network의 driver는 해당 네트워크의 작동 방식에 대한 것으로, 여기에서 더 자세한 내용을 볼 수 있다.
먼저 docker network create 커맨드를 사용해서 새로운 Docker 네트워크를 생성해보자.
$ docker network create our-net
x6wfa4e9a5ec85abcb484662sdc30a3sdc76df21svsdqw76d52fac39faqw8412zz68
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
143496b94e57 bridge bridge local
311d6534f79f host host local
aa89f58200a6 none null local
e6dfe4a9a5ec our-net bridge local
추가된 네트워크는 docker network ls 커맨드로 확인할 수 있다. -d 옵션을 사용하지 않았기 때문에 기본값인 bridge 네트워크로 생성된 것을 볼 수 있다.
docker network inspect
로 네트워크의 상세 정보를 확인할 수 있다.
$ docker network inspect our-net
[
{
"Name": "our-net",
"Id": "e6dfe4a9a5ec85abcb484662c30a3a0fc76df217dde76d52fac39fae8412ca68",
"Created": "2020-04-26T19:23:04.563643516Z",
"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": {},
"Options": {},
"Labels": {}
}
]
아직 컨테이너에 연결하지 않았기 떄문에 Containers
항목이 비어있다.
docker network connect [OPTIONS] NETWORK CONTAINER
# docker network connect our-net one
our-net 네트워크의 상세 정보를 확인해보면 one이라는 컨테이너가 연결되어있는 것을 볼 수 있다.
$ docker network inspect bridge
...
"Containers": {
"660bafdce2996378cde070dfd894731bb90745e46d2ab10d6504c0cc9f4bdea9": {
"Name": "one",
"EndpointID": "40b4bbd8385debf86eef2fc2136315e1a82fa1ef72877bfae25477d6e8e46726",
"MacAddress": "02:42:ac:11:00:04",
"IPv4Address": "172.17.0.4/16",
"IPv6Address": ""
},
},
...
생성하는 동시에 연결하고싶다면 이렇게 할 수 있다.
$ docker run -itd --name two --network our-net busybox
0e7fe8a59f9d3f8bd545d3e557ffd34100a09b8ebe92ae5a375f37a5d072873d