ソースからNerdctlを使用した環境を作る

★★★ Live配信告知 ★★★ぜひお申込みください!
◆◇世界一わかりみの深いクラウドネイティブ on Azure◆◇
8/4(木) 19:00~ 第17回:コンテナをサーバーレスでラクラク実行 〜 Azure Container InstancesとDocker CLIで実現 〜 今回は、コンテナをサーバーレスで実行するテクノロジとDocker CLIとの連携を紹介します。
◆◇PS Live◆◇
8/5(金) 12:00~ 第18回:アウトプットはイイぞ 〜サイオステクノロジーLT大会〜 エンジニア初級者向けから、個人ネタまで、エンジニア脳を体感できるプログラムです。

はじめに

 前回では、nerdctlやbuildkitなどのソフトインストールはビルドされたパッケージを使用しました。パッケージを使用しない方法でインストールは?と疑問に思ったので、GitHubに公開してあるソースを利用してインストールする方法を試してみました。また、各ソフト実行をrootユーザで行う方法も試しましたの記載します。

ビルド対象について

 aptコマンドでインストール難しい以下のパッケージをソースコードからビルドする対象とします。

  • nerdctl
  • buildkit
  • CNI Plugins

ビルド実行

 ソースコードからビルドを実行する前にaptを使用して以下のパッケージを導入します。

  • containerd
  • golang
  • curl
  • git
  • make

導入するために以下のコマンドを実行します。

sudo apt install -y containerd golang curl git make

なお、本ビルドで導入したバージョンは以下の通りになります。

  • containerd 1.5.5-0ubuntu3.1
  • go 1.17
  • curl  7.740
  • git 2.32.0
  • make 4.3

nerdctl

 GitHubのサイトからソースコードをダウンロードします。ダウンロード先としてホームフォルダ直下とし、ダウンロードしたフォルダを作業フォルダとします。その作業を実施するためのコマンドをいかに記載します。

cd ~
git clone https://github.com/containerd/nerdctl.git
cd nerdctl

 次に、ソースコマンドからビルドを実施します。以下のコマンドを実行することでソースコードからビルドが行われます。なお、ソースコードはGo言語で記載しているためgo言語コンパイルツールが必要となります。

make

 上記コマンドを実行すると「_output」フォルダが作成され、そのフォルダ下にnerdctlコマンドのバイナリファイルが作成されます。

 それらをインストールするためのスクリプトがmakeで記載されているため以下のコマンドを使用してインストールします。

sudo make install

 上記コマンドを実行すると_outputフォルダ内のnerdctl実行バイナリとextras/rootless/フォルダ内に記載されたルートレス実行用スクリプトが/usr/local/bin/フォルダにコピーされます。

 以上で、nerdctlのビルドとインストール作業は完了です。

buildkit

 GitHubのサイトからソースコードをダウンロードします。ダウンロード先としてホームフォルダ直下とし、ダウンロードしたフォルダを作業フォルダとします。その作業を実施するためのコマンドをいかに記載します。

cd ~
git clone https://github.com/moby/buildkit.git
cd buildkit

 buildkitのソース内に記載してあるMakefile内でbuildxを使用している。これを使用するためには、dockerをインストールする必要があります。よって、以下のコマンドでインストールと現在のユーザで実行できるように設定を行い、そのあとで再起動を行います。

sudo apt install docker.io
sudo usermod -aG docker $USER
sudo reboot

 上記コマンド実施後、以下のコマンドを実行して、ソースコードからビルドを実施します。

cd ~/buildkit
make

 makeコマンドを実行すると、フォルダ内にbinフォルダが作成されその中に、buildkitを実行するための成果物が作成されます。それをインストールするには以下のコマンドを実行してください。

sudo make install

CNI Plugins

 GitHubのサイトからソースコードをダウンロードします。ダウンロード先としてホームフォルダ直下とし、ダウンロードしたフォルダを作業フォルダとします。その作業を実施するためのコマンドをいかに記載します。

cd ~
git clone https://github.com/containernetworking/plugins.git
cd plugins

 ビルドを実行するためには、ビルド用の実行スクリプトが存在しているため、以下のコマンドでスクリプトを実行しビルドを実行します。なお、ソースコードはGo言語で作成されているためGo言語のコンパイルツールが必要となります。

./build_linux.sh

 スクリプトを実行するとbinフォルダが作成され、その中にCNI Pluginsバイナリが作成されます。もしインストールする場合は、以下のコマンドを実施します。

sudo mkdir -p /opt/cni/bin
sudo cp ./bin/* /opt/cni/bin

 以上で実行に必要なソフトのビルドとインストールは完了です。

実際の動作テスト

 コンテナを実行するためのツール導入が完了しましたので、rootでコマンドを実行し動作確認をしてみます。

nginxサーバーの起動テスト

 以下のコマンドでnginxの動作テストを行います。

sudo nerdctl run -d -p 8080:80 --name nginx-test nginx

 nerdctl psコマンドでコンテナが動作していることを確認します。

$ sudo  nerdctl ps
CONTAINER ID    IMAGE                             COMMAND                   CREATED          STATUS    PORTS                   NAMES
9dc737e207d1    docker.io/library/nginx:latest    "/docker-entrypoint.…"    5 minutes ago    Up        0.0.0.0:8080->80/tcp    nginx-9dc73  

ブラウザでlocalhost:8080にアクセスすると以下の通り表示される。

図1 nginx動作によるページ表示

 

もし、コンテナを停止する場合は以下のコマンドを実行します。

sudo nerdctl stop nginx-test

 

コンテナのビルド

buildkitを動かすためには、buildkitdプログラムを立ち上げないとbuildツールが動かないため以下のコマンドでプログラムが起動し続ける。停止する場合はCtrl+Cで止めてください。

 buildkitプログラムを立ち上げるためには、buildkitdと呼ばれるバイナリを実行する必要があります。動作確認のため以下のコマンドでプログラムの実行テストを行います。なお、停止する場合は、Ctrl+Cで停止してください。

sudo buildkitd

 上記のバイナリが動作し続ける状態でも、コンテナビルドすることはできますが、今後のことを考えるとサービス登録させたほうが作業がしやすくなるため/etc/systemd/systemフォルダ内にbuildkit.serviceファイルを作成してサービス登録するための準備をします。そのために以下のコマンドを実行してファイルのテキストエディタを開きます。

sudo vi /etc/systemd/system/buildkit.service

 上記テキストエリアに以下のデータ入力します。

[Unit]
Description=BuildKit
Documentation=https://github.com/moby/buildkit

[Service]
ExecStart=/usr/local/bin/buildkitd

[Install]
WantedBy=multi-user.target

 入力保存後、以下のコマンドでbuildkitのサービスを立ち上げます。

sudo systemctl enable –now buildkit

 一応、buildkitのサービスにアクセスできるかテストするため、buildkitが確保しているディスク容量を以下のコマンドで確認します。

$ sudo buildctl du
ID RECLAIMABLE SIZE LAST ACCESSED
Reclaimable: 0B
Total: 0B

 コンテナビルドのテストとして、実際にgo言語プログラムをコンテナ内でビルドして実行します。なお、そのgo言語プログラムはhello Worldと表示するプログラムとします。そのプログラムを作るための下準備として、以下の通り初期化します。

cd ~
mkdir app
cd app
go mod init app

 main.goというファイルを作詞して以下の通り入力を行います。

package main
import "fmt"
func main() {
fmt.Println("Hello World")
}

 go言語のプログラムのテストとして以下の通り実行することで、Hello Worldと表示します。

$ go run .
Hello World

 つぎに、上記プログラムをコンテナ化します。なお、使用するコンテナはここのリンク先にあるものを使用します。実際にDokcerfileファイルを作成して以下の通り入力します。

FROM golang
WORKDIR /app
COPY ./* /app
CMD ["go","run","."]

 なお、これまでのフォルダとファイル構成は以下の通りになります。

app
├── Dockerfile
├── go.mod
└── main.go

 以下のコマンドを使用して、コンテナ名をgohello:latestとしてビルドします。

sudo nerdctl build -t gohello:latest .

 作成したコンテナを実行する場合は以下コマンドを実行すると、書いたプログラムの通り実行されます。

$ sudo nerdctl run gohello:latest
Hello World

docker-composeファイルの実行

 docker-compose用のファイルテストとして以下の通り、NextCloudを立ち上げるためのdocker-compose.ymlファイルを作成します。

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

 上記ファイルをnerdctlで行うために以下のコマンドを実行します。また、オプションとしてデーモンとしてプログラムを実行します。

sudo nerdctl compose up -d

 上記コマンド実行後、ブラウザでhttp://localhost:8080にアクセスすると以下の通りNextCloudの初期画面が表示されます。

図2 NextCloudの画面表示

 

 もし、停止する場合は以下のコマンドを実行してください。

sudo nerdctl compose down

まとめ

 ソースコードからビルドして、ソフトをインストールを行い、コンテナ開発やコンテナ動作を確認することができました。今回、ビルドで使用したソースコードはビルドしやすいような環境を整えるように作成してあったためそんなに難しくなかったと思います。皆様も、様々なOSSのソースコードからビルドしてプログラムを実行できるようにしてみてはどうでしょうか?

 なお、本記事でおこなったrootユーザによる作業は特別なことがない限りは避けるべきことなので、紹介したように作業することはできるだけおこなわないようにしましょう。





ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!


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

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

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

Be the first to comment

Leave a Reply

Your email address will not be published.


*