WSL上にDockerをインストールしてActiveRecordサーバーを立ち上げる

Blog

いろいろと詰まったので手順メモ

参考サイト

「Ubuntu 20.04 LTS に Docker をインストールする」
https://www.softek.co.jp/SID/support/sidfmvm/guide/install-docker-ubuntu2004.html

「【WSL2】Ubuntu 20.04でPID1をsystemdにする 2021年7月版」
https://shikiyura.com/2021/07/run_systemd_as_pid_1_on_wsl2_202107/

「CentOSにrbenv, Rubyをインストールする」
https://qiita.com/NaokiIshimura/items/ff04b6eaa40b33c4bea8

1.Ubuntuをインストール


まず管理者Powershellを開いて、以下のコマンドを実行
WSLのバージョンを2に設定します。

wsl --set-default-version 2

これをしておかないと後に「systemd is not supported under WSL 1」というエラーに悩まされることになります。

そのあと、Microsoft Storeで「Ubuntu」をインストール(いくつかあるけど、これで最新版がとれるみたい)
さらに、調べていて見つけたので「Windows Terminal」をインストール(必須ではない)

Ubuntuのターミナルを開いて、User/Passwordを設定したら次のステップへ

2.Dockerをインストール
2-1. Dockerのリポジトリを設定する

2-1-1.aptパッケージを更新

$ sudo apt update

2-1-2.必要パッケージをインストール

$ sudo apt install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

2-1-3.Docker公式のGPG公開鍵をインストール

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

2-1-4.fingerprint 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88であることを確認

sudo apt-key fingerprint 0EBFCD88

2-1-5.repositoryを追加

$ sudo add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) \
    stable"
2-2. Dockerの最新版をインストール

2-2-1.aptパッケージを更新

$ sudo apt update

2-2-2.最新版をインストール

$ sudo apt-get install docker-ce docker-ce-cli containerd.io

2-2-3.動作確認

$ sudo docker run --rm hello-world
$ sudo docker rmi hello-world
2-3. systemdをPID 1で動かしてsystemctlを有効化する

確かこのあたりで以下のエラーに遭遇したので「genie」というツールを追加して対処

System has not been booted with systemd as init system (PID 1). Can't operate.

するのだが、これにはdotnet-runtime-5.0が必要(公式Git参照)とあるので先にインストールしておく。(後述する手順を変えれば不要かも)

Microsoftの公式サイトを参考に最新版(5.0に対応しているもの)をインストール

A. パッケージリポジトリを追加

wget https://packages.microsoft.com/config/ubuntu/21.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb

B. SDKのインストール

sudo apt-get update; \
  sudo apt-get install -y apt-transport-https && \
  sudo apt-get update && \
  sudo apt-get install -y dotnet-sdk-5.0

C. ランタイムをインストールする

sudo apt-get update; \
  sudo apt-get install -y apt-transport-https && \
  sudo apt-get update && \
  sudo apt-get install -y aspnetcore-runtime-5.0

D. SDKバージョン、ランタイムバージョンを確認する

dotnet --list-sdks
dotnet --list-runtimes

2-2-1. 導入のために必要なソフトをインストール

sudo apt install git dotnet-runtime-3.1 daemonize

※ここのdotnet-runtime-3.1を公式Gitに書いてあるバージョンに合わせればA-Dの手順は不要と思われる

2-2-1. genieをインストール

git clone https://github.com/arkane-systems/genie.git
 
cd genie
make install

2-2-2. genieを実行

genie -s
ps aux

systemdのPIDが1になれば成功!

2-3. Dockerイメージを取得
docker pull centos
2-3. Dockerコマンドの権限を変更

ここでdocker runコマンドをたたいたら、コンテナがExit(0)で起動しない問題が発生。
中にも入れず困り果てて、

sudo docker logs 

dockerのログを見るとなにやら以下のエラーが

「Got permission denied while trying to connect to the Docker daemon socket」

dockeのsocketにアクセスできないとのこと。
今いるユーザーをdockerグループに追加して、

sudo gpasswd -a $(whoami) docker

socketファイルの所有グループを変更

sudo chgrp docker /var/run/docker.sock

dockerを再起動してあげたら治りました

sudo service docker restart

ついでに、sudoなしでdockerコマンドが叩けるようになりました。

2-3. Dockerコンテナを起動
docker run --name active-record -p 80:80 -v /mnt/z/share:/share -ti centos
3.Docker内にActiveRecord環境構築
3-1. 必要コマンド群インストール

必要なコマンドをインストールします。

yum -y install sudo
sudo yum -y install git
3-2. Rubyインストール

Rubyのインストールのためにrbenvをインストールします。

git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

PATHを追加します。~/.bash_profileに以下の記述を追加。

# rbenv
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

反映

exec $SHELL --login

必要パッケージをインストール

sudo yum -y install bzip2 gcc openssl-devel readline-devel zlib-devel

バージョンを確認

bzip --version
bzip2 --version
gcc --version
yum list installed | grep openssl-deve
yum list installed | grep readline-dev
yum list installed | grep zlib-devel

makeをインストール(Rubyのインストールに必要なので)

sudo yum -y install make

Rubyをインストール

rbenv install --list
rbenv install 3.0.2
rbenv versions
rbenv global 3.0.2
ruby -v

sqlite-develをインストール

yum install sqlite-devel

sqlite3, activerecordをインストール

gem install sqlite3
gem install activerecord

環境構築は完了です。

docker内でtimedatectlを使ってタイムゾーンを設定しようとしたらまた以下のエラーが発生…
「genie」が同じ方法で入らなかったので現在調査中です。。。

System has not been booted with systemd as init system (PID 1). Can't operate.
[root@b01f6d2648d0 genie]# rm /usr/lib/systemd/system-environment-generators/80-genie-envar.sh
rm: remove symbolic link '/usr/lib/systemd/system-environment-generators/80-genie-envar.sh'? y
[root@b01f6d2648d0 genie]# rm /usr/local/bin/genie
rm: remove symbolic link '/usr/local/bin/genie'? y
[root@b01f6d2648d0 genie]# sudo make install-local
make -C package/local package
make[1]: Entering directory '/root/genie/package/local'
# Installing locally.
make -C binsrc build-local
make[2]: Entering directory '/root/genie/binsrc'
make -C genie local
make[3]: Entering directory '/root/genie/binsrc/genie'
dotnet publish -c ReleaseLocal -r linux-x64
Microsoft (R) Build Engine version 16.9.0+5e4b48a27 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.

  Determining projects to restore...
  All projects are up-to-date for restore.
  genie -> /root/genie/binsrc/genie/bin/ReleaseLocal/net5.0/linux-x64/genie.dll
  genie -> /root/genie/binsrc/genie/bin/ReleaseLocal/net5.0/linux-x64/publish/
make[3]: Leaving directory '/root/genie/binsrc/genie'
make -C runinwsl
make[3]: Entering directory '/root/genie/binsrc/runinwsl'
dotnet publish -c Release -r linux-x64
Microsoft (R) Build Engine version 16.9.0+5e4b48a27 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.

  Determining projects to restore...
  All projects are up-to-date for restore.
  runinwsl -> /root/genie/binsrc/runinwsl/bin/Release/net5.0/linux-x64/runinwsl.dll
  runinwsl -> /root/genie/binsrc/runinwsl/bin/Release/net5.0/linux-x64/publish/
make[3]: Leaving directory '/root/genie/binsrc/runinwsl'
make[2]: Leaving directory '/root/genie/binsrc'
# Just put the bits in the right places.
mkdir -p "/usr/local/bin"
# Binaries.
install -Dm 4755 -o root "binsrc/genie/bin/ReleaseLocal/net5.0/linux-x64/publish/genie" -t "/usr/local/libexec/genie"
install -Dm 0755 -o root "binsrc/runinwsl/bin/Release/net5.0/linux-x64/publish/runinwsl" -t "/usr/local/libexec/genie"
ln -s /usr/local/libexec/genie/genie /usr/local/bin/genie
# Environment generator.
install -Dm 0755 -o root "othersrc/scripts/80-genie-envar.sh" -t "/usr/local/libexec/genie"
ln -s /usr/local/libexec/genie/80-genie-envar.sh /usr/lib/systemd/system-environment-generators/80-genie-envar.sh
ln -s /usr/local/libexec/genie/80-genie-envar.sh /usr/lib/systemd/user-environment-generators/80-genie-envar.sh
ln: failed to create symbolic link '/usr/lib/systemd/user-environment-generators/80-genie-envar.sh': File exists
make[1]: *** [Makefile:31: package] Error 1
make[1]: Leaving directory '/root/genie/package/local'
make: *** [Makefile:54: install-local] Error 2
[root@b01f6d2648d0 genie]# rm /usr/local/bin/genie
rm: remove symbolic link '/usr/local/bin/genie'? y
[root@b01f6d2648d0 genie]# sudo make install-local
make -C package/local package
make[1]: Entering directory '/root/genie/package/local'
# Installing locally.
make -C binsrc build-local
make[2]: Entering directory '/root/genie/binsrc'
make -C genie local
make[3]: Entering directory '/root/genie/binsrc/genie'
dotnet publish -c ReleaseLocal -r linux-x64
Microsoft (R) Build Engine version 16.9.0+5e4b48a27 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.

  Determining projects to restore...
  All projects are up-to-date for restore.
  genie -> /root/genie/binsrc/genie/bin/ReleaseLocal/net5.0/linux-x64/genie.dll
  genie -> /root/genie/binsrc/genie/bin/ReleaseLocal/net5.0/linux-x64/publish/
make[3]: Leaving directory '/root/genie/binsrc/genie'
make -C runinwsl
make[3]: Entering directory '/root/genie/binsrc/runinwsl'
dotnet publish -c Release -r linux-x64
Microsoft (R) Build Engine version 16.9.0+5e4b48a27 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.

  Determining projects to restore...
  All projects are up-to-date for restore.
  runinwsl -> /root/genie/binsrc/runinwsl/bin/Release/net5.0/linux-x64/runinwsl.dll
  runinwsl -> /root/genie/binsrc/runinwsl/bin/Release/net5.0/linux-x64/publish/
make[3]: Leaving directory '/root/genie/binsrc/runinwsl'
make[2]: Leaving directory '/root/genie/binsrc'
# Just put the bits in the right places.
mkdir -p "/usr/local/bin"
# Binaries.
install -Dm 4755 -o root "binsrc/genie/bin/ReleaseLocal/net5.0/linux-x64/publish/genie" -t "/usr/local/libexec/genie"
install -Dm 0755 -o root "binsrc/runinwsl/bin/Release/net5.0/linux-x64/publish/runinwsl" -t "/usr/local/libexec/genie"
ln -s /usr/local/libexec/genie/genie /usr/local/bin/genie
# Environment generator.
install -Dm 0755 -o root "othersrc/scripts/80-genie-envar.sh" -t "/usr/local/libexec/genie"
ln -s /usr/local/libexec/genie/80-genie-envar.sh /usr/lib/systemd/system-environment-generators/80-genie-envar.sh
ln -s /usr/local/libexec/genie/80-genie-envar.sh /usr/lib/systemd/user-environment-generators/80-genie-envar.sh
ln: failed to create symbolic link '/usr/lib/systemd/user-environment-generators/80-genie-envar.sh': File exists
make[1]: *** [Makefile:31: package] Error 1
make[1]: Leaving directory '/root/genie/package/local'
make: *** [Makefile:54: install-local] Error 2
[root@b01f6d2648d0 genie]# rm /usr/lib/systemd/system-environment-generators/80-genie-envar.sh
rm: remove symbolic link '/usr/lib/systemd/system-environment-generators/80-genie-envar.sh'? y
[root@b01f6d2648d0 genie]# sudo make install-local
make -C package/local package
make[1]: Entering directory '/root/genie/package/local'
# Installing locally.
make -C binsrc build-local
make[2]: Entering directory '/root/genie/binsrc'
make -C genie local
make[3]: Entering directory '/root/genie/binsrc/genie'
dotnet publish -c ReleaseLocal -r linux-x64
Microsoft (R) Build Engine version 16.9.0+5e4b48a27 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.

  Determining projects to restore...
  All projects are up-to-date for restore.
  genie -> /root/genie/binsrc/genie/bin/ReleaseLocal/net5.0/linux-x64/genie.dll
  genie -> /root/genie/binsrc/genie/bin/ReleaseLocal/net5.0/linux-x64/publish/
make[3]: Leaving directory '/root/genie/binsrc/genie'
make -C runinwsl
make[3]: Entering directory '/root/genie/binsrc/runinwsl'
dotnet publish -c Release -r linux-x64
Microsoft (R) Build Engine version 16.9.0+5e4b48a27 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.

  Determining projects to restore...
  All projects are up-to-date for restore.
  runinwsl -> /root/genie/binsrc/runinwsl/bin/Release/net5.0/linux-x64/runinwsl.dll
  runinwsl -> /root/genie/binsrc/runinwsl/bin/Release/net5.0/linux-x64/publish/
make[3]: Leaving directory '/root/genie/binsrc/runinwsl'
make[2]: Leaving directory '/root/genie/binsrc'
# Just put the bits in the right places.
mkdir -p "/usr/local/bin"
# Binaries.
install -Dm 4755 -o root "binsrc/genie/bin/ReleaseLocal/net5.0/linux-x64/publish/genie" -t "/usr/local/libexec/genie"
install -Dm 0755 -o root "binsrc/runinwsl/bin/Release/net5.0/linux-x64/publish/runinwsl" -t "/usr/local/libexec/genie"
ln -s /usr/local/libexec/genie/genie /usr/local/bin/genie
ln: failed to create symbolic link '/usr/local/bin/genie': File exists
make[1]: *** [Makefile:27: package] Error 1
make[1]: Leaving directory '/root/genie/package/local'
make: *** [Makefile:54: install-local] Error 2

コメント

  1. Great goods from you, man. I’ve understand your
    stuff previous to and you’re just extremely excellent.
    I really like what you’ve acquired here, really like what you’re stating and the way in which
    you say it. You make it entertaining and you still care for to keep it wise.
    I cant wait to read far more from you. This is really a terrific site.

タイトルとURLをコピーしました