블록체인
블록체인

도커 네트워크

도커 네트워크

컨테이너는 기본적으로 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 [옵션] [네트워크]