Docker 上でGUIの使える仮想環境を建てようとしたら失敗した
はい、結論からいうと失敗しました。今からなんで失敗したか書いていく。
なんでやろうと思ったか
Docker触ってて「これ X window system 使ってタイル型ウィンドウマネージャー作ったりできるのかな」とか
「OSのアップデートとか起動時に全部やっとけばめんどうなアップデートやらずに済むし VMより速いだろうし使いやすそう」
みたいな軽い気持ちでやったら沼にはまった。
というわけで下になにしてったか書いていきます。
下調べ
同じこと考えてる人なんていっぱいいるでしょ、と思い色々調べてみた。
結果としては以下の記事があった。
https://kunst1080.hatenablog.com/entry/2018/03/18/225102
この人まんま自分のやりたいことやってるなーとおもったので、記事に乗っていたスライド資料などを観て
どうやればできるか色々調べてみた。
まず、スライドのなかで語られていた地雷は
筆者は
- メモリの共有
- ホストの /run/systemd をマウント
- ホストの /run/dbus をマウント
をすることで解決していた。
ちなみに自分はここを全く読まずに始めたのでひどい目に合いました。ちーん
以下の試したこと
で失敗した内容も含めて書いていく。
試したこと
自分は上記の筆者と同じく、ホストOS は Ubuntu を使用している。バージョンは 18.04
やりたかったことは
docker で ArchLinux を起動して 好みの タイル型ウィンドウマネージャーを使用してコーディングなどを行う
だったので、まずは ArchLinux のベースイメージを利用して X window system を立ち上げてみるところから始める
とりあえずコンテナ立ててアップデート
$ docker pull archlinux/base $ docker run -it archlinux/base [root@073c1c0f6b42 /]# pacman -Syu --noconfirm
まず startx 起動するのを目標に ArchLinux wiki を参考にインストール
https://wiki.archlinux.jp/index.php/Xorg
[root@073c1c0f6b42 /]# pacman -S xorg-server ~~~省略~~~ :: Running post-transaction hooks... (1/4) Cleaning up package cache... (2/4) Reloading system manager configuration... Skipped: Current root is not booted. (3/4) Reloading device manager configuration... Skipped: Device manager is not running. (4/4) Arming ConditionNeedsUpdate...
インストールした時点でエラーが出たのでここで困った。というわけで調べた
(2/4) Reloading system manager configuration... Skipped: Current root is not booted. (3/4) Reloading device manager configuration... Skipped: Device manager is not running.
これについては下記に同じようなことをしている人がいたので参考にした
https://www.reddit.com/r/archlinux/comments/84zg2g/pacstrap_error_some_one_can_help_deal_with_this/
記事によると pacstrap を使って base をインストールしろとのこと
この記事書いてる最中に気づいたので見なかったことにした
ここからはこの記事を書く前に色々調べた内容を書いていく
そもそもコンテナってなんなん?
自分がコンテナを理解していないことに気づいたため色々しらべてみた。
そもそも動作の仕組みをちゃんと見直そう、ということで以下のサイトを参照した
https://www.docker.com/resources/what-container
https://knowledge.sakura.ad.jp/13265/
VMとの仕組みの違いを全然理解していなかったので勉強になった。コンテナってすごい(こなみかん)
試しに pstree
を実行してみる
ホストOSでの実行結果
$ pstree systemd─┬─Discord─┬─Discord───Discord───26*[{Discord}] │ ├─Discord───6*[{Discord}] │ └─29*[{Discord}] ├─ModemManager───2*[{ModemManager}] ├─NetworkManager─┬─dhclient │ └─2*[{NetworkManager}] ├─accounts-daemon───2*[{accounts-daemon}] ├─acpid ├─avahi-daemon───avahi-daemon ├─blkmapd ├─bluetoothd ├─boltd───2*[{boltd}] ├─chrome─┬─2*[cat] │ ├─chrome─┬─chrome─┬─25*[chrome───9*[{chrome}]] │ │ │ ├─3*[chrome───12*[{chrome}]] │ │ │ ├─8*[chrome───10*[{chrome}]] │ │ │ ├─4*[chrome───11*[{chrome}]] │ │ │ ├─2*[chrome───13*[{chrome}]] │ │ │ ├─chrome───14*[{chrome}] │ │ │ ├─chrome───5*[{chrome}] │ │ │ └─chrome───8*[{chrome}] │ │ └─nacl_helper │ ├─chrome───7*[{chrome}] │ ├─chrome───9*[{chrome}] │ └─37*[{chrome}] ├─colord───2*[{colord}] ├─cron
コンテナでの実行結果
[root@073c1c0f6b42 /]# pstree bash───pstree
ついでにたたいてみる
[root@073c1c0f6b42 /]##systemctl status System has not been booted with systemd as init system (PID 1). Can't operate. Failed to connect to bus: Host is down
ココらへんの仕組みもよくわからなかったのであとで調べる必要があるなと感じた。
とりあえず僕はここで挫折しました^q^
そもそもマウントしてるものって何?
/udev について
https://www.suse.com/ja-jp/documentation/sles11/singlehtml/book_sle_admin/cha.udev.html
/dbus について
https://qiita.com/byuu/items/c600366b9c138f639863
/run について
https://wiki.archlinux.jp/index.php/Arch%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E9%9A%8E%E5%B1%A4#.2Frun:.E4.B8.80.E6.99.82.E7.9A.84.E3.81.AA.E5.AE.9F.E8.A1.8C.E6.99.82.E3.83.87.E3.83.BC.E3.82.BF
これそもそもマウントしていいのかがわりと謎だった。これマウントしないでやる方法をそのうち探したい
最後に
最初に参照していたスライドにも dockerの知識よりもLinuxの知識を深める
とあったとおり
自分の理解の範疇を大きく超えていて、現在の知識では太刀打ちできないと思ったので一旦やめた
どっかのタイミングでリベンジしたい。
最後に言いたいのは
そもそもdocker の使い方としては間違いなのであんまり真似する必要はない
こんなことするよりVMで環境立てたほうが速い