使う予定のツール的にもレジストリ要るっぽいのとやったことないのでちょっとやってみる。
元データがblobにあれば耐障害性的にひとまずあんしんかもということで。
(障害のなかで最もアレなのはデータ消失という認識)
マニュアル通りにdockerビルド
# mkdir azure-registry;cd azure-registry
# vi Dockerfile
FROM registry
FROM python:3
RUN pip install docker-registry-driver-azureblob
# docker build --tag=registry-azure .
# docker tag 177391bcf802 smallpalace/registry-azure:latest
# docker images
※マニュアルになかったがpipがnot foundなエラーがでたのでpython:3のイメージを含めた
とりあえずDockerHubに上げる
※別にDockerHubにあげる必要性はあんまりないが今後似たことをしたくなった時の手間を省きたかった
# docker login
ユーザ名かIDとパスワード入力で認証
# docker push smallpalace/registry-azure
別のホストからpullできるか確認
# docker pull smallpalace/registry-azure
ちなみにDockerfileをDockerHubに上げるにはGitHubかBitBucketかでautomatebuildの必要がある模様
Docker HubでDockerfileを公開する(AUTOMATED BUILD) - Qiita
AzureBlobにコンテナを作る
ポータルからポチポチでもいけます。ストレージアカウントなければ作るところから。
権限はプライベートで大丈夫。
Using the Azure CLI 2.0 with Azure Storage | Microsoft Docs
AzureのBlobに定期バックアップファイルを投げ込む
プライベートコンテナレジストリに接続するときのTLS免除設定をdockerデーモンに与えてプロセス再起動しておく
おそらくグローバルでないローカルネットワーク通信という体でとりあえずTLS認証を省く設定をdockerのUnitファイルに書いてdaemonリスタートする
# vi /etc/systemd/system/docker.service.d/override.conf
[Service]セクションのExecStart=のコマンドのあたりに--insecure-registry=10.0.2.5:5000というようなオプションを追加。
要は起動コマンドにオプションが渡せればいいので[Service]セクションのEnvironmentFileに指定してる設定ファイル内に書いて起動コマンドに設定ファイル内の変数指定でも大丈夫。
CentOSだと/etc/sysconfig、Ubuntuだと/etc/defaultのしたにEnvironmentFileを置くルール風
# systemctl daemon-reload
# systemctl restart docker.service
# systemctl status docker.service
# docker ps
コンテナレジストリを起動する
# docker run -d -p 5000:5000 \
-e SETTINGS_FLAVOR=azureblob \
-e AZURE_STORAGE_ACCOUNT_NAME="*****" \
-e AZURE_STORAGE_ACCOUNT_KEY="****" \
-e AZURE_STORAGE_CONTAINER=registry \
smallpalace/registry-azure
# docker ps
なんかコンポーズのyamlにしてどっかにコミットするなら.envにかいてKEYは変数にしとくのがいいと思う。
検索したら変換webツールが存在するようであった。べんりそう。
https://composerize.com/
プライベートコンテナレジストリにpushしてみる
tag変えることでつなぐ先を変えるようでそれからpushするかんじ。
# docker tag smallpalace/registry-azure:latest 10.0.2.5:5000/registry-azure:v0.0.1
# docker push 10.0.2.5:5000/registry-azure
The push refers to a repository [10.0.2.5:5000/registry-azure]
aa027c305e18: Pushed
d5d6b45f829e: Pushed
9df68a0e05c1: Pushed
a6490c0c5308: Pushed
52a5560f4ca0: Pushed
v0.0.1: digest: sha256:aec3c5ffb630a93cdfdbccc10d1c**** size: 1364
プライベートコンテナレジストリからpullしてみる
# docker pull 10.0.2.5:5000/registry-azure:v0.0.1
v0.0.1: Pulling from registry-azure
Digest: sha256:aec3c5ffb630a93cdfdbccc10d1c****
Status: Downloaded newer image for 10.0.2.5:5000/registry-azure:v0.0.1
# docker images
dockerデーモンやOSが再起動したときに自動でコンテナレジストリを起動する
docker run するときに--restart=always
をつけるか
docker-compose.ymlならrestart: always
を追記するとよい模様。
docker-composeでOS起動時にコンテナを自動起動する方法 - Qiita
ホストを再起動した時などにDockerコンテナを自動的に再起動できるようにする | Unskilled?
docker stop container-id
docker run <other option> --restart=always
rancherからカスタムコンテナレジストリを追加
「インフラストラクチャ>レジストリ」から登録
ユーザ認証データは不要なのでブランクで登録すればOK。
httpでコンテナレジストリの様子を確認できるようにしてみる
LBかまして外部からアクセスとかはとりあえずいいとしてブラウザからちょっと見られるとなんとなく便利かなというだけの用途でdocker-registry-frontendを使ってみる。
# docker run \
> -d \
> -e ENV_DOCKER_REGISTRY_HOST=10.0.2.5 \
> -e ENV_DOCKER_REGISTRY_PORT=5000 \
> -p 8880:80 --restart=always \
> konradkleine/docker-registry-frontend:v2
8080は使われてるので適当なポートにしました。
プライベートIPに対応するグローバルIPの後ろに適当に指定した8880ポートを付けてブラウザからみると登録されてるイメージが見えます。(なおblobストレージ上からはなんも見えないのでうっかり削除に注意と、ブラウザから見えないか公開範囲を限定したい場合はFW的な開放範囲に注意。)
認証入れたいとかSSLにしたいとかある場合はdocker-registry-frontendのDockerHubのリポジトリのFullDiscriptionにもgithub側のREADMEにも丁寧に例があったので見てみるとよさそうです。
DockerHubとミラーリング
DockerHubとミラーリングしたい場合は以下のリンク先に書いてありました。
https必須なのとプライベートリポジトリはユーザとパスワード指定でいけるようです。
Docker Hub のミラーリング — Docker-docs-ja 17.06.Beta ドキュメント
参考
Azure へのプライベート Docker レジストリのデプロイメント – Microsoft Azure Japan Team Blog (ブログ)
Docker プライベートのイメージレジストリにタグ付きでpushする方法
プライベートなDockerレジストリサーバーをコンテナで立てる - Qiita
acs-sample/docker-compose.yml
Azure Container Serviceを使う(1) 基本のデプロイ編 - Qiita
docker/distribution: The Docker toolset to pack, ship, store, and deliver content
docker-registry-frontend
docker-composeでOS起動時にコンテナを自動起動する方法 - Qiita
ホストを再起動した時などにDockerコンテナを自動的に再起動できるようにする | Unskilled?
Using the Azure CLI 2.0 with Azure Storage | Microsoft Docs
AzureのBlobに定期バックアップファイルを投げ込む