Ubuntu16.04에서 Docker 컨테이너에 여러 NIC 브리지 연결

6688 단어 UbuntuDocker
안녕하십니까?
두 개의 Docker 호스트 네트워크 카드를 Docker 컨테이너에 연결할 수 있는 기회가 있기 때문에 이 방법을 정리해 보겠습니다.
여러 단락의 소통이 필요하거나 DHCPd 등 L2 연결이 필요한 경우에 유용하다.

최종 구성


최종적으로 Docker 컨테이너에서 Docker 호스트에서 네트워크로의 구성은 다음과 같습니다.
Docker에 대한 네트워크는 @hico_horiuchi 를 참조하십시오.
Docker의 기본 학습 ~ Docker의 네트워크 - Qiita

Docker 호스트 설정


네트워크 설정

eth0eth1 두 개의 네트워크 카드가 있는 가상 시스템에 Ubuntu Server 16.04가 설치되었습니다.
NIC의 이름이 ensXX인 경우 다음 수정 사항을 참조하십시오/etc/default/grub.
  • $ sudo sed -i 's/^GRUB_CMDLINE_LINUX=""$/GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"/g' /etc/default/grub 
    $ sudo update-grub
    $ sudo reboot
    

    다리를 만들다

    br0 수정eth0, br1 수정eth1, /etc/network/interfaces 수정brctl.
    네트워크 변경 사항을 적용하려면 다시 시작해야 합니다.
    auto eth0
    iface eth0 inet manual
    
    auto eth1
    iface eth1 inet manual
    
    auto br0
    iface br0 inet static
    address 10.1.1.2
    netmask 255.255.255.0
    up route add default gw 10.1.1.1
    bridge_ports eth0
    bridge_maxwait 0
    bridge_fd 0
    bridge_stp off
    
    auto br1
    iface br1 inet static
    address 172.16.1.2
    netmask 255.255.255.0
    bridge_ports eth1
    bridge_maxwait 0
    bridge_fd 0
    bridge_stp off
    
    다리 상태 확인 등에 bridge-utils 명령을 사용하기 때문에 br0 넣으면 편리하다
    $ sudo apt-get install -y bridge-utils
    

    Docker 설치


    Docker는 개인용 Ansible Playbook을 사용하여 최신 버전을 설치합니다.
    수동으로 설치할 때는 networking - Network interface name changes after update to 15.10 - udev changes - Ask Ubuntu 을 참조하십시오.
  • Get Docker CE for Ubuntu | Docker Documentation
  • $ git clone [email protected]:hico-horiuchi/hiconyan-com-ansible.git
    $ cd hiconyan-com-ansible
    $ virtualenv venv
    $ source venv/bin/activate
    $ pip install -r requirements.txt
    $ source venv/bin/activate
    $ ansible-playbook -i hosts -t common_apt,common_ssh,docker site.yml
    
    [conoha]
    10.1.1.2 ansible_python_interpreter=/usr/bin/python3
    

    Docker 네트워크 만들기


    두 개의 Docker 네트워크를 만듭니다. 연결br0_networkbr1과 연결br1_network입니다.
  • gateway: 브리지의 IP 주소를 지정합니다(예: br0.
  • com.docker.network.bridge.enable_ip_masquerade: NAPT를 허용하지 않음false을 지정합니다.
  • om.docker.network.bridge.name: 사용할 다리 이름(예: br0을 지정합니다.
  • 추가 옵션은 hiconyan-com-ansible/roles/docker at master · hico-horiuchi/hiconyan-com-ansible 을 참조하십시오.
    $ docker network create \
             -d bridge \
             --subnet 10.1.1.0/24 \
             --gateway 10.1.1.2 \
             -o 'com.docker.network.bridge.enable_icc=true' \
             -o 'com.docker.network.bridge.enable_ip_masquerade=false' \
             -o 'com.docker.network.bridge.host_binding_ipv4=0.0.0.0' \
             -o 'com.docker.network.bridge.name=br0' \
             -o 'com.docker.network.driver.mtu=1500' \
             br0_network
    $ docker network create \
             -d bridge \
             --subnet 172.16.1.0/24 \
             --gateway 172.16.1.2 \
             -o 'com.docker.network.bridge.enable_icc=true' \
             -o 'com.docker.network.bridge.enable_ip_masquerade=false' \
             -o 'com.docker.network.bridge.host_binding_ipv4=0.0.0.0' \
             -o 'com.docker.network.bridge.name=br1' \
             -o 'com.docker.network.driver.mtu=1500' \
             br1_network
    

    Docker 컨테이너에 네트워크 연결

    docker run--network 옵션은 연결할 네트워크만 지정할 수 있습니다.
    따라서 create 용기를 만들고 두 개의 네트워크를 연결한 다음 start 시작합니다.
    $ docker create -t --name ubuntu ubuntu:16.04 /bin/bash
    $ docker network connect --ip 10.1.1.3 br0_network ubuntu
    $ docker network connect --ip 172.16.1.3 br1_network ubuntu
    $ docker start -a ubuntu
    

    주의사항


    기울기 모드 정보


    교환기 단자network create — Docker-docs-ja 1.13.RC 문서의 대책으로 용기에서 온 데이터 패키지가 버려질 수 있다.
    컨테이너의 NIC와 브리지의 NIC의 MAC 주소가 다르기 때문에 필터링됩니다.
    이번에 ESXi에 VM을 구축했는데 무차별 모드와 위장 전송이 거부돼서...
    (이른바 전조 모드라고 불리는 기능은 효과가 필요한 것 같다.)
  • ARP 버퍼
  • docker0 네트워크 정보


    이미지를 구축할 때docker0을 사용하지만 패키지 다운로드 등에서 네트워크 소통이 필요합니다.
    그러나 생성br0_network 후 Docker의 네트워크 격리 기능으로 인해 docker0br0 간 소통이 불가능합니다.br1도 마찬가지로 인터넷을 사용할 수 없습니다. 주의하십시오.
    (이미지를 구축할 때 br0_network와 br1_network를 만들지 않고 서버를 따로 구축합니다.)
    $ sudo iptables -vL | grep -A4 'Chain DOCKER-ISOLATION'
    Chain DOCKER-ISOLATION (1 references)
     pkts bytes target     prot opt in     out     source               destination         
        0     0 DROP       all  --  docker0 br0     anywhere             anywhere            
        0     0 DROP       all  --  br0    docker0  anywhere             anywhere            
        0     0 RETURN     all  --  any    any     anywhere             anywhere
    

    참고 문헌

  • vSphere 표준 스위치 또는 표준 포트 그룹에 대한 보안 정책 구성
  • 여러 NIC를 Docker 컨테이너(CentOS7) - Qiita에 부여하는 방법
  • Docker - Create a Bridge and Shared Network (Example)
  • 좋은 웹페이지 즐겨찾기