🦔

KagoyaVPSを使ってDocker-CEを使いながらDocker Registryを自前で用意する

2023/02/09に公開

はじめに

自前でRegistryを用意すると逆にコストが嵩みます。なぜなら自身にRegistryを持ちながら、ローカルにもイメージを保持しようとしますので大きなストレージを用意する必要が出てくるためです。

なので、本来なら行うイメージのバージョン管理も一定以上古いものは捨てる必要が出ます。

そのため、あまりおすすめできるものではありません。

しかし、AWSやGCPを使うとどこで間違ってクラウド破産をするか分からず、個人的にはクラウド破産の方が怖かったため、定額で利用できるVPSを本番環境として無理やり動かそうという動機から始めたものです。

きっと私と同じように不安を抱えながら自身のプロダクトを運用されている方もいらっしゃると思うので、そんな方の一助になれば幸いです。

お断り

本記事は全てにおいて動作を保証するものではなく、あくまで記事作成段階において動作した手順を備忘的に記録したものです。

Kagoya VPSはいいぞ

何がいいって、まずOSを選択した後に ”Docker-CEをプリインストールするか” 聞いてくれるんです。

最高です…

そのため、本記事から Dockerのインストール は省略させていただきます。

細かなTips その1 SSHについて

私はディレクトリの整理もパスを覚えることも苦手です。

そのため、sshの際に使用する認証キーをどこに配置したか忘れるなんてしょっちゅうです。きっとそんなエンジニア、他にもたくさんいるはず。

VPSを利用する際、もちろんAWS EC2を利用する際いちいち鍵のパスを覚えるわけにはいかないので、お手元の作業端末内 ssh configに書いておきましょう。

$ vim ~/.ssh/config

Host {sshする際に使用するホスト名のエイリアス。もちろんIP直書きでもいいと思います。}
  HostName {VPSのIP} # VPSのIP
  IdentityFile {sshの認証鍵のパス .keyの配置先} # 認証鍵の配置先
  Port 22
  User root
  ServerAliveInterval  600
  TCPKeepAlive yes

以上で作業端末から Host に記載したホスト名で接続が可能です。

やったねたえちゃん!

// 通常のコマンド
$ ssh -i {key path} user@host -p port

// ssh config記載後
$ ssh Host

細かなTips その2 ポート変更

Kagoya VPS はサーバーのSSHポートがデフォルトで22です。

セキュリティ上いいわけがありません。

そういうわけでポートを変更しましょう。

$ vim /etc/ssh/sshd_config

Port 10022

これは注意ですが、今ポートを書き換えたのでsshdのサービスをリスタートし、作業端末のsshd_configに記述したポートを書き換えてください。
これは自身への戒めと、みなさまへのアナウンスです。いいね?

Registry イメージの取得

すでに docker は動作している状態のため、 resistory イメージをpullします。

$ docker search registry  // registoryイメージを確認
$ docker pull registry    // ローカルに取得

自己証明書の作成

push通信もpull通信もhttpsで行われます。
そのため、自己証明でもいいので証明書を作成し、registryに紐づけておかないと作業端末からイメージをpushすることも、dockerが動いているサーバー上でのpullもエラーが発生してしまい行えません。

$ mkdir certs
$ openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -addext "subjectAltName = DNS:{サーバー名}" -x509 -days 3650 -out certs/domain.crt
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

CountryNameだけはJPと入力しましたが、それ以外は空欄で結構です。
Enterを連打しましょう。

証明書を紐づけてregistryを起動

// 証明書の配置ディレクトリを作成
$ mkdir -p /etc/docker/certs.d/{server名}\:{registoryの起動ポート}/ca.crt

// 証明書の配置
$ cp certs/domain.crt /etc/docker/certs.d/monophilia-server\:15000/ca.crt

// 紐づけて起動
$ docker run -d -p {外部から見える起動ポート}:5000 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key -v $(pwd)/certs:/certs registry

以上でregistoryの起動は完了です。
続きはまた今度!
次回以降は今回作成した Registory に対してプッシュして、プッシュされたイメージから起動などについて書いていこうと思います。

Discussion