Docker on Alpine Linux on VirtualBox

TikZ で作図したくて。

TeX Live を homebrew 🍺 でいれるのは時間かかりそうだし、環境汚くなりそうだし、なんだかなー。たぶん Docker 🐳 が楽なんだろうなー。

VirtualBox で適当な Linux 立ち上げて、その中でやろうかな。できたファイルはホスト側で確認すればいいんだから、どうせ GUI あってもしかたねーべ？　と Alpine Linux を選択。

今回は後述の通り若干問題点も出てきたが、せっかく使ったことないディストリビューションのインストール作業をしてみたので、備忘録がてらまとめてみた。

# Alpine Linux のインストール

## 準備

[Alpine Linux のダウンロードページ](https://alpinelinux.org/downloads/)からイメージをダウンロードします。

VirtualBox で仮想マシンを作成し、設定のストレージから仮想ドライブにダウンロードした iso イメージを選択します。

起動。

## インストール

root でログインします。

`setup-alpine` を実行して初期設定、インストールを行います。

```shell-session
setup-alpine
```

キーボードの設定。使っているものにあわせて設定します。ここでは `us` / `us-mac` 。

```
Available keyboard layouts:
af     be     cn     fi     hu     it     lk     mm     pl     sy     uz
al     bg     cz     fo     id     jp     lt     mt     pt     th     vn
am     br     de     fr     ie     ke     lv     my     ro     tj
ara    brai   dk     gb     il     kg     ma     ng     rs     tm
at     by     dz     ge     in     kr     md     nl     ru     tr
az     ca     ee     gh     iq     kz     me     no     se     tw
ba     ch     epo    gr     ir     la     mk     ph     si     ua
bd     cm     es     hr     is     latam  ml     pk     sk     us
Select keyboard layout [none]: us
Available variants: us-alt-intl us-altgr-intl us-chr us-colemak us-dvorak-alt-intl us-dvorak-classic us-dvorak-intl us-dvorak-l us-dvorak-r us-dvorak us-dvp us-euro us-hbs us-intl us-mac us-norman us-olpc2 us-rus us-workman-intl us-workman us 
Select variant []: us-mac
```

ホストネームの設定。

```
Enter system hostname (short form, e.g. 'foo') [localhost]: 
```

ネットワーク設定。アドレス固定がいい場合などは適宜設定。

```
Available interfaces are: eth0.
Enter '?' for help on bridges, bonding and vlans.
Which one do you want to initialize? (or '?' or 'done') [eth0] 
Ip address for eth0? (or 'dhcp', 'none', '?') [dhcp] 
Do you want to do any manual network configuration? [no] 
```

root のパスワードの設定。

```
Changing password for root
New password: 
Retype password: 
passwd: password for root changed by root
```

タイムゾーンは `Asia/Tokyo`。

```
Which timezone are you in? ('?' for list) [UTC] Asia/Tokyo
```

プロキシはなし。 NTP は chrony 。

```
HTTP/FTP proxy URL? (e.g. 'http://proxy:8080', or 'none') [none] 
Which NTP client to run? ('busybox', 'openntpd', 'chrony' or 'none') [chrony] 
```

リポジトリのサーバ。 `f` だと全ミラーの接続速度を計測して一番速いところが選択されます。

```
Available mirrors:
1) dl-cdn.alpinelinux.org
2) uk.alpinelinux.org
3) dl-2.alpinelinux.org
（略）
49) mirror.reenigne.net

r) Add random from the above list
f) Detect and add fastest mirror from above list
e) Edit /etc/apk/repositories with text editor

Enter mirror number (1-49) or URL to add (or r/f/e/done) [1]: f
```

sshd は openssh 。

```
Which SSH server? ('openssh', 'dropbear' or 'none') [openssh] 
```

インストール先として VirtualBox の仮想ディスクが割り当てられている `sda` を選択します。

```
Available disks are:
  sda	(8.6 GB ATA      VBOX HARDDISK   )
Which disk(s) would you like to use? (or '?' for help or 'none') [none] sda
How would you like to use it? ('sys', 'data', 'lvm' or '?' for help) [?] sys
```

最後に `y` を選択すると、選択したディスクの中身を消去し、 Alpine Linux がインストールされます。 `N` だとインストール作業は実行されません。

```
WARNING: Erase the above disk(s) and continue? [y/N]: y
```

一旦終了します。

```shell-session
poweroff
```

VirtualBox の設定より、仮想マシンの仮想ドライブから iso イメージを取り外しておきます。

## 環境を整える

### vim

```shell-session
apk add vim
```

### community リポジトリの追加

Docker などは community リポジトリにあるらしい。

```shell-session
vim /etc/apk/repositories
```

```
#/media/cdrom/apks
http://sjc.edge.kernel.org/alpine/v3.12/main
#http://sjc.edge.kernel.org/alpine/v3.12/community
#http://sjc.edge.kernel.org/alpine/edge/main
#http://sjc.edge.kernel.org/alpine/edge/community
#http://sjc.edge.kernel.org/alpine/edge/testing
```

となっているので、 community リポジトリを有効に。

```
http://sjc.edge.kernel.org/alpine/v3.12/community
```

```shell-session
apk update
apk upgrade
```

### Docker

```shell-session
apk add docker docker-compose
service docker start
rc-update add docker boot
```

## 便利に使うために
### VirtualBox の共有フォルダ

あらかじめ、設定で共有フォルダを指定しておきます。ここでは `vbox_shared` という名前で設定してあるとします。

```shell-session
apk add virtualbox-guest-additions virtualbox-guest-modules-virt
rc-update add virtualbox-guest-additions default
modprobe -a vboxsf
```

VirtualBox の共有フォルダの設定のところに自動マウントのチェックオプションがあるけど、うまく機能しない？　`/etc/fstab` を修正し、自動マウントするようにします。

```shell-session
mkdir -p /mnt/vbox_shared

vim /etc/fstab
```

```
vbox_shared /mnt/vbox_shared vboxsf defaults 0 0
```

## ユーザの追加

VirtualBox だし、ついつい root を使いがちですが、あんまりよくないので一般ユーザを追加します。

### sudo の許可

```shell-session
apk add sudo
visudo
```

```
# %wheel ALL=(ALL) ALL
```

を

```
%wheel ALL=(ALL) ALL
```

### ユーザの追加

```shell-session
adduser alpine
adduser alpine wheels
adduser alpine vboxsf
adduser alpine docker
```

### ssh ログイン

仮想コンソールなので、コピペがうまくできないためローカルマシンから ssh ログイン。

```shell-session
ssh alpine@xxx.xxx.xxx.xxx
```

## Docker で TeX Live

```shell-session
docker pull paperist/alpine-texlive-ja
```

docker グループに所属していてもパーミッションエラーがでる場合、いったんリブートかけてみる。

Docker コンテナ内のコマンドを直接使うには

```shell-session
docker run -v $(pwd):/workdir --rm paperist/alpine-texlive-ja:latest platex example.tex
```

めんどうなので、エイリアスを設定しておく。

```shell-session
alias platex='docker run -v $(pwd):/workdir --rm paperist/alpine-texlive-ja:latest platex'
```

Alpine Linux のシェルは ash 。エイリアスの設定などは `~/.profile` に記述すればよいようだ。

## 問題点
### 共有フォルダのパーミッションがうまく設定できない
alpine ユーザは vboxsf グループに所属しているが、 `/mnt/vbox_shared` に書き込めない。

ディレクトリの所有者を変えてみたり、 `/etc/fstab` で `uid` を指定してマウントしてみても、マウントされると `root` でマウントされてしまう。よくわからん。

### と、ここまで作業したあと、別に Alpine Linux じゃなくてもよかったんじゃね？

ふつうに Docker for Mac かデフォルトで GUI ありの Ubuntu / Fedora あたりで。

作業はコマンドラインベースがよいけど、 LaTeX (TikZ) だとどうしても都度コンパイルして結果を確認して修正。ってサイクルなので。

いや、共有フォルダへのアクセスがすんなりいけば別によかったんだけど。パスワードなしで `sudo` できるようにするか、 root で作業するか、諦めて他の環境使うか。

# 参考

* [VirtualBoxにAlpine Linuxをインストール | mebee](https://mebee.info/2019/11/06/post-2256/)
* [Alpineを仮想PCにインストール - Qiita](https://qiita.com/sg_5002_1914/items/624a6ecd6c588cf493d8)