前回: Macとsystemd-nspawnで普通の開発環境を作るまで(3)~ファイル共有設定~
今回は実践編として、Railsの開発環境を作ってみます
概要
以下のようにDBコンテナを作って連携させてみます
Webコンテナについては前回まで使っていたコンテナを流用します
DBコンテナの作成
今回は気分を変えて、Docker Hubから取得したDebianをDBコンテナとして立ててみます
ホストUbuntuサーバにログイン後rootになって以下のコマンドを実行します
# 必要パッケージインストール
apt update
apt install docker.io
# DockerからDebianのイメージを持ってくる
docker export $(docker create debian) > /tmp/debian.tar
machinectl import-tar /tmp/debian.tar
cd /var/lib/machines/
systemd-nspawn -D debian/
# ↓ここからコンテナ内
apt update
apt install -y systemd dbus postgresql
systemctl enable postgresql systemd-networkd
exit
# ↑ここまでコンテナ内
# ネットワーク設定
echo -e "nameserver 8.8.8.8\nnameserver 8.8.4.4" > debian/etc/resolv.conf
curl -L https://goo.gl/2SDUwi > debian/etc/systemd/network/80-container-host0.network
machinectl enable debian
Rails環境の準備
これでコンテナができたので後はpostgresqlの設定をするだけです
debianコンテナ側
DBサーバ側は外部接続の許可を行います
ubuntu-hostにrootで入ってから以下のコマンドで準備します
# DBコンテナに入る
machinectl start debian
machinectl shell debian /bin/bash
# ↓ここからコンテナ
# 外部接続の許可設定
perl -i -ple 's#^host.*127.0.0.1/32.*#host all all 0.0.0.0/0 md5#' /etc/postgresql/9.6/main/pg_hba.conf
perl -i -ple "s/^#listen_address.*/listen_addresses = '\*'/" /etc/postgresql/9.6/main/postgresql.conf
systemctl restart postgresql
# DBとユーザを作成
echo "create user nspawnapp password 'nspawnapp'" | su -c psql - postgres
su -c 'createdb nspawnapp -O nspawnapp' - postgres
# コンテナから抜ける
exit
ubuntuコンテナ側
こちらにはRailsをインストールします
(今回はあくまで動作確認なのでdebパッケージでRailsをインストールしてしまいます)
# ubuntuコンテナに入る
machinectl shell ubuntu /bin/bash
# ↓ここからコンテナ
# 必要パッケージインストール
apt update
apt install -y ruby-pg ruby-rails curl
# appユーザでrails new
su - app
cd /mnt
rails new nspawnapp --database=postgresql
cd nspawnapp
# DB設定とテーブル作成
curl -L https://goo.gl/yXWcRd > config/database.yml
rails generate scaffold Comment name:string message:string
./bin/rake db:migrate
# railsサーバ起動
rails s -b 0.0.0.0
確認
これでMacから http://192.168.56.3:3000/comments を開けば先ほど作ったHTMLが見れると思います
DBもつながっているので登録もできますし、Mac側(/Users/yamasita/mnt)から編集もできるはずです
表示されるRails画面
今回はほとんどsystemd-nspawn関係ない話でしたが、要するにDocker等のコンテナイメージをmachinectl import-tar
コマンドで取り込んであとは普通のサーバのように設定すればそのまま動きますよーという事です
便利ですね
まとめ
というわけで、Rails環境が作れました。
systemd-nspawnはまるで通常サーバのように(コンテナ内であることを意識しないで)使えるのがメリットなんじゃないかなと思いました。
個人的には、
- Docker→オーケストレーション等の多くのコンテナを使った管理
- systemd-nspawn→もともと普通のサーバとして動いているものの動作確認、開発環境を作りたい
こんな感じにDockerは一個一個が単一のプロセスで動くコンテナを管理したいときに、systemd-nspawnはサーバと同じように複数のプロセスが動くコンテナを作るときに使用するのが便利なんじゃないかなと思いました。
簡単に試せるので是非使ってみて欲しいです