Docker 네트워크 (Linux)

Docker의 네크워크 구현 방식

네트워크 종류 설명
host 호스트이 네트워크 환경을 대로 사용하는 방식
bridge 새로운 bridge를 생성하여 container를 bridge에 연결하여 사용하는 방식 (Docker에서는 기본적으로 bridge 방식을 제공)
overlay 물리적으로 떨어진 서버에서 Docker만의 네트워크를 구성하기 위한 네트워크 입니다.
none 네트워크에 연결되어 있지 않은 상태.

Docker의 네트워크 - bridge 방식(기본 방식)

1. Docker 네트워크 구조

  • container 별로 가상의 NIC를 할당 받아 통신 할 수 있습니다.
    DOCKER 네트워크 구조

  • 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

container 네트워크 확인

  • 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 정보 확인

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
2
3
$ docker network create --driver=bridge mybridge

$ docker network connect mybridge-1 centos-network-1

네트워크 추가

(2) container에 네트워크 추가된 네트워크 확인

1
2
3
$ docker attach {container이름}

$ docker attach centos-network-1
  • docker에 접속하여 ifconfig로 NIC가 2개 가된것을 확인 할 수 있습니다.
    *ifconfig가 없을 시”yum install net-tools” 로 설치 하시면 되십니다.
    (현재 테스트 하면서 캡쳐를 한거라 Network ID가 다릅니다. NAME으로 구분 하시면 되십니다.)
    추가 네트워크 확인

3) container에 사용자 정의 NIC 삭제 (disconnect)

  • 핵심 : container에 할당 된 network 를 끊어 주면 됩니다.

(1) NIC 삭제

1
2
3
$ docker network disconnect {삭제할 bridge 이름} {container이름}

$ docker network disconnect mybridge-1 centos-network-1 // ex

(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/24

  • bridge에 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

참조

공유하기