docker on debian on VirtualBox

# はじめに
Docker Desktopが有料化されるということを受けて、今般、改めてVirtualBoxにて環境を作ることにした。

したらば「Linuxにdocker入れました〜」って情報はたくさん出てくるんだけど、その前のOSを準備するところからの流れはなかなか見当たらなかったので、とりあえずメモに残すことにしてみた。

なお、本件に登場するソフトウェアなどのバージョンは以下の通り(2021/09/06時点)。

- macOS BigSur(11.5.2)
- VirtualBox：6.1.26
- debian 11.0.0
- docker 20.10.8
- docker-compose 1.29.2

# debian on VirtualBox 
LinuxのディストリビューションというとUbuntuが人気だけど、より安定性を重視しているということでdebianを選んでみた。今回、GUIを使うつもりはないので、ネットワークインストール版のISOを入手し、dockerを動かすのに必要最低限のもののみ導入する。

https://www.debian.org/CD/netinst/index.ja.html

VirtualBoxで立てるVMにはNICを２つ(NATとホストオンリーアダプタ)を実装するのが良いらしいので、それに従うことにする。NATはゲスト→インターネット、ホストオンリーアダプタはホスト～ゲスト間の接続を担う一方、インターネットからゲストへのアクセスはできなくなるので、セキュリティ上良いということらしい(これはdebianに限った話ではない)。

https://blog.proglus.jp/3315/

(1) netinstバージョンのisoをダウンロードする(300MBぐらいだった)
(2) VirtualBoxの仮想OSをセットアップする。仮想OSにはネットワークはデフォルトのNATと、もう１つホストオンリーアダプターを追加する。ホストオンリーアダプタのDHCPは無効にする。
(3) ダウンロードしたISOをセットしてVMを起動
(4) インストーラが立ち上がったら、install(上から２番目)を選択
(5) ネットワークのところでは2つのNICが表示される(enp0s3とenp0s8、前者がNAT、後者がホストオンリーアダプタ)。プライマリネットワークはenp0s3を選ぶ。
(6) 導入するパッケージでは、デスクトップ環境を外して、sshサーバと標準システムツールにチェックを入れる

# debianの準備
dockerを導入する前に、ちょこっとだけ準備が必要。

## 文字化け対応
日本語でインストールをすると、CUIは文字化けする場合があるようなので（実際文字化けした）、以下の対応をした。

(1) rootでログイン
(2) vi /etc/bash.bashrcし、以下の行を最後に追加する

```/etc/bash.bashrc
：
case $TERM in
    linux) LANG=C ;;
    *) LANG=ja_JP.UTF-8 ;;
esac
```

## ホストオンリーアダプタ側のインターフェースを有効にする
https://linuxhint.com/debian_etc_network_interfaces/

enp0s3はアクティブだが、もう１つのenp0s8がDOWNしている上にIPアドレスの設定をしていないので、以下の設定ファイルを編集して反映する

(1) /etc/network/interfaceに以下を追記する

```/etc/network/interface
：
(固定IPを設定)
auto enp0s8
iface enp0s8 inet static
address 192.168.56.11 <--- ホストオンリーアダプタのIP帯域(192.168.56.xxx)に合わせる
netmask 255.255.255.0
# gateway 192.168.56.1 <--- GWはenp0s3側になるので、こちらには設定しない

(参考：DHCPの場合はこうなる)
allow-hotplug enp0s8
iface enp0s8 inet dhcp
```

(2) OSリブート か systemctlでrestartをする
(3) リブート後、ip addrでenp0s8にIPが振られていることを確認
(4) ターミナルでゲストOSからインターネットへ、及びホストOSに対しpingを打ち、どちらも応答が帰ってくることを確認する
(5) ホストOSからゲストOSにsshでログインできることも確認する

```
root@debian-vm:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:73:74:12 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3
       valid_lft 84786sec preferred_lft 84786sec
    inet6 fe80::a00:27ff:fe73:7412/64 scope link 
       valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:29:0f:1a brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.11/24 brd 192.168.56.255 scope global enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe29:f1a/64 scope link 
       valid_lft forever preferred_lft forever
root@debian-vm:~# 
```

## sudo
https://www.server-world.info/query?os=Debian_10&p=initial_conf&f=7

(1) rootでログイン
(2) apt-get install sudo
(3) visudo を実行するとエディタが開く
(4) 最終行にsudoを許容するユーザ(hogehoge)の情報を追加して、C-xで保存する。本当なら実行を許容するコマンドを絞り込んだりするのだろうが、ひとまずオールOKで進める。

```
hogehoge ALL=(ALL:ALL) ALL   #全コマンドを許容する場合
```

(5) rootはログオフし、sudoを許容設定したユーザでログインする
(6) sudo xxxを実行してエラーにならなければＯＫ

## docker導入前のリソース使用量
ここまでの作業でHDD、メモリの使用量を見たらこんなだった。dockerを動かしたら、どのくらい消費するのだろうか？

```
root@debian-vm:~# df -k
ファイルシス   1K-ブロック    使用   使用可 使用% マウント位置
udev               1513560       0  1513560    0% /dev
tmpfs               305968     524   305444    1% /run
/dev/sda1         50303512 1175092 46540672    3% /
tmpfs              1529840       0  1529840    0% /dev/shm
tmpfs                 5120       0     5120    0% /run/lock
tmpfs               305968       0   305968    0% /run/user/1000
root@debian-vm:~# free -m
               total        used        free      shared  buff/cache   available
Mem:            2987          75        2674           0         237        2771
Swap:            974           0         974
root@debian-vm:~#
```

#  docker導入
debianにdockerを導入する。

## dockerをインストールする
https://docs.docker.com/engine/install/debian/

公式の手順に沿って進めればいいので、難しいことはない。

(1) dockerに必要なアプリ、ライブラリを導入

```
$ sudo apt-get update
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
```

(2) GPGキーを作成

```
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
```

(3) aptのリストにdockerを追加

```
$ echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

(4) aptでdockerをインストール・確認

```
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
:
:
$ docker --version
Docker version 20.10.8, build 3967b7d
$
```

(5) OSリブート後にdockerが起動していなかったら、以下のコマンドを実行する

```
$ sudo systemctl enabled docker
$ sudo systemctl restart docker
``` 

## docker-composeをインストールする
https://docs.docker.com/compose/install/

こちらも公式の手順に沿って進めればよいので、難しくない

```
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ which docker-compose
/usr/local/bin/docker-compose
$ docker-compose --version
docker-compose version 1.29.2, build 5becea4c
$
```

## docker導入後のリソース使用量
docker、docker-composeをインストールし、dockerが起動している状態でのリソース使用量はこんな感じ。環境によって色々だと思うので参考まで。

```
root@debian-vm:~# df -k
ファイルシス   1K-ブロック    使用   使用可 使用% マウント位置
udev               1513560       0  1513560    0% /dev
tmpfs               305968     540   305428    1% /run
/dev/sda1         50303512 1755992 45959772    4% /
tmpfs              1529840       0  1529840    0% /dev/shm
tmpfs                 5120       0     5120    0% /run/lock
tmpfs               305968       0   305968    0% /run/user/1000
root@debian-vm:~# free -m
               total        used        free      shared  buff/cache   available
Mem:            2987         144        2586           0         257        2705
Swap:            974           0         974
root@debian-vm:~# 
```

## 終わりに
rootlessとかまだやるべきことはありそうだが、実験用だし、ひとまずpullしてrunできるようになったのでここでひと区切り。