도커 네트워크
•
컨테이너는 기본적으로 eth0, lo 네트워크 인터페이스를 가지고 있음
•
컨테이너에 172.17.0.0/16 대역의 프라이빗 IP 주소가 eth0에 자동으로 할당
•
컨테이너는 내부 IP를 순차적으로 할당하며 컨테이너가 재시작될때마다 변경
•
외부와 연결할 경우에는 호스트에 veth라는 네트워크 인터페이스를 생성하고 컨테이너의 eth와 연결(도커엔진에 의해 자동으로 veth 인터페이스 생성)
◦
docker() 브리지가 veth인터페이스와 바인딩되어 호스트의 eth 인터페이스와 연결
◦
NAPT 기능을 이용 → 도커에서는 NAPT에 리눅스의 iptables를 사용
Ex) 컨테이너 내 웹서버가 사용하는 80번 포트를 호스트 OS의 8080 포트로 전송하도록 설정
5가지 네트워크 구현 방식
Bridge
•
도커의 기본 네트워크 방식
•
도커 데몬을 실행하게 되면 docker0이라는 브리지가 생성
◦
컨테이너 생성 시 각 컨테이너마다 고유한 네트워크 네임스페이스 영역이 하나씩 생성되며 docker0 브리지에 컨테이너의 인터페이스들이 하나씩 binding
docer network inspect bridge
Docker
복사
Host
•
컨테이너가 독립적인 네트워크 영역을 갖지 않고 host와 네트워크를 함께 사용
•
컨테이너 생성 시 --net=host 옵션 이용
docker run --net=host httpd web01
Docker
복사
Container
•
기존에 존재하는 다른 컨테이너의 네트워크 환경을 공유
docker run --name web02 -d httpd
docker run --name web03 --net=containere1b4a085348e -d httpd
Docker
복사
Overlay
•
인터페이스를 하나 만들어서 각 호스트의 도커 컨테이너들이 해당 채널을 통해서 통신할 수 있도록 설정
•
같은 L2(MAC) 네트워크에 연결되어 있지 않은 서버들이 서로 L2 통신을 할 수 있도록 터널링 등의 기술 활용
None
•
격리된 네트워크 영역을 갖긴 하지만 인터페이스가 없는 상태로 컨테이너 생성
docker run --name web04 --net=none -d httpd
Docker
복사
도커 네트워크 목록 표시(docker network ls)
•
docker network ls [옵션]
hbeen@DESKTOP-EDC39JU:~$ docker network ls
NETWORK ID NAME DRIVER SCOPE
7e03ee90497d bridge bridge local
2f605ac99eb3 host host local
13ee1402811c none null local
Bash
복사
•
도커는 기본 값으로 bridge, host, none 네트워크를 만듬
네트워크 상세 정보 확인(docker network inspect)
•
docker network inspect [옵션] [네트워크]
hbeen@DESKTOP-EDC39JU:~$ docker network inspect web-network
[
{
"Name": "web-network",
"Id": "48e2f2e57083cb631d25788a46181af785c1e924432eea1361ba7d6f79b2af5f",
"Created": "2022-02-13T06:50:41.7420944Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"b5b62df9e5748177b00a4f8144be9b9522b9d636409b9ddcd359a92124a3f6f9": {
"Name": "sad_cannon",
"EndpointID": "5381c791de68fb3205911835e579df8474ef8dae0c004314417ee3e980eefbb1",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
Bash
복사
사용자 정의 네트워크 작성(docker network create)
•
docker network create [옵션] [네트워크 이름]
옵션
•
-d : 네트워크 브리지 또는 오버레이
•
--ip-rage : 할당하는 IP 주소 범위 지정
•
--subnet : 서브넷 지정
•
-label : 네트워크 설정하는 라벨
//web-network라는 이름의 브리지 네트워크 작성
hbeen@DESKTOP-EDC39JU:~$ docker network create --driver=bridge web-network
48e2f2e57083cb631d25788a46181af785c1e924432eea1361ba7d6f79b2af5f
hbeen@DESKTOP-EDC39JU:~$ docker network ls
NETWORK ID NAME DRIVER SCOPE
7e03ee90497d bridge bridge local
2f605ac99eb3 host host local
13ee1402811c none null local
48e2f2e57083 web-network bridge local
Bash
복사
네트워크 연결(docker netowrk connect/docker network disconnect)
•
docker network connect [옵션] [네트워크 컨테이너]
◦
연결 후에는 동일한 네트워크 상에 있는 다른컨테이너와 통신 가능
옵션
•
--ip : ipv4 주소
•
--alais : 앨리어스 명
•
--link : 다른 컨테이너에 대한 링크
◦
같은 호스트에 있는 컨테이너를 연결하여 호스트에 포트를 노출시키지 않아도 직접 통신할 수 있게 해줌
◦
멀티호스트에서는 지원하지 않음
hbeen@DESKTOP-EDC39JU:~$ docker network connect web-network b5b62df9e574
Bash
복사
네트워크 삭제(docker network rm)
•
docker network rm [옵션] [네트워크]