メモのページ - チラシの裏メモ 3枚目

通信技術や気になった事を黙々とメモし続ける

Docker Desktop for WindowsでArista cEOS

インフラエンジニアやWebエンジニアの方々にはお馴染みのDocker、しかしオンプレ環境を対象としたネットワークの設計の業務に携わっている者にとって、業務で触れる機会が殆ど無いツールだろう。
1台のソフトウェアルータを動作させるだけで精一杯な自宅のVirtualboxな検証環境からの脱却を図るべく、他の手段を調べていると、Docker環境では複数台のコンテナを同時に立ち上げられる事と、コンテナ同士で通信が可能である事が分かった。
VMware Playerでも複数台の仮想ルータ/スイッチを同時に立ち上げられる事は知っていたが、Dockerでも同じような事が出来るのであれば、VMware PlayerやVirtualboxからDockerへの移行を計画しよう、ついでにDockerの勉強も開始しよう...という事で、Dockerの手始めとしてArista Networksのソフトウェアルータ、cEOS-labのコンテナを作成してみた。
今回は、Docker DesktopにArista Networksのソフトウェアルータ、cEOS-labのコンテナを3台作成し、各コンテナ間でOSPFネイバを張ってみた時のメモ。



Docker Desktopとは
Docker Desktopとは、MacOSおよびWindows環境にてDocker EngineやKubernetes等が簡単に実行可能な環境。



当方の環境
ホストOS:Windows10 Pro 64bit版 / RAM: 8GB / CPU: Intel Core i5 M460 2.53GHz
コンテナ:Arista Networks cEOS 4.24.2.1F 64bit版
Docker:Docker Desktop for Windows:2.3.0.4



Docker Desktop for Windowsのインストール
Docker Desktop for Windowsを初めてインストールする際、Hyper-Vの有効化とWindows PowerShellのインストールが必要となる。
自分の環境ではWindows PowerShell 1.0が既にインストール済みだったが、最新版を改めてインストールした。
インストールの前に、Hyper-Vを有効化。
スタートボタンからWindowsシステムツールに入り、コントロールパネルを選択。プログラム→Windowsの機能の有効化または無効化→Hyper-Vの順に移り、Hyper-Vにチェックを入れてOKをクリック。設定内容をシステムに反映させる為、Windows10を再起動させる。


次は、Windows PowerShellのインストール。
以下からプレビュー版のv7.1.0-preview.6ではなく、v7.0.3のインストーラ(PowerShell-7.0.3-win-x64.msi)をダウンロードし、インストール。
https://github.com/PowerShell/PowerShell/releases


Windows PowerShellのインストールの次は、Docker Desktop for Windowsのインストール。
以下のリンク先にてDocker Desktop欄内のDownload for Windowsをクリックし、インストーラーのファイルをダウンロード。
ダウンロード後はインストーラー(自分の環境では、Docker Desktop Installer.exe)を叩いてインストール開始。
https://www.docker.com/get-started



Arista cEOSの準備
Arista Networksのダウンロードサイトにアクセスし、cEOS-labを選択。
バージョンは、現段階では最新のEOS-4.24.2.1Fを選択。cEOS64-lab-4.24.2.1F.tar.xzファイルをダウンロードした。
手順は、ダウンロードサイト内に有るcEOS-lab-README-generic.txtを参考にした為、cEOS-lab-README-generic.txtもダウンロードした。



Docker Desktop for Windowsの設定
自分の環境では、デフォルト設定ではcEOSを複数台立ち上げるとエラーが頻発し、cEOS-labのCLIに入る事が出来なかった。
以下に設定変更する事で、3台のcEOS-labを立ち上げてOSPFのネイバを張る事に成功した。

Dockerのアイコンを右クリックし、Dashboardを選択。※Windows10の場合、タスクバー内の小さなアイコン。
Docker Desktopのウインドウ内右上の歯車のようなアイコンをクリックし、Resourcesを選択。
・ADVANCEDにてCPUsを2に修正、Memoryを2.25GBに修正。
・動作には関係しないと思うが、Disk image locationをアクセスし易いフォルダに修正。
・設定を終えたらDocker Desktopのウインドウ内右下の「Apply & Restart」をクリックし、設定内容を反映させる。ここでDocker Desktopは再起動する。



いよいよ、cEOS-labのインポート
Googleで検索すると幾つかのサイトがヒットする。
検索で引っかかったサイトに書かれている内容を実行したものの、自分の環境ではcEOS-labを立ち上げる事が出来なかった。
Arista cEOSのダウンロードサイトに有る「cEOS-lab-README-generic.txt」の内容と下記リンク先に記載したブログの内容を合わせた感じで実行した結果、cEOS-labを立ち上げる事が出来た。
今回は3台のcEOS-labでOSPF構成を組む為、cEOS-lab-README-generic.txtの内容を少し内容を修正している。



以下より、Windows PowerShellにて実行。
1.以下のコマンドを打ち、ダウンロードしたcEOS-labのファイル(イメージ)をインポート。
今回は3台のcEOS-labをインポートする為、イメージの名称(ceosimage)が重複しないよう番号を降った。

>docker import cEOS64-lab-4.24.2.1F.tar ceosimage:4.24.2.1F_1
>docker import cEOS64-lab-4.24.2.1F.tar ceosimage:4.24.2.1F_2
>docker import cEOS64-lab-4.24.2.1F.tar ceosimage:4.24.2.1F_3


2.以下のコマンドを打ち、cEOS-labコンテナの生成。
今回は初Dockerにつき細かな設定は行わず、インスタンス名およびイメージ名以外はcEOS-lab-README-generic.txtの内容をそのまま拝借。
よって長いオプションとその意味は何であるか考慮無しに、コマンドを投入している。

>docker create --name=cEOS-lab-4.24.2.1F_1 --privileged -e INTFTYPE=eth -e ETBA=1 -e SKIP_ZEROTOUCH_BARRIER_IN_SYSDBINIT=1 -e CEOS=1 -e EOS_PLATFORM=ceoslab -e container=docker -i -t ceosimage:4.24.2.1F_1 /sbin/init systemd.setenv=INTFTYPE=eth systemd.setenv=ETBA=1 systemd.setenv=SKIP_ZEROTOUCH_BARRIER_IN_SYSDBINIT=1 systemd.setenv=CEOS=1 systemd.setenv=EOS_PLATFORM=ceoslab systemd.setenv=container=docker
>docker create --name=cEOS-lab-4.24.2.1F_2 --privileged -e INTFTYPE=eth -e ETBA=1 -e SKIP_ZEROTOUCH_BARRIER_IN_SYSDBINIT=1 -e CEOS=1 -e EOS_PLATFORM=ceoslab -e container=docker -i -t ceosimage:4.24.2.1F_2 /sbin/init systemd.setenv=INTFTYPE=eth systemd.setenv=ETBA=1 systemd.setenv=SKIP_ZEROTOUCH_BARRIER_IN_SYSDBINIT=1 systemd.setenv=CEOS=1 systemd.setenv=EOS_PLATFORM=ceoslab systemd.setenv=container=docker
>docker create --name=cEOS-lab-4.24.2.1F_3 --privileged -e INTFTYPE=eth -e ETBA=1 -e SKIP_ZEROTOUCH_BARRIER_IN_SYSDBINIT=1 -e CEOS=1 -e EOS_PLATFORM=ceoslab -e container=docker -i -t ceosimage:4.24.2.1F_3 /sbin/init systemd.setenv=INTFTYPE=eth systemd.setenv=ETBA=1 systemd.setenv=SKIP_ZEROTOUCH_BARRIER_IN_SYSDBINIT=1 systemd.setenv=CEOS=1 systemd.setenv=EOS_PLATFORM=ceoslab systemd.setenv=container=docker


3.Docker内部で使用するネットワークの作成。
Googleでコンテナ間の通信に関して検索すると幾つかの方法が見つかったが、今回は一番簡単な方法で。
自分の環境では、--subnetオプションでネットワークアドレスを指定したら各コンテナ間で通信が可能になった。

>docker network create --subnet 192.168.185.32/28 --attachable net1
>docker network create --subnet 192.168.202.0/24 --attachable net2
>docker network create --subnet 192.168.203.0/24 --attachable net3
>docker network create --subnet 192.168.204.0/24 --attachable net4


4.上記3にて作成したネットワークを、cEOS-labコンテナに適用。

>docker network connect net1 cEOS-lab-4.24.2.1F_1
>docker network connect net2 cEOS-lab-4.24.2.1F_1
>docker network connect net3 cEOS-lab-4.24.2.1F_1
>docker network connect net4 cEOS-lab-4.24.2.1F_1

>docker network connect net1 cEOS-lab-4.24.2.1F_2
>docker network connect net2 cEOS-lab-4.24.2.1F_2
>docker network connect net3 cEOS-lab-4.24.2.1F_2
>docker network connect net4 cEOS-lab-4.24.2.1F_2

>docker network connect net1 cEOS-lab-4.24.2.1F_3
>docker network connect net2 cEOS-lab-4.24.2.1F_3
>docker network connect net3 cEOS-lab-4.24.2.1F_3
>docker network connect net4 cEOS-lab-4.24.2.1F_3


5.cEOS-labコンテナの起動。
以下のコマンド3つを一度に流すのではなく、1台づつコンテナを立ち上げると各コンテナ共に正常に起動完了する。

>docker start cEOS-lab-4.24.2.1F_1
>docker start cEOS-lab-4.24.2.1F_2
>docker start cEOS-lab-4.24.2.1F_3


6.cEOS-labに入る
cEOS-labコンテナの状態は、以下のコマンドで確認出来る。
オプション--format='{{.State.Status}}'無しの場合、出力内容が多くなりrunningの文字列を見つけ辛い。

>docker inspect --format='{{.State.Status}}' cEOS-lab-4.24.2.1F_1
running

出力内容がrunningであれば起動完了。以下のコマンドを打つとArista cEOSのCLIにアクセスする。

>docker exec -it cEOS-lab-4.24.2.1F_1 Cli


cEOSの設定
OSPFおよびVRRPの設定コマンドはCisco IOSと酷似している為、ここでは割愛。
酷似といったレベルではなくほぼ同じな上、通信プロトコルはベンダ独自規格な実装でない限り動作はほぼ同じと思われる為、そう言えばあのコマンド何だっけ?という場面でcEOSは確認用として使えそう。
以下の図は、今回の検証で組んだ構成を表す。


設定の結果、Docker内部のネットワーク設定を各コンテナに適用させる事により、3つのcEOS-labの間でOSPFのネイバを張る事と、2台のcEO-labS(RT#1,RT#2)の間でVRRP構成を組む事が出来た。
show ip ospf neighborsコマンドはエラーを吐いて出力出来なかったが、show ip ospf neighbors summaryでは認識出来ていた。

jpmtkdkrt01#
jpmtkdkrt01#show ip ospf neighbor
Neighbor ID     Instance VRF      Pri State                  Dead Time   Address         Interface

% Internal error
% To see the details of this error, run the command 'show error 1'
jpmtkdkrt01#
jpmtkdkrt01#
jpmtkdkrt01#show ip ospf neighbor summary
OSPF router with (Instance ID 11) (VRF default)
      0 neighbors are in state DOWN
      0 neighbors are in state GRACEFUL RESTART
      0 neighbors are in state INIT
      0 neighbors are in state LOADING
      0 neighbors are in state ATTEMPT
      1 neighbors are in state FULL
      0 neighbors are in state EXCHANGE
      0 neighbors are in state 2 WAYS
      0 neighbors are in state EXCH START
jpmtkdkrt01#
jpmtkdkrt98#show ip ospf neighbor
Neighbor ID     Instance VRF      Pri State                  Dead Time   Address         Interface

% Internal error
% To see the details of this error, run the command 'show error 0'
jpmtkdkrt98#
jpmtkdkrt98#
jpmtkdkrt98#show ip ospf neighbor summary
OSPF router with (Instance ID 11) (VRF default)
      0 neighbors are in state DOWN
      0 neighbors are in state GRACEFUL RESTART
      0 neighbors are in state INIT
      0 neighbors are in state LOADING
      0 neighbors are in state ATTEMPT
      2 neighbors are in state FULL
      0 neighbors are in state EXCHANGE
      0 neighbors are in state 2 WAYS
      0 neighbors are in state EXCH START
jpmtkdkrt98#
jpmtkdkrt99#show ip ospf neighbor
Neighbor ID     Instance VRF      Pri State                  Dead Time   Address         Interface

% Internal error
% To see the details of this error, run the command 'show error 0'
jpmtkdkrt99#
jpmtkdkrt99#
jpmtkdkrt99#show ip ospf neighbor summary
OSPF router with (Instance ID 11) (VRF default)
      0 neighbors are in state DOWN
      0 neighbors are in state GRACEFUL RESTART
      0 neighbors are in state INIT
      0 neighbors are in state LOADING
      0 neighbors are in state ATTEMPT
      1 neighbors are in state FULL
      0 neighbors are in state EXCHANGE
      0 neighbors are in state 2 WAYS
      0 neighbors are in state EXCH START
jpmtkdkrt99#

VRRPは以下のとおり。
設定内容のとおり、RT#1(jpmtkdkrt98)はVRRP Master機、RT#2(jpmtkdkrt99)はVRRP Backup機になっていた。

jpmtkdkrt98#show vrrp brief
Interface VRF        ID  Ver Pri Time  State  Last Transition     VR IP Addresses
--------- ---------- --- --- --- ----- ------ ------------------- ---------------
Et4       default    11  2   105 3580  Master 00:02:27 ago        192.168.200.1
jpmtkdkrt98#
jpmtkdkrt98#
jpmtkdkrt99#show vrrp brief
Interface VRF        ID  Ver Pri Time  State  Last Transition     VR IP Addresses
--------- ---------- --- --- --- ----- ------ ------------------- ---------------
Et4       default    11  2   95  3620  Backup 00:02:00 ago        192.168.200.1
jpmtkdkrt99#
jpmtkdkrt99#


今回はcEOS-labをインポートし通信設定しただけで終えたが、DockerやDocker Desktopで何が出来るか、インポートの先は何か把握していない。
MirageOS Unikernelとの絡みもあまり理解していない。この先は参考書を買って少しづつ勉強を進めたい。
また、Dockerで検証環境がある程度のレベルまで組めそうな事は分かった。cEOS-labのもう少し古いバージョンと、Docker DesktopのResourcesの設定次第では4~5台の構成を組めそうな気がした。





リンク先
cEOS-labのインポートにおいて非常に参考になったのは、cEOSのダウンロードサイトに有るcEOS-lab-README-generic.txtの記載内容と、akira6592様のブログの記事。
AristaのvEOSやcEOSを知ったのは、CiscoからAristaに移籍した某先生のJANOGのプログラム内容にて。

https://www.docker.com/ Docker
https://docs.docker.com/ Dockerのドキュメントサイト
https://www.arista.com/en/ Arista Networks
https://www.arista.com/jp/support/software-download cEOSのダウンロードサイト有り
https://tekunabe.hatenablog.jp/entry/2018/12/17/arista_cEOS-lab_one Arista EOS の検証用コンテナ版「cEOS-lab」の環境構築手順(1台編)
https://www.janog.gr.jp/meeting/janog43/application/files/5015/4800/2310/janog43-shtsuchi-lxc-00.pdf ネットワークの上のコンテナネットワーク