JetsonNano + Docker의 컨테이너를 호스트 컴퓨터와 동일한 세그먼트에 배치했을 때의 메모

Jetson Nano + Docker의 컨테이너에 서버를 여러 개 만들려고 할 때 이끼 때문에 메모.

어렵게 생각했지만 아래 참고 기사 덕분에 상당히 쉽게 해결할 수 있었다.
어쩌면 이것이 없으면 해결할 수 없었습니다.
  • docker에서 MACVLAN을 사용하여 호스트와 동일한 IP 공간의 IP 할당

  • 환경


  • 개발 키트 : JetPack 4.3
  • OS: 18.04.3 LTS
  • Docker: 19.03.5

  • 만들고 싶은 것



    Docker에서 Jetson Nano에 여러 서버를 구축하여 마치 호스트 머신과 같은 세그먼트에있는 것처럼 보이게하고 싶었고 격투했습니다.
    단순히 포트 변환에서도 갈 수 있다고 생각합니다만, 그것이라고 그다지 이케하지 않구나-라고 느꼈으므로 싸워 보았습니다.



    호스트의 네트워크 설정



    먼저 Jetson Nano의 네트워크(eth0)를 확인합니다.
    $ ifconfig
    ...
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.1.11  netmask 255.255.255.0  broadcast 192.168.1.255
            inet6 xxxx:xx:xxxx:xxxx:xxx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x0<global>
            inet6 xxxxxxxxxxxxxxxxxxxx  prefixlen 64  scopeid 0x20<link>
            ether xxxxxxxxxxxxxxxxx  txqueuelen 1000  (Ethernet)
            RX packets 138314  bytes 105082864 (105.0 MB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 42142  bytes 3724547 (3.7 MB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
            device interrupt 151  base 0x5000
    ...
    

    Docker 네트워크 설정(macvlan)



    Docker의 network 명령을 사용하여 네트워크 목록을 볼 수 있지만 설치 중에 구성된 네트워크 설정에서는 위 그림의 환경을 만들 수 없습니다.

    그래서 macvlan 인터페이스를 만들고 컨테이너를 시작할 때 네트워크를 사용하도록 설정합니다.

    macvlan이란?



    하나의 물리적 NIC에 대해 가상 NIC를 여러 개 만들 수 있는 기능인 것 같습니다. 자세한 내용은 다른 사람의 기사을 참조하십시오.

    Docker 네트워크 생성



    호스트의 네트워크 설정을 기반으로 Docker create에서 네트워크를 만듭니다. 다음 명령은 Jetson Nano의 eth0에 macvlan 네트워크를 만듭니다.
    # ネットワークの作成
    $ docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 shared_nw
    # 作成したネットワークの確認
    $ docker network inspect shared_nw
    [
        {
            "Name": "shared_nw",
            "Id": "552a5787314480bd94c43582f7a46968d7bea985b93d7a90f3923a859be32e73",
            "Created": "2020-01-24T00:31:59.856134246+09:00",
            "Scope": "local",
            "Driver": "macvlan",
            "EnableIPv6": false,
            "IPAM": {
                "Driver": "default",
                "Options": {},
                "Config": [
                    {
                        "Subnet": "192.168.1.0/24",
                        "Gateway": "192.168.1.1"
                    }
                ]
            },
            "Internal": false,
            "Attachable": false,
            "Ingress": false,
            "ConfigFrom": {
                "Network": ""
            },
            "ConfigOnly": false,
            "Containers": {},
            "Options": {
                "parent": "eth0"
            },
            "Labels": {}
        }
    ]
    

    Docker 컨테이너 시작



    네트워크를 작성할 수 있었으므로, 나머지는 이 네트워크를 이용한 컨테이너를 기동합니다.
    예를 들어 기본 Apache 서버를 192.168.1.12로 시작합니다.
    # Jetson Nanoと同じセグメント上のIP:192.168.1.12にWebサーバを起動
    $ docker run -itd --net=shared_nw --ip=192.168.1.12 httpd
    

    웹브라우저로 접속하면 자주 보는 "It Works!"를 볼 수 있습니다.



    제한사항



    이 방법으로 컨테이너를 시작하면 제한으로 Jetson Nano에서 컨테이너에 액세스 할 수 없습니다.
    (이번 경우 예를 들어 Jetson Nano에서 Apache 서버로 웹 브라우저를 사용하여 액세스 할 수 없습니다)
    이것은 macvlan의 기능상 피하는 방법은 없다고 합니다.

    좋은 웹페이지 즐겨찾기