はじめに
前回では、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ユーザによる作業は特別なことがない限りは避けるべきことなので、紹介したように作業することはできるだけおこなわないようにしましょう。