docker 호스트 간 네트워크 통신 실현

4034 단어
목표
2대의 docker 호스트의 용기와 용기 사이, 용기와 호스트 사이의 네트워크 호환을 실현하다
자원 준비
  • docker가 설치된 리눅스 서버 두 대를 준비합니다. (docker 설치는 매우 간단합니다. 여기는 설명이 많지 않습니다):
  • 192.168.9.1
  • 192.168.9.2
  • flannel-v0 다운로드.8.0, 여기서 우리는 CoreOS의 flannel을 통해 네트워크 통신 문제를 해결한다
  • IP 분배의 유일한 문제를 해결하기 위해 etcd 그룹을 준비하고, 그룹 준비 방안을 보기
  • 서버 초기화:
    2대의 서버를 각각 실행합니다: mkdir -p/opt/flannel/{bin,conf}
    구현 시작
  • 풀기 flannel-v0.8.0-linux-amd64.tar.gz

  • flanneld와 mk-docker-opts를sh/opt/flannel/bin 디렉터리로 복사
  • etcd에서 ip구간
  • 신청
    etcdctl 도구를 가진 기계에서 다음 명령을 실행합니다. 이 백엔드는 vxlan을 사용하고 기본 UDP를 사용하지 않습니다.
    etcdctl --endpoints "http://  etcd  ip:2379" set /xieyanke/network/config '{"NetWork":"10.0.0.0/16", "SubnetMin": "10.0.1.0", "SubnetMax": "10.0.10.0", "Backend": {"Type": "vxlan"}}'
    
  • flanneld 구성 파일 편집
  • vi/opt/flannel/conf/flanneld.conf
    ETCD_ENDPOINTS="http://  etcd1  IP:2379,http://  etcd2  IP:2379,http://  etcd3  IP:2379"
    ETCD_PREFIX="/xieyanke/network"
    
  • 관리의 편의를 위해 flanneld 시스템d
  • 를 설정합니다.
    vi/usr/lib/systemd/system/flanneld.service
    [Unit]
    Description=Flanneld
    Documentation=https://github.com/coreos/flannel
    After=network.target
    Before=docker.service
    [Service]
    EnvironmentFile=/opt/flannel/conf/flanneld.conf
    User=root
    ExecStart=/opt/flannel/bin/flanneld \
            --etcd-endpoints=${ETCD_ENDPOINTS} \
            --etcd-prefix=${ETCD_PREFIX} \
            --iface=       IP \
            --ip-masq
    Restart=on-failure
    Type=notify
    LimitNOFILE=65536
    [Install]
    WantedBy=multi-user.target
    
  • flanneld
  • 시작
    systemctl daemon-reload systemctl start flanneld
  • mk-docker-opts를 통해sh docker 시작 매개 변수 만들기
  •   :/opt/flannel/bin/mk-docker-opts.sh -i
    

    생성된 매개변수는/run/dockeropts.env 기록
  • 시스템d에 docker의 시작 파라미터 추가
  • EnvironmentFile=/run/dockeropts.env ExecStart=/usr/bin/dockerd $DOCKER_OPT_BIP $DOCKER_OPT_IPMASQ $DOCKER_OPT_MTU
    vi/usr/lib/systemd/system/docker.service
    [Unit]
    Description=Docker Application Container Engine
    Documentation=https://docs.docker.com
    After=network-online.target firewalld.service
    Wants=network-online.target
    
    [Service]
    Type=notify
    # the default is not to use systemd for cgroups because the delegate issues still
    # exists and systemd currently does not support the cgroup feature set required
    # for containers run by docker
    EnvironmentFile=/run/docker_opts.env
    ExecStart=/usr/bin/dockerd \
            $DOCKER_OPT_BIP \
            $DOCKER_OPT_IPMASQ \
            $DOCKER_OPT_MTU 
    ExecReload=/bin/kill -s HUP $MAINPID
    # Having non-zero Limit*s causes performance problems due to accounting overhead
    # in the kernel. We recommend using cgroups to do container-local accounting.
    LimitNOFILE=infinity
    LimitNPROC=infinity
    LimitCORE=infinity
    # Uncomment TasksMax if your systemd version supports it.
    # Only systemd 226 and above support this version.
    #TasksMax=infinity
    TimeoutStartSec=0
    # set delegate yes so that systemd does not reset the cgroups of docker containers
    Delegate=yes
    # kill only the docker process, not all processes in the cgroup
    KillMode=process
    # restart the docker process if it exits prematurely
    Restart=on-failure
    StartLimitBurst=3
    StartLimitInterval=60s
    
    [Install]
    WantedBy=multi-user.target
    
  • docker 다시 시작
  • systemctl daemon-reload systemctl restart docker
  • docker와 flannel의 가상 네트워크 카드가 같은 구역에 있는지 확인하고 같은 구역에 있으면 설정이 성공했음을 나타낸다
  • ifconfig docker0 ifconfig flannel.1
    실제 테스트
    docker 호스트 2대에 용기 2개 만들기
    192.168.9.1# docker run -it busybox sh
    #     IP
    / # cat /etc/hosts
    10.0.2.2    44ceb6a97c90
    

    192.168.9.2# docker run -it busybox sh
    #     IP
    / # cat /etc/hosts
    10.0.3.2    f914961f8d3c
    

    각각 용기 10.0.2.2와 10.0.3.2에서 ping 192.168.9.1, 192.168.9.2, 10.0.2.2, 10.0.3.2를 실행하고 네트워크가 서로 통하는지 확인한다. 만약에 ping이 성공하지 않으면 호스트 방화벽이 열렸다는 것을 표시하고 수동으로 방화벽을 닫으면 된다.

    좋은 웹페이지 즐겨찾기