도커와 네트워크
- 네트워크란?
- 컴퓨터 네트워크 또는 컴퓨터망은 노드들이 자원을 공유할 수 있게 하는 통신망 장치입니다.
- 즉, 분산되어 있는 컴퓨터를 통신망으로 연결한 것을 말합니다.
- 도커의 네트워크
- 도커의 네트워크는 주로 호스트 머신에서 컨테이너 간 또는 콘테이너와 외부 간 자원을 공유할 수 있게 하는 통신망 장치를 의미합니다.
도커 네트워크 구조
- 도커의 네트워크 구조는 위와 같이 구성되어 있습니다.
- eth0(host) : 호스트가 사용하는 네트워크 인터페이스를 의미합니다.
- (참고) 우분투 특정 버전 이후부터는 하드웨어 장치에 따라 유동적으로 이름이 변경되도록 바뀌었습니다
- docker0 : 도커 설치 시 자동으로 생성되는 네트워크 인터페이스입니다.
- veth : 도커 컨테이너를 생성하면 내부적으로 docker0과 연결되는 네트워크 인터페이스가 생성됩니다.
- 다음 명령어로 리눅스에서 네트워크 설정 정보를 확인할 수 있습니다.
ip addr
- 도커 컨테이너를 생성하면, 컨테이너는 호스트 서버와 Network namespace가 격리되어 있습니다.
- 컨테이너 내부에는 가상 NIC(Network Interface Controller)(
eth0
)가 생성되며 Host의 가상 NIC인 veth
와 연결되어 있습니다.
veth
는 docker0
이라는 브릿지 네트워크를 통해 하나의 Host IP로부터 NAPT(Network Address Port Translation)을 이용하여 각 컨테이너와 상호작용하게 됩니다.
- 도커 컨테이너 생성 시 IP 주소는
172.17.0.2
부터 시작합니다.
도커 네트워크 종류
- 도커에는 다음과 같이 여러 종류의 네트워크가 있습니다.
bridge
- 기본(default) 네트워크 드라이버입니다.
- 브리지 네트워크는 동일한 Docker 데몬 호스트에서 실행되는 컨테이너에 사용됩니다.
host
- 컨테이너를 host 네트워크와 격리시키지 않으며, 컨테이너는 호스트의 네트워킹 네임스페이스를 공유합니다.
- 이를 통해 호스트의 포트를 이용하여 바로 서비스할 수 있습니다.
overlay
- 여러 Docker 데몬을 함께 연결하고 스웜 서비스가 서로 통신할 수 있도록 합니다.
- 스웜이란 도커의 Container Ochestartion 시스템을 의미합니다.
none
- 컨테이너의 네트워크를 사용하지 않도록 설정합니다.
- 해당하는 컨테이너는 외부와 통신이 단절됩니다.
macvlan
- 컨테이너에 MAC 주소를 할당하여 네트워크에서 물리적 장치로 직접 연결할 수 있습니다.
- Docker 데몬은 MAC 주소로 트래픽을 라우팅합니다.
네트워크 기본 명령어
network 목록 가져오기
- 다음 명령어로 network 목록을 가져올 수 있습니다.
docker network ls
NETWORK ID NAME DRIVER SCOPE
0fe2eaa0e0a3 bridge bridge local
39c2ab652d4c host host local
0c81514b4490 none null local
네트워크 정보 확인하기
- 다음 명령어로 network에 대한 자세한 정보를 확인할 수 있습니다.
docker network inspect <네트워크 이름>
docker inspect <컨테이너 이름>
네트워크 생성
- 다음 명령어를 입력해 새로운 bridge 네트워크를 생성합니다.
docker network create my-bridge
네트워크 연결
- 컨테이너 생성 시
--net
옵션의 값을 통해 네트워크 종류(이름)을 설정할 수 있습니다.
docker run -itd --name test-container --net my-bridge ubuntu:18.04
- 혹은 다음 명령어로 새로운 네트워크에 연결할 수 있습니다.
docker network connect bridge test-container
- 도커 내부에서
ip addr
혹은 ifconfig
를 확인하면 새로운 IP 대역이 할당된 것을 확인할 수 있습니다.
네트워크 제거
- (연결된 컨테이너가 없는 상태에서) 다음 명령어로 네트워크를 제거할 수 있습니다.
docker network rm my-bridge
네트워크 연결 해제
- 다음 명령어로 네트워크에서 연결을 해제할 수 있습니다.
docker network disconnect bridge test-container
네트워크 테스트
- 두 우분투 서버를 같은 네트워크에 연결한 후 테스트를 진행합니다.
docker network inspect bridge
"Containers": {
"28c2b7576d54b55fbcddcb30d3a82074b244ad634154e085231aeb104ec477aa": {
"Name": "test",
"EndpointID": "987e6468a7c4eb22d7c977c6767df4e94965ba446a76ef22fa7f31755de94795",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
},
"e310aacbcbbe6ec2b1f528ca8020bbb278acbb36539b1c572b0878b728eba063": {
"Name": "test-container",
"EndpointID": "016e1862bb13b93c321b90b51a94816682a21318bcf418de0eec3ecef9ff63f4",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
}
},
- 한 서버에서 다른 서버로 ping을 날려보겠습니다.
docker exec test-container ping -c 1 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.113 ms
--- 172.17.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.113/0.113/0.113/0.000 ms
Reference