Docker의 네크워크 구현 방식
네트워크 종류 | 설명 |
---|---|
host | 호스트이 네트워크 환경을 대로 사용하는 방식 |
bridge | 새로운 bridge를 생성하여 container를 bridge에 연결하여 사용하는 방식 (Docker에서는 기본적으로 bridge 방식을 제공) |
overlay | 물리적으로 떨어진 서버에서 Docker만의 네트워크를 구성하기 위한 네트워크 입니다. |
none | 네트워크에 연결되어 있지 않은 상태. |
Docker의 네트워크 - bridge 방식(기본 방식)
1. Docker 네트워크 구조
container 별로 가상의 NIC를 할당 받아 통신 할 수 있습니다.
Docker는 독립 된 네트워크를 구성 하기위하여 3가지 기술을 사용 합니다.
1) network namespace
- contianer안의NIC와 Container의 NIC와 pair 되는 VNIC를 만드는데 사용 합니다.
2) bridge
- llinux에서 software로 구현 한 bridge
- bridge하나 당 개별 네트워크를 구성 할 수 있습니다.
- container에 bridge를 2개 할 당하면 Container는 2개의 NIC를 가질 수 있습니다.
- L2 통신만을 지원 합니다.
3) iptables
- Container가 외부 네트워크 통신을 하기 위해서 사용 됩니다.
- NAPT를 이용하여 통신을 한다.
*NAPT 란 ?
- 내부 사설 IP와 Port를 공용 IP와 Port로 변경 시켜주는 기능입니다.
2. Docker 네트워크 통신 과정
1) 내부 통신
- container는 같은 bridge에한 해서L2 통신을 수행 합니다.
- bridge가 다른 container 끼리는 통신 할 수 없습니다.
즉, container0 과 container2는 통신 불 가 합니다.
1) 외부 통신
(1) container -> 외부
- bridge까지는 L2 통신을 한 후 Iptables의 POSTROUTING 을 거쳐 MASQUERADE 되어 외부로 나갑니다.
(2) 외부 -> container
- Docker host에 들어온 패킷이 PREROUTING chain 을 통해 DOCKER Chain 으로 전달하고,
Docker Chain에서는 DNAT로 8080 포트로 들어온 요청을 172.17.0.2 IP를 가진 container 의 80 포트로 포워딩 되는 것을 알 수 있다.
3. Docker 기본 Container 생성시 네트워크 정보
1). 현재의 네트워크 확인
1 | $ docker network ls |
2). 기본 으로 생성한 container의 네트워크 상태
(1). 생성
1 | $ docker run -itd --name centos-original centos |
(3). container 네트워크 확인
1 | $ docker container inspect centos-original |
- host(docker가 실행되고 있는 서버)에서 ping으로 IP 연결 상태 확인
1
$ ping 172.17.0.2
Docker의 네트워크 - 사용자 정의 네트워크
1. Docker 사용자 정의 네트워크 관리 [bridge 방식]
- Docker에서는 사용자 정의 네트워크를 생성 할 수 있게 해주는 기능을 제공 합니다.
- 이 기능으로 Docker 자체만으로 다양한 네트워크 망을 구성 할 수 있습니다.
1) 사용자 정의 네트워크 생성 (network create)
(1) 생성
1 | $ docker network create --driver=bridge {생성할 bridge 이름} |
- driver옵션을 사용하여 생성할 네트워크를 지정 할 수 있습니다.
- brctl show를 통하여 bridge 정보 확인
*brctl 이 없으면yum install bridge-utils
로 설치
(2) docker에서 확인
1 | $ docker network ls // bridge 정보 확인 |
1 | $ docker network inspect {생성한 bridge 명} // 상세 내역 확인 |
2) 사용자 정의 네트워크 삭제 (rm)
(1) 삭제
1 | $ docker network rm {삭제 할 bridge 이름} |
(2) 유의 사항
- 해당 bridge를 사용하고 있는 container가 구동 중이면 삭제가 되지 않습니다.
Docker의 Container 네트워크
1) container에 사용자 정의 네트워크 설정 (–net)
(1) container를 생성시 기본 네트워크로 설정
- {–net}옵션을 사용하여 사용자 정의 네트워크를 기본 네트워크로 설정 할 수 있습니다.
1
$ docker run -itd --net=mybridge --name=centos-network-1 centos
(2) container의 네트워크 상태 확인
1 | $ docker container inspect centos-network-1 |
- mybridge로 네트워크가 설정 된것을 확인 할 수 있습니다.
2) container에 사용자 정의 네트워크 추가 (connect)
- 핵심 : container에 할당 된 network 를 추가 시켜 주면 됩니다.
(1) container에 네트워크 추가
1 | $ docker network create --driver=bridge mybridge |
(2) container에 네트워크 추가된 네트워크 확인
1 | $ docker attach {container이름} |
- docker에 접속하여 ifconfig로 NIC가 2개 가된것을 확인 할 수 있습니다.
*ifconfig가 없을 시”yum install net-tools” 로 설치 하시면 되십니다.
(현재 테스트 하면서 캡쳐를 한거라 Network ID가 다릅니다. NAME으로 구분 하시면 되십니다.)
3) container에 사용자 정의 NIC 삭제 (disconnect)
- 핵심 : container에 할당 된 network 를 끊어 주면 됩니다.
(1) NIC 삭제
1 | $ docker network disconnect {삭제할 bridge 이름} {container이름} |
(2)docker 로 Container Network 확인
1 | $ docker container inspect centos-network-1 |
Docker의 네트워크 주소 관리
1) 네트워크 대역 관리
Docker는 Bridge에 할당된 네트워크 대역을 사용하여 Container에 IP가 할당 됩니다.
Docker에서는 Bridge를 생성 할 때만다 네트워크 대역을 자동으로 1씩 증가 시킵니다.
Ex)
첫번째 brdige: 172.17.0.0/24
두번째 brdige: 172.18.0.0/24bridge에 container가 추가 될 떄 만다 자동으로 IP 번호가 증가 하여 할당 됩니다.
Ex)
첫번째 container: 172.17.0.2
두번째 container: 172.17.0.3
2) 네트워크 대역 변경
(1) 사용자 정의 네트워크를 생성시 IP 대역을 변경 할 수 있습니다.
1 | $ docker network create --driver=bridge --subnet=172.1.0.0/16 --ip-range=172.1.0.0/24 --gateway=172.1.0.1 mybridge |
3) Container IP 설정
(1) container 생성시 설정
1 | $ docker run -itd --ip 172.1.0.5 --net=mybridge --name=centos-network-1 centos |
–ip : container에 할당 할 IP 설정
–net : container 할당 할 IP가 속해 있는 network 대역을 가진 bridge 설정
(2) container 생성 후 변경
<핵심>
- container의 network를 삭제 후 다시 등록
<정보>
- contianer 명 : centos-network-1
<절차>
- container 종료
#docker container stop centos-network-1
- container에서 네트워크 삭제
#docker network disconnect mybridge centos-network-1
- container에 네트워크 추가
#docker network connect mybridge –ip=172.1.0.10 centos-network-1
- container 시작
#docker container start centos-network-1