開発環境に docker を使っていたけど サーバーコンテナのほうが性に合ってるかなと思いなおし nodejs 用の開発環境を作った記録
要件
- vscode で ssh 接続して開発できること
- nodejs のバージョンを選択できること
- git が利用できること
- ubuntu を利用すること
- zerotier のネットワークに追加すること
開発環境用コンテナ作成
コンテナの作成
ホストからコンテナ作成、ホストと同様の鍵で入れるようにホストの authorized_keys をコンテナに転送する。
lxc launch ubuntu:20.04 test
lxc exec test -- bash
lxc file push ~/.ssh/authorized_keys test/root/.ssh/authorized_keys
コンテナに必要な git と ssh server をインストールする。(すでに入っていた)
apt install git openssh-server
nodejs のインストール
コンテナに必要な nvm をインストールする。 デフォルトで 14.x が利用できるようにした。
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
source ~/.bashrc
nvm install Fermium
nvm alias default stable
zerotier のインストール
コンテナに zerotier のクライアントをインストールする。 このネットワークを通じてコンテナに ssh することになる。
curl -s 'https://raw.githubusercontent.com/zerotier/ZeroTierOne/master/doc/contact%40zerotier.com.gpg' | gpg --import && \
if z=$(curl -s 'https://install.zerotier.com/' | gpg); then echo "$z" | sudo bash; fi
zerotier-ctl join <NetworkID>
image 化の準備
zerotier の image 化の準備
zerotier をインストールした状態で image 化したところ、zerotier の deviceID が変化せず。 作成した image を使ってコンテナを作るとすべてのインスタンスの zerotier の IP が重複してしまった。 サーバー作成した際に zerotier をインストールするのは面倒くさいので解決策を探った。
zerotier の作業ディレクトリは”/var/lib/zerotier-one”
man zerotier-one
The zerotier-one service keeps its state and other files in a working directory. If this directory is not specified at launch it defaults to "/var/lib/zerotier-one" on Linux, "/Li‐
brary/Application Support/ZeroTier/One" on Mac, and "/var/db/zerotier-one" on FreeBSD and other similar BSDs. The working directory should persist. It shouldn't be automatically
cleaned by system cleanup daemons or stored in a volatile location. Loss of its identity.secret file results in loss of this system's unique 10-digit ZeroTier address and key.
作業ディレクトリを確認する。
ls -l /var/lib/zerotier-one/
total 36
-rw------- 1 zerotier-one zerotier-one 24 Apr 17 01:26 authtoken.secret
drwx------ 4 zerotier-one zerotier-one 4096 Apr 17 01:26 controller.d
-rw-r--r-- 1 zerotier-one zerotier-one 141 Apr 17 02:07 identity.public
-rw------- 1 zerotier-one zerotier-one 270 Apr 17 02:07 identity.secret
drwxr-xr-x 2 zerotier-one zerotier-one 4096 Apr 17 01:32 networks.d
drwxr-xr-x 2 zerotier-one zerotier-one 4096 Apr 17 02:32 peers.d
-rw-r--r-- 1 zerotier-one zerotier-one 570 Apr 17 01:26 planet
lrwxrwxrwx 1 zerotier-one zerotier-one 22 Feb 15 08:00 zerotier-cli -> /usr/sbin/zerotier-one
lrwxrwxrwx 1 zerotier-one zerotier-one 22 Feb 15 08:00 zerotier-idtool -> /usr/sbin/zerotier-one
lrwxrwxrwx 1 zerotier-one zerotier-one 22 Feb 15 08:00 zerotier-one -> /usr/sbin/zerotier-one
-rw-r--r-- 1 zerotier-one zerotier-one 3 Apr 17 02:07 zerotier-one.pid
-rw-r--r-- 1 zerotier-one zerotier-one 4 Apr 17 02:07 zerotier-one.port
identity.public identity.secret 上記 2 つがデバイス ID のようだ。 この 2 つのファイルを削除し、zerotier を再起動すると 2 つのファイルが再作成されて中身が変わった。 image 化する前に必ず削除する必要がある。
cd /var/lib/zerotier-one
rm -rf identity.*
コンテナの image 化
ホストからコンテナを image に変換する。
lxc publish test --alias nodejs
lxc image list
+--------+--------------+--------+---------------------------------------------+--------------+-----------+----------+------------------------------+
| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCHITECTURE | TYPE | SIZE | UPLOAD DATE |
+--------+--------------+--------+---------------------------------------------+--------------+-----------+----------+------------------------------+
| nodejs | 226********* | no | Ubuntu 20.04 LTS server (20210415) | x86_64 | CONTAINER | 509.76MB | Apr 17, 2021 at 1:57am (UTC) |
+--------+--------------+--------+---------------------------------------------+--------------+-----------+----------+------------------------------+
| | 9f1********* | no | ubuntu 20.04 LTS amd64 (release) (20210415) | x86_64 | CONTAINER | 361.05MB | Apr 16, 2021 at 1:54pm (UTC) |
+--------+--------------+--------+---------------------------------------------+--------------+-----------+----------+------------------------------+
作った image からコンテナを作成
lxc launch nodejs <container name>
lxc exec <container name> -- zerotier-cli info
200 info d2d***** 1.x.x ONLINE
Deviceid をウェブサイトから登録すると IP が払い出されて通信可能になる。 わざわざウェブサイトから登録するのは面倒なので api を叩いて登録できるようにしたい。
参考サイト
おしまい