はじめに
KUSANAGI Runs on Docker (以下、RoD) をリリースしてから、早いもので5年経ちました。それから、いくつものバグ修正や、新しいバージョンのnginxとphpへの対応などを行っています。
今ではdocker-machineの廃止や、新しいバージョンのDockerも出ており、RoDの環境を新規作成したときに問題が出ることもあります。そこで、現在のRoD環境の作成方法をまとめてみました。
Docker 環境の構築
基本的な動作環境はKUSANGI Runs on Dockerの使い方 のとおり、docker と docker-compose コマンドを使用します。
Linuxで環境構築したい場合は、Ubuntu 20.04 LTS以降のOSの使用をお勧めします。もちろん、Debianでも構いません。RHEL8/9 及びその互換OSでは、標準のPodmanおよび、podman-docker、podman-compose というDocker互換パッケージをインストールする必要があります。
Windows10/11 では、WSL(Windows SubSystem for Linux)で提供される、Ubuntuの使用をお勧めします。
Mac OS では、Docker Desktop for mac が必要となり、これで提供されるdocker および docker-compose を使用します。Lima などの仮想OSを使用する方法では、現在のところ動作しません。
docker/docker-compose の install
RoD では、Docker CE(Community Edition)の使用をお勧めします。Docker 公式のインストール手順でインストールしてください。Docker CEの最新版(2024年9月現在)は 27.2.0 となっています。 インストールしたDocker のバージョンは、以下のコマンドで表示されます。
$ docker version
Client: Docker Engine - Community
Version: 27.2.0
API version: 1.47
Go version: go1.21.13
Git commit: 3ab4256
Built: Tue Aug 27 14:15:13 2024
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 27.2.0
API version: 1.47 (minimum version 1.24)
Go version: go1.21.13
Git commit: 3ab5c7d
Built: Tue Aug 27 14:15:13 2024
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.7.21
GitCommit: 472731909fa34bd7bc9c087e4c27943f9835f111
runc:
Version: 1.1.13
GitCommit: v1.1.13-0-g58aa920
docker-init:
Version: 0.19.0
GitCommit: de40ad0
現在の docker-compose は、compose plugin と compose standalone の2種類が提供されます。plugin では、docker のサブコマンドとしてcompose が提供され、standaloneでは今までの docker-compose コマンドが提供されます。RoDでは、かならず standalone をインストールしてください。インストールした docker-compose のバージョンは、以下のコマンドで表示されます。
$ docker-compose version
Docker Compose version v2.29.2
RHEL 8/9 系では、Docker CE以外でも Podmanを使用できます。RoD で Podman を使用するには、podman と同時にDocker互換コマンドの podman-docker と、docker-compose の代替となるpodman-compose をdnf でインストールする必要があります。RoDでは docker-compose コマンドを使用するので、以下のコマンドを実行して symbolic linkを作成してください。
$ sudo ln -s podman-compose
podman および podman-compose のバージョンは、以下のコマンドで表示されます。
$ docker version
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
Client: Podman Engine
Version: 4.9.4-rhel
API Version: 4.9.4-rhel
Go Version: go1.21.11 (Red Hat 1.21.11-1.module_el8.10.0+3863+bb82df69)
Built: Wed Aug 14 01:37:27 2024
OS/Arch: linux/amd64
$ podman-compose version
podman-compose version
podman-compose version: 1.0.6
['podman', '--version', '']
using podman version: 4.9.4-rhel
podman-compose version 1.0.6
podman --version
podman version 4.9.4-rhel
Windos 10/11 では、WLS2 で Ubuntuなどをインストールしてください。そして、Windows 上の %PROFILE%\.wslconfig
か、WSL上の /etc/wsl.conf に以下の文を記述して、WSL2起動時に systemd を動作させるよう設定します。
[boot]
systemd=true
上記の設定後、ターミナル上から以下のコマンドを実行するとWSL2が停止するので、再度WSL2を起動してください。
# すべてのWSL2を停止
PS> wsl.exe --shutdown
# 指定したディストリビューションを停止
PS> wsl.exe -l -v
NAME STATE VERSION
* Ubuntu-22.04 Running 2
Ubuntu-24.04 Stopped 2
PS> wsl.exe -t Ubuntu-22.04
docker rootless の使用
最新の Docker CE には、ユーザ権限でDocker を起動させる、docker rootless という仕組みが提供されています。以前の Docker では、docker engine が 特権権限でのみ動作しました。一般ユーザでDockerを使用する際には、ユーザを docker グループに含めるなどの方法が必要でした。ただし、この方法ではDocker内のプロセスを特権権限で動作させることが可能です。そのため特権権限でのプロセス起動や、ホストOS側のUID/GIDと同じユーザIDでのプロセス起動を許すことになり、セキュリティ的に危険な状態でした。
docker rootlessを使用することで、docker engine を特定のユーザ権限で起動することが出き、docker 上のプロセスもOS上とは異なるUID/GIDを使用できます。このことから、今後は docker rootless を使用することをお勧めします。インストール方法は、docker rootless のドキュメントを参照ください。
最後に
現在のRoDは最新のdocker-compose バージョンにマッチしていなく、kusanagi-docker provision
時に作成した環境では、ワーニングが出力されます。このあたりは、RoDのバージョンアップで解決していく予定です。
また、廃止された docker-machine の代替機能、複数ノードを管理する docker swarm への対応、各種クラウドのマネージドコンテナサービスへの対応も検討中です。今後ともRoD をよろしくお願いします。