はじめに
こんにちは、サイオステクノロジーのエンジニア 中島です。
昨今でコンテナ開発といえば、Dockerと呼ばれるくらいDockerがかなりの市民権を得ることになりました。では、Docker以外は?と呼ばれるとPodmanが出てきます。Podmanを使用した方法について別のBlog記事などがありますので、本記事では、containerdを使用したコンテナ開発環境が作れるのか?をテーマに実施した内容を説明します。
containerdについて
まず、containerdについて簡単に触れます。containerdはContainer Runtime Interface(CRI)と呼ばれるソフトウェアの一つで、コンテナを動作させることに使用するソフトウェアのことです。ほかのCRIソフトウェアをあげるならば、CRI-OやDocker Engineなどがあります。
ここで、containerdの歴史をすこし説明するとこのソフトはDockerの一部でした。コンテナ技術の標準化の運動により、Docker内のコンテナランタイムの部分が分離したものが、containerdとなりました。
詳細は、公式サイトを確認してください。
コンテナ開発環境構築について
containerdを使用して開発するための補助ツールとしてnerdctlと呼ばれるコマンドラインツールがあります。ただし、コンテナを開発するためには、containerdやnerdctl以外に、BuildKitと呼ばれるコンテナをビルドするためのツールやContainer Network Interface(CNI)を実現するための各種プラグインの導入をすることで始めて開発環境が構築することができます。
図1 containerdを使用したコンテナ開発環境
実環境構築
コンテナ開発環境構築方法について、本記事はRootlessモードで構築する方法について説明します。まず、Rootlessモードとはその名の通りroot以外のユーザで起動することです。なぜこれを行うかというと、containerdやBuildKitを使用するためにデーモンを利用しているため通常の起動ではrootで立ち上がることや操作するためにいちいちrootになって操作する必要があります。OS本体に影響がある操作ができる状態でroot権限を付与することはものすごく危険なため、その不安を少しでも少なくするためRootlessモードで立ち上げる必要があります。
では、実施にその方法について説明します。
PC環境について
実際に試す際に操作環境を一致させたほうが再現度が高いため実際に作業した条件をいかに書きます。
- VirtualBox
- OS:Ubuntu 21.10 64Bit
- CPU:2
- Memory:4GB
- ディスク:30GB
インストールについて
aptを利用して以下のソフトをインストールします。
- containerd
- rootlesskit
- curl
- golang
インストールする際には以下のコマンドを実行します。。
sudo apt install -y containerd rootlesskit curl golang
nerdctlは公式ページにビルドしたパッケージがあるので、それをダウンロードして特定フォルダ(/usr/local/bin)に登録するように以下のコマンドを実行する。
curl -OL https://github.com/containerd/nerdctl/releases/download/v0.18.0/nerdctl-0.18.0-linux-amd64.tar.gz &&\ sudo tar -C /usr/local/bin -xzf nerdctl-0.18.0-linux-amd64.tar.gz &&\ rm -rf nerdctl-0.18.0-linux-amd64.tar.gz
BuildKitも公式ページにビルドしたパッケージがあるので、ダウンロードしてフォルダパスを登録するように以下のコマンドを実行する。
curl -OL https://github.com/moby/buildkit/releases/download/v0.10.0/buildkit-v0.10.0.linux-amd64.tar.gz &&\ sudo mkdir /usr/local/buildkit && \ sudo tar -C /usr/local/buildkit -xzf buildkit-v0.10.0.linux-amd64.tar.gz &&\ rm -rf buildkit-v0.10.0.linux-amd64.tar.gz echo "export PATH=$PATH:/usr/local/buildkit/bin" >> $HOME/.bashrc &&\ source $HOME/.bashrc
nerdctlが使用するCNI Pluginを使用できるように公式ページにビルドしたパッケージがあるので、それをダウンロードして特定フォルダ(.opt/cni/bin)に登録できるように以下のコマンドを実行する。
curl -OL https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz && \ sudo mkdir -p /opt/cni/bin && \ sudo tar -C /opt/cni/bin -xzf cni-plugins-linux-amd64-v1.1.1.tgz && \ rm -rf cni-plugins-linux-amd64-v1.1.1.tgz
containerdやBuildKitをrootlessモードで起動させるため以下のコマンドで実行する。
containerd-rootless-setuptool.sh install containerd-rootless-setuptool.sh install-buildkit
rootlessモードで実行するときに、/etc/cni内のフォルダ操作で権限がないためパーミッションエラーが発生するために以下のコマンドで操作権限を与える。
sudo setfacl -m u:$USER:rwx -R /etc/cni
実際の動作テスト
サーバーの起動テスト
以下のコマンドでnginxのコンテナ動作テストを行う。
nerdctl run -d -p 8080:80 --name nginx-test nginx
nerdctl psコマンドでコンテナが動作していることを確認する。
$ nerdctl ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ffeda5acc0e1 docker.io/library/nginx:latest "/docker-entrypoint.…" 21 seconds ago Up 0.0.0.0:8080->80/tcp nginx-test
ブラウザでlocalhost:8080にアクセスすると以下の通り表示される。
図2 nginx動作によるページ表示
コンテナを停止する場合は以下のコマンドを実行する。
nerdctl stop nginx-test
コンテナのビルドテスト
go言語でhello Worldと表示するプログラムを以下の通り作成前に、以下の通り初期化する。
cd ~ mkdir app cd app go mod init app
以下のプログラムをmain.goファイル内に記載する。
package main import "fmt" func main() { fmt.Println("Hello World") }
以下の通り用意したプログラムをビルド実行するとHello Worldと表示する。
$ go run . Hello World
以下の通りDockerfileを使用して、コンテナ化する準備する。
FROM golang WORKDIR /app COPY ./* /app CMD ["go","run","."]
以下のコマンドで、作成したコンテナをgohello:latestとしてビルドする
nerdctl build -t gohello:latest .
コンテナを実行すると以下の通り表示する。
$ nerdctl run gohello:latest Hello World
docker-composeファイルの実行
NextCloudを立ち上げるためのdocker-compose.ymlファイルを作成して、docker-composeで利用するための準備をします。
version: '3.1' volumes: nextcloud: db: services: db: image: mariadb command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW --innodb-file-per-table=1 --skip-innodb-read-only-compressed ports: - 3306:3306 volumes: - db:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=root # 適当なパスワードを設定 - MYSQL_PASSWORD=root # 適当なパスワードを設定 - MYSQL_DATABASE=nextcloud - MYSQL_USER=nextcloud nextcloud: image: nextcloud ports: - 8080:80 volumes: - nextcloud:/var/www/html environment: - MYSQL_DATABASE=nextcloud - MYSQL_USER=nextcloud - MYSQL_PASSWORD=root - MYSQL_HOST=db
以下のコマンドでdocker-composeファイルを実行します。
nerdctl compose up -d
ブラウザでlocalhost:8080にアクセスすると以下の通り表示する。
図3 NextCloudの画面表示
停止する場合は以下のコマンドを実行してください。
nerdctl compose down
まとめ
結果から、containerdでコンテナ開発環境の構築を作れることがわかりました。これまでの内容を読んだ読者ならわかりますが、DockerやPodmanに比べて、環境構築が大変なことが理解できたと思います。
また、この構築をやることでコンテナ開発に必要な物がよく理解でいたためやる意味があると感じます。しかし、実際に開発環境を作るになるならば、特別な理由がない限りDockerやPodmanを使用した方が容易に開発環境ができるためそちら導入したほうが良いです。