containerdを使用したコンテナ開発

はじめに

こんにちは、サイオステクノロジーのエンジニア 中島です。

昨今でコンテナ開発といえば、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を使用した方が容易に開発環境ができるためそちら導入したほうが良いです。

 

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

1人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です