문서 이름 : man / 12 / docker / AdvancedNetwork 
 문서 아이디 : 2426 
 라인수 : 175 
 문서 크기 : 13471 
 도 커 는 시작 할 때 , 호스트 머신 에 docker 0 이 라는 이름 의 가상 인터페이스 ( virtual interface ) 를 만든다 . docker 0 에 는 rfc 1918 에 따라서 사설 네트워크 ip ( private ip ) 가 할당 되 된다 . 보통 171 . 17 . 42 . 1 / 16 을 사용 한다 . 16 비트 의 크기 를 사용 할 수 있 으니 , 대략 65 , 534 의 도커 컨테이너 에 ip 를 할당 할 수 있 다 . 호스트 에서 사용 하 기 에 는 충분히 큰 숫자 라고 할 수 있 겠 다 . MAC 주소 는 ARP 충돌 을 회피 할 수 있 도록 IP 주소 와 함께 만드 는데 , 02 : 42 : ac : 11 : 00 : 00 에서 02 : 42 : ac : 11 : ff : ff 범위 에서 주소 를 할당 한다 . 
 그러나 docker 0 은 일반 적 인 인터페이스 가 아닌 , 가상 Ethernet bridge 로 여기 에 attached 된 다른 네트워크 인터페이스 들 간 의 패킷 을 포워딩 하 는 역할 을 한다 . 호스트 와 컨테이너 , 컨테이너 와 컨테이너 가 서로 패킷 을 주 고 받 는 통로 라고 보 면 된다 . 
 컨테이너 들 은 eth 0 인터페이스 를 이용 해서 통신 을 하 는데 , 이 를 위해서 vethAQI 2 QT 와 같 은 이름 의 가상 인터페이스 를 만든 다 . 이 들 가상 인터페이스 ( veth *) 들 은 docker 0 브릿지 에 attach 된다 . 여기 에 attach 된 컨테이너 들 은 같 은 서브 넷 을 공유 하 기 때문 에 , 자유 롭 게 통신 이 가능 하 다 . 
 도커 네트워크 설정 을 위한 주요 옵션 들 을 살펴보 자 . 
 몇 몇 네트워크 옵션 들 은 docker run 에서 만 사용 할 수 있 다 . 
 hostname 과 DNS 를 설정 한 커스텀 이미지 를 만들 지 않 고 도 도커 컨테이너 에 호스트 이름 과 DNS 를 설정 할 수 있 다 . 약간 의 트릭 을 사용 하 는데 , 호스트 운영 체제 의 / etc 파일 의 내용 을 컨테이너 내부 에 overlay 해서 사용 한다 . 컨테이너 에서 mount 정보 를 이용 해서 overlay 한 파일 의 목록 을 확인 할 수 있 다 . 
 / dev / mapper / ubuntu -- vg - root on / etc / resolv . conf type ext 4 . .. 
 / dev / mapper / ubuntu -- vg - root on / etc / hostname type ext 4 . .. 
 / dev / mapper / ubuntu -- vg - root on / etc / hosts type ext 4 . .. 
 즉 모든 도커 컨테이너 들 은 호스트 운영 체제 의 resolv . conf 를 공유 해서 사용 한다 . 
 이 들 네트워크 설정 을 변경 할 수 있 는 docker 옵션 들 이 있 다 . 
 컨테이너 와 인터넷 간 의 통신 
 컨테이너 가 호스트 바깥 으로 연결 하 기 위해서 는 두 가지 사항 을 준비 해야 한다 . 
 호스트 운영 체제 의 IP 패킷 포워딩 정책 확인 . 운영 체제 의 ip _ forward 가 활성 화 돼야 한다 . 이 파라 메터 의 값 이 1 인 경우 에 만 호스트 바깥 으로 통신 을 할 수 있 다 . sysctl 을 이용 해서 설정 을 변경 할 수 있 다 . 
 iptable 이 특정 연결 을 허용 하 는지 를 확인 해야 한다 . 설정 을 위해서 수고 할 필요 는 없 다 . 도커 를 설치 하 면 , 자동 으로 포워딩 룰 을 가지 고 있 는 DOCKER 체인 을 만든 다 . 
 도커 는 이미 설정 된 DOCKER 체인 을 수정 하 거나 삭제 하 지 않 는다 . 따라서 유저 는 필요 에 따라서 자신 의 룰 을 만들 수 있 다 . 
 도커 의 기본 포워딩 룰 은 모든 외부 source ip 를 허용 하 고 있 다 . 만약 특정 IP 나 네트워크 로 포워딩 을 제한 하 고 싶 다면 DOCKER 체인 의 첫 부분 ( top ) 에 부정 ( negated ) 규칙 을 추가 해야 한다 . 예 를 들 어서 8 . 8 . 8 . 8 에서 출발 한 패킷 을 제외 한 모든 패킷 을 막 고 싶 다면 아래 와 같이 설정 하 면 된다 . 
 # iptables - I DOCKER - i ext _ if ! - s 8 . 8 . 8 . 8 - j DROP 
 컨테이너 간 통신 
 두 가지 요소 에 의해서 컨테이너 간 통신 이 결정 된다 . 
 동일 한 네트워크 브릿지 에 컨테이너 를 연결 했 는가 ? 기본 적 으로 도커 는 docker 0 브릿지 에 모든 컨테이너 를 연결 한다 . 같 은 브릿지 에 연결 된 컨테이너 들 은 서로 통신 할 수 있 다 . 
 컨테이너 포트 를 호스트 에 바인딩 하 기 
 도 커 컨테이너 는 NAT 을 이용 해서 인터넷 으로 나갈 수 있 다 . 하지만 인터넷 에서 컨테이너 로 접근 할 수 는 없 다 . 도커 는 iptable 에 마스 커 레이딩 ( Masquerade ) 를 설정 해서 인터넷 으로 접근 한다 . 도커 의 마스 커 레이딩 설정 은 아래 와 같 다 . 
 외부 에서 접속 하 게 하 려면 포트 포워딩 을 해야 한다 . 이 를 위해서 는 두 개 의 값 을 조정 해야 한다 . 
 먼저 docker run 을 할 때 - p 옵션 을 이용 해서 포워딩 포트 를 설정 하 면 된다 . 호스트 의 5000 번 포트 를 컨테이너 의 22 번 포트 로 포워딩 하 기 원한다면 아래 와 같이 실행 한다 . 
 # docker run - p 5000 : 22 - i - t ubuntu / bin / bash 
 도커 서버 는 iptable 에 포트 포워딩 룰 을 추가 한다 . 
 DNAT tcp -- anywhere anywhere tcp dpt : 5000 to : 172 . 17 . 0 . 3 : 22 
 docker 0 커 스터 마이 징 
 기본 적 으로 도커 는 호스트 시스템 에 있 는 docker 0 이더넷 브릿지 를 사용 한다 . 이 브릿지 에 호스트 의 물리 적 인 네트워크 인터페이스 와 컨테이너 를 위한 가상 인터페이스 를 서로 묶 는 네트워크 를 만든 다 . 이 브릿지 는 리눅스 운영 체제 에서 제공 하 는 brctl 을 이용 해서 제어 할 수 있 는 , 가장 단순 한 형태 의 브릿지 다 . 
 도커 는 docker 0 의 IP 주소 , 넷 마스크 ( netmask ) , IP 할당 범위 등 을 설정 할 수 있 다 . 또한 브릿지 에 연결 된 컨테이너 의 송 / 수신 패킷 의 MTU ( Maximum Transmission Unit - 인터페이스 가 허용 하 는 최대 패킷 크기 ) 도 수정 할 수 있 다 . 이 값 들 은 도커 서버 실행 시 옵션 을 변경 하 는 걸로 적용 할 수 있 다 . 
 brctl 명령 을 찾 을 수 없 다면 bridge - utils 패키지 를 인 스톨 하 자 . 
 docker run 을 실행 하 면 , 도커 서버 는 새로운 컨테이너 에 대한 가상 인터페이스 를 만들 고 docker 0 에 attach 한다 . 컨테이너 는 ( 가상 인터페이스 에 연결 된 ) eth 0 이 올라오 고 , IP 가 설정 된다 . 
 // docker 컨테이너 에서 테스트 
 link / ether 00 : 00 : 00 : 00 : 10 : 01 brd ff : ff : ff : ff : ff : ff 
 inet 192 . 168 . 219 . 192 / 24 brd 192 . 168 . 219 . 255 scope global eth 0 
 inet 6 fe 80 : : 200 : ff : fe 00 : 1001 / 64 scope link 
 default via 192 . 168 . 219 . 1 dev eth 0 
 192 . 168 . 219 . 0 / 24 dev eth 0 proto kernel scope link src 192 . 168 . 219 . 192 
 자신 의 브릿지 만들 기 
 개인 적 ( 테스트 나 개발 ) 용 으로 사용 할 거 라면 도커 의 기본 브릿지 네트워크 를 사용 해도 상관없 겠 지만 , 비지니스 용 으로 서비스 를 만들 어서 배포 할 거 라면 비지니스 환경 에 맞 게 브릿지 를 수정 해야 한다 . 도커 는 이미 docker 0 을 가지 고 있 으니 , 이 것 을 지운 다음 새로운 브릿지 를 만들 어야 한다 . 
 / / 브릿지 만들 기 
 # ip addr show bridge 0 
 4 : bridge 0 : < BROADCAST , MULTICAST , UP , LOWER _ UP > mtu 1500 qdisc noqueue state UNKNO 
 WN group default 
 link / ether 56 : 71 : ad : 2 f : e 5 : d 9 brd ff : ff : ff : ff : ff : ff 
 inet 6 fe 80 : : 5471 : adff : fe 2 f : e 5 d 9 / 64 scope link 
 MASQUERADE all -- 192 . 168 . 5 . 0 / 24 0 . 0 . 0 . 0 / 0 
 이제 새로운 브릿지 bridge 0 이 만들 어 졌 다 . 컨테이너 를 만들 면 bridge 0 의 서브 넷 에서 자동 으로 IP 가 할당 된다 . 
 컨테이너 네트워크 
 인터넷 프로토콜 ( IP ) 통신 을 위해서 머신 ( machine ) 는 패킷 을 주 고 받 기 위한 통로 가 되 는 " 하나 이상 의 " 네트워크 인터페이스 를 가지 고 있 어야 한다 . 그리고 IP 패킷 을 인터페이스 로 보내 기 위한 라우팅 테이블 이 설정 돼야 한다 . 이때 네트워크 인터페이스 는 물리 적 일 필요 가 없 다 . 예컨데 리눅스 에서 사용 하 는 lo ( 루프 백 인터페이스 ) 는 가상 인터페이스 인 것 처럼 , 가상 의 인터페이스 를 사용 해도 상관없 다 . ( 루프 백 인터페이스 의 경우 , 한 쪽 프로세스 의 메모리 에 있 는 데이터 를 읽 어서 다른 쪽 프로세스 의 메모리 에 쓰 는 방식 으로 통신 이 이루어진다 . ) 
 컨테이너 의 네트워크 를 설정 하 는 과정 이 다 . 
 peer 가상 인터페이스 의 쌍 ( pair ) 을 만든 다 . 
 가상 인터페이스 의 이름 은 vetch 65 f 9 형식 으로 유일 하 게 만들 어 진다 . 도커 는 이 가상 인터페이스 를 도커 브릿지 ( docker 0 ) 에 attach 한다 . 
 이 인터페이스 는 새로 만들 어 지 는 컨테이너 에 던지 는데 ( toss ) , 이해 하 기 쉽 게 eth 0 으로 이름 을 변경 한다 . 
 인터페이스 의 MAC 주소 는 -- mac - address 로 할당 하 거나 랜덤 하 게 만들 어 진다 . 
 컨테이너 의 eth 0 에 는 브릿지 의 네트워크 주소 범위 내 에서 새로운 IP 주소 가 할당 되 고 브릿지 의 IP 를 게이트웨이 로 설정 한다 . 
 이 과정 이 끝나 면 , 컨테이너 는 eth 0 ( 가상 ) 네트워크 카드 를 이용 해서 다른 컨테이너 혹은 인터넷 으로 통신 할 수 있 다 . 
 docker networking 원문