WSL2+DockerでWindows10 homeにROS環境を構築
お題「#おうち時間」
今回は新しいPCで高スペック環境を得たので以前研究室で作っていたDocker環境を使えるようにしました。
セットアップから動作までとてもスムーズにできたので、紹介します。
WSL2のセットアップ
WSL2とは・・・WindowsでUbuntuを実行することのできるアプリケーションです (かなり雑な紹介です)
WSL2の特徴
- wsl1で使えなかったnmapやtcpdumpが動くようになってる。
- wsl2にするとwsl1が使えなくなるわけではなく、上で動かすOSごとに選べる。例えばkali-linuxはwsl1で動かし、ubuntu-18.04はwsl2で動かすといったことができる。
- もともとwsl1で入れていたubuntuをwslコマンドでwsl2に変換するといったことができる。
- wsl1ではwindowsで実行されているため、linux側から見たipアドレスは、windows側のipアドレスと共有されていたが、wsl2はvm上で動き、ネットワークコンポーネントも仮想化されているため、windowsホストと異なるIPアドレスが割り当てられる。
- これまではwindows10でhyper-vを有効化するにはwindows10 ProやEnterpriseでなければ不可能だったが、Homeでもこのwsl2用のhyper-vベースの仮想化技術が利用できるようになった。そのかわりに、Hyper-vが使用されている場合、VMWareやVirtualBox6以前のバージョンが実行できない。
- 仮想化になったため、起動が遅くなっただろうと推測しがちだが、むしろ早くなっている。
WSLをインストールする
以下のサイトに従えばできるかと思います。
Windows Subsystem for Linux (WSL) を Windows 10 にインストールする | Microsoft Docs
1. WSLの有効化
windows terminal または PowerShell 上で以下のコマンドを入力する。windows terminalをインストールしていない方は、Windowsボタンを押すか、検索からPowershellを起動してください。
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
2. Microsoft StoreからUbuntuをインストール
Ubuntuと検索すると、18.04 (現在は20.04も出ているようです)や何も書いていないものがあると思います。ただのUbuntuだとUbuntuの最新バージョンが入るらしいのですが、新しいバージョンになるたびに更新され、内部の紐付いていたパスがおかしくなってしまう可能性があるので、バージョンを指定して入れたほうがいいかと思います。
WSL2に更新する
1. Ubuntuの起動
Windowsボタンを押すか、検索からUbuntuを起動してください。
ここで、ユーザ名とパスワードを設定します。
2. WSLのバージョン確認
Powershell上で以下のコマンドを実行することでWSLのバージョンが確認できます。おそらくWSL1だと思いますが、WSL2だった場合、以下を実行する必要はありません。
wsl --list --verbose
3. WSL2に更新
Powershell上で以下のコマンドを実行することでWSL2に更新することができます。
wsl --set-default-version 2
Dockerのインストール
Ubuntu上で順次以下のコマンドを実行することでインストールできます。
パッケージのインストール
sudo apt install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
GPGキー追加
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
キーの確認
sudo apt-key fingerprint 0EBFCD88
リポジトリの設定
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
リポジトリの更新
sudo apt update
Dockerのインストール
sudo apt install docker-ce docker-ce-cli containerd.io
Dockerデーモンの起動 (もしかしたらこれはその都度やらなければいけないかもしれないです)
sudo service docker start
Dockerの特徴
- 処理が速い
- VM毎にCPUやメモリやストレージなどを割り当てるような処理が必要がなくオーバヘッドが少ないから
- ゲストOSが無いため消費するリソースが少ないから
- ゲストOSが無いためアプリケーションまでのパケット転送処理(コンテキストスイッチなど)が少ないから
- 起動が速い
- ゲストOSを立ち上げるわけではないから
- 可搬性が高い
- Dockerエンジンさえあれば基本どこでも動く。他の仮想化は足回りとかもうちょっと苦労する。
- Dockerfileやdocker-compose.ymlによるインフラのコード化
- イメージが軽い
- Dockerイメージはレイヤで管理しているから
- Dockerイメージを簡単に共有できる仕組みが整っている
- 特に、公式Dockerイメージが用意されている場合(JenkinsやWordPressなど)はデプロイがめちゃ楽
- ECRなどプロジェクトに閉じているかつフルマネージドな環境が整っている
ROS環境イメージを動かす
今回は以下のサイトを参考にrosを動かします。
以下のコマンドを入力することでDockerコンテナを起動することができます。
sudo docker run -it --rm -p 6080:80 mtakeshi1222/ros_gui
以下にアクセスすることでGUIを確認することができます。
ここで、roscoreやgazeboなどを起動できることが確認できると思います。
参考文献
- https://www.geekfeed.co.jp/geekblog/wsl2-with-windows10-insider-preview-build
- https://docs.microsoft.com/ja-jp/windows/wsl/install-win10
- https://qiita.com/ymasaoka/items/83a39b9279ac2eb94b6b
- https://qiita.com/1222_takeshi/items/5214e86f58b7db3b93e1