何をしたいか
手持ちのMacBookでVerilogの勉強をしたいので、まずはその環境を作りたい。RTLシミュレータとして、XilinxのVivadoを使用したいが、Windows用とLinux用しか用意されていない。mac環境でやろうとすると、VMwareだったりVirtualBoxでLinux仮想マシンを立ち上げて、その中でvivadoを動かすということが考えられる。しかし、とはいうもののこれはマシンリソースをだいぶ食うので避けたい(昔、VirtualBox+CentOSで作ってみたことがあるが、発熱と電池消耗がハンパなかった)。
ということで、今回は勉強も兼ねてDockerで構築してみたいと思う。
環境
- MacBook Air (M1, 2020)
- MacOS BigSur 11.2.3
DockerDesktop for Macのインストールとhello-worldの実行
公式サイトにmac用のバイナリが公開されている。それどころかIntel版とApple版の2種類が用意されている!せっかくなのでAppleシリコン版を選択。
hello-worldイメージをダウンロードして、コンテナ実行できることを確認。
% docker container run hello-world
"Hello from Docker!"メッセージが表示されるまでの流れが示されていて、
- DockerHubからhello-worldイメージを取得(pull)してきて、
- このイメージから新規コンテナを作成・実行して、
- このメッセージを生成して、ターミナルに送信した
ということらしい。コマンドで明示的に与えたのは2だけだが、ローカルのイメージファイルを検索して、なければDockerHubからイメージを取得してきてきてくれる。
ubuntuイメージの確認
これまでcentos派だったのだが、昨今の動向もあり今回はubuntuで進めてみる。DockerHubのイメージもubuntuベースのものが多いようにも思える。
お試しでhello-worldに記載のあった方法でubuntuコンテナを起動して、xを飛ばすところまでを確認してみる。
hello-worldの実行とは異なり、作成後のコンテナを操作するために"-it"オプションを指定する。ホスト名が211966417e8bでrootでログインしているようだ。
% docker run -it ubuntu bash
root@211966417e8b:/#
さらにパッケージのアップデートとx11パッケージのインストールを行う
root@211966417e8b:/# apt-get update
root@211966417e8b:/# apt-get install -y x11-apps
root@211966417e8b:/# xeyes &
[1] 648
root@211966417e8b:/# Error: Can't open display:
[1]+ Exit 1 xeyes
最近のMacはX11を同梱してなくて、Xquartzを追加でインストールする必要があるとか。
xを動かすまで
結構苦戦したので、別章で。
XQuartzの環境設定
XQuartzをインストールして、Preference→Securityで
- "Authenticate connections"
- "Allow connections from network clients"
にチェックを入れて、XQuartzを再起動。
hostのIPアドレスの確認
ubuntu側で設定するDISPLAY変数用にホストのIPアドレスを取得しておく。今回の場合、ホスト=macのこと。ipconfig getifaddr en0
の結果を使用する。
コンテナの再起動
-eオプションでDISPLAY変数の値を渡し、-vオプションで.Xauthorityをubuntu側にマウントする。
% docker run -e DISPLAY="<IPaddr>:0" -v ~/.Xauthority:/root/.Xauthority -it ubuntu bash
こうして起動したコンテナに対して、再度
root@c5f2445da776:/# apt-get update
root@c5f2445da776:/# apt-get install -y x11-apps
root@c5f2445da776:/# eyes &
無事目玉が表示されたのでOK。
XQuartzの設定
ところでXQuartzを起動するとxtermが自動起動されてしまう。こちらは使用しないので、以下の手順で自動起動しないようにする。
#いくつかのサイトを参照したがうまくいかず、どうやらパスが変わったらしい
# 元の設定を確認
% defaults read org.xquartz.X11
{
"NSWindow Frame x11_prefs" = "372 447 484 336 0 0 1680 1025 ";
SUHasLaunchedBefore = 1;
SULastCheckTime = "2021-05-16 11:36:30 +0000";
"app_to_run" = "/opt/X11/bin/xterm";
"apps_menu" = (
(
Terminal,
xterm,
n
),
(
xman,
xman,
""
),
(
xlogo,
xlogo,
""
)
);
"cache_fonts" = 1;
"done_xinit_check" = 1;
"enable_iglx" = 0;
"login_shell" = "/bin/sh";
"no_auth" = 0;
"nolisten_tcp" = 0;
"startx_script" = "/opt/X11/bin/startx -- /opt/X11/bin/Xquartz";
}
# 起動時に実行するアプリを空にする
% defaults write org.xquartz.X11 app_to_run ""
# 設定が反映されていることを確認
% defaults read org.xquartz.X11
{
"NSWindow Frame x11_prefs" = "372 447 484 336 0 0 1680 1025 ";
SUHasLaunchedBefore = 1;
SULastCheckTime = "2021-05-16 11:36:30 +0000";
"app_to_run" = "";
"apps_menu" = (
(
Terminal,
xterm,
n
),
(
xman,
xman,
""
),
(
xlogo,
xlogo,
""
)
);
"cache_fonts" = 1;
"done_xinit_check" = 1;
"enable_iglx" = 0;
"login_shell" = "/bin/sh";
"no_auth" = 0;
"nolisten_tcp" = 0;
"startx_script" = "/opt/X11/bin/startx -- /opt/X11/bin/Xquartz";
}
これでXQuartzを起動しても、不要なxtermは実行されなくなった。
停止させたコンテナの破棄
最初のhello-worldコンテナだったり、ubuntuコンテナをexitで抜けた後、これらのコンテナは「停止」状態になっている。明示的に破棄しない限りストレージ領域を食い潰すので、以下のコマンドで破棄する。
# コンテナを確認。statusは全てexitedになっている
% docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9c8d40b83710 ubuntu "bash" 6 minutes ago Exited (127) 4 minutes ago compassionate_pike
c5f2445da776 ubuntu "bash" 3 hours ago Exited (129) About an hour ago elated_rosalind
5eeb98e95524 ubuntu "bash" 3 hours ago Exited (0) 3 hours ago vigorous_carson
00945096ebc4 ubuntu "bash" 3 hours ago Exited (0) 3 hours ago practical_feistel
1a7cf61e2203 ubuntu "bash" 3 hours ago Exited (1) 3 hours ago youthful_galileo
f07cd430c93f ubuntu "bash" 3 hours ago Exited (100) 3 hours ago flamboyant_gauss
00797699839d ubuntu "bash" 3 hours ago Exited (0) 3 hours ago mystifying_haibt
8c43d7de8a61 ubuntu "bash -v /Users/kamu…" 3 hours ago Exited (127) 3 hours ago pensive_driscoll
d9dd49abc9a2 ubuntu "bash -e DISPLAY=loc…" 3 hours ago Exited (1) 3 hours ago sad_haslett
c87d6fa7033f ubuntu "bash" 3 hours ago Exited (127) 3 hours ago dazzling_dirac
211966417e8b ubuntu "bash" 3 hours ago Exited (129) 3 hours ago happy_kilby
25894b2736b4 ubuntu "bash" 4 hours ago Exited (127) 3 hours ago dreamy_pike
1638b28b41bb hello-world "/hello" 4 hours ago Exited (0) 4 hours ago sharp_proskuriakova
# 停止中のコンテナをまとめて破棄する
% docker container prune -f
Deleted Containers:
9c8d40b83710131bb740b5ff1d47d967cbcd2630f7a3b847c85ff10239542353
c5f2445da776b9cd35b9f0e0a5ee3d2a333d27c3e6ac6d5cd8cce7151ea5e9db
5eeb98e955246b72bfc8867dbd7ac544b10b70650a664b18f5e15e4175aa751d
00945096ebc44d0c5cd0c7ef6a729db2a341f357effb88657a23659348c51627
1a7cf61e220322cff6716ee5281d52040e161a9bc9b753311c6ec6a48d45de95
f07cd430c93f8509273fe33e0dc66343d1cbd18211e0fed0dabc75005a977b5f
00797699839d80c0884efe35b957b1df4d4417d56cab044d30215b53db168990
8c43d7de8a6128a8304cf1d34f761a9327d3244a64fad267d7fb023665452c95
d9dd49abc9a29a8b1e083581c658ed92bdf173ce58977f4afc96ced2a2d7bab4
c87d6fa7033f9e547f23c64c13e24e713f5d1a407e8aa8d7631b99fbb081ef16
211966417e8bcb48dac2dd165ad2ed0693d3facd381c2df1f5f84e4eda1c82b2
25894b2736b441195b712c2e4688b8ce0a5f22e5e834b162cdec8b4c11d231ac
1638b28b41bbb9b29d5dfd2fb347bd2ace7c7f8dcbbad0c948eb1fb63282119e
Total reclaimed space: 507.7MB
# 削除されていることを確認
% docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
四苦八苦してubuntuコンテナをたくさん作ったが、それでも507MB。かなり軽い(何もパッケージ入ってないけど)。
ひとまずここまで。もう少しdockerを掘り下げて、Dockerfileの作成を行いたい。