azureblobにプライベートコンテナレジストリをたてる


使う予定のツール的にもレジストリ要るっぽいのとやったことないのでちょっとやってみる。
元データがblobにあれば耐障害性的にひとまずあんしんかもということで。
（障害のなかで最もアレなのはデータ消失という認識）

### [マニュアル](https://blogs.msdn.microsoft.com/windowsazurej/2014/11/28/azure-docker/)通りに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](https://qiita.com/takeshi_hirosue/items/9cfd22c2263866cece99)

### AzureBlobにコンテナを作る
ポータルからポチポチでもいけます。ストレージアカウントなければ作るところから。
権限はプライベートで大丈夫。
[Using the Azure CLI 2.0 with Azure Storage | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/storage/common/storage-azure-cli)
[AzureのBlobに定期バックアップファイルを投げ込む](https://qiita.com/smallpalace/items/7b738ecfb6782d121f75)

### プライベートコンテナレジストリに接続するときの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](https://qiita.com/eijenson/items/25b35916afa38cdf9cea)
[ホストを再起動した時などにDockerコンテナを自動的に再起動できるようにする | Unskilled?](https://unskilled.site/%E3%83%9B%E3%82%B9%E3%83%88%E3%82%92%E5%86%8D%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%9F%E6%99%82%E3%81%AA%E3%81%A9%E3%81%ABdocker%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%92%E8%87%AA%E5%8B%95%E7%9A%84/)

`docker stop container-id`
`docker run <other option> --restart=always`

### rancherからカスタムコンテナレジストリを追加

「インフラストラクチャ＞レジストリ」から登録
ユーザ認証データは不要なのでブランクで登録すればOK。

### httpでコンテナレジストリの様子を確認できるようにしてみる

LBかまして外部からアクセスとかはとりあえずいいとしてブラウザからちょっと見られるとなんとなく便利かなというだけの用途で[docker-registry-frontend](https://github.com/kwk/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のリポジトリ](
https://hub.docker.com/r/konradkleine/docker-registry-frontend/)のFullDiscriptionにも[github側のREADME](https://github.com/kwk/docker-registry-frontend)にも丁寧に例があったので見てみるとよさそうです。

### DockerHubとミラーリング

DockerHubとミラーリングしたい場合は以下のリンク先に書いてありました。
https必須なのとプライベートリポジトリはユーザとパスワード指定でいけるようです。

[Docker Hub のミラーリング — Docker-docs-ja 17.06.Beta ドキュメント](http://docs.docker.jp/registry/recipes/mirror.html)


### 参考

[Azure へのプライベート Docker レジストリのデプロイメント – Microsoft Azure Japan Team Blog (ブログ)](https://blogs.msdn.microsoft.com/windowsazurej/2014/11/28/azure-docker/)
[Docker プライベートのイメージレジストリにタグ付きでpushする方法](http://blog.tmtk.net/post/2014-02-08-docker_push_with_tag_to_private_registry/)
[プライベートなDockerレジストリサーバーをコンテナで立てる - Qiita](https://qiita.com/rsakao/items/617f54579278173d3c20)
[acs-sample/docker-compose.yml](https://github.com/derui/acs-sample/blob/master/docker-compose.yml)
[Azure Container Serviceを使う（１） 基本のデプロイ編 - Qiita](https://qiita.com/derui@github/items/64cc13016c002db69308)
[docker/distribution: The Docker toolset to pack, ship, store, and deliver content](https://github.com/docker/distribution)
[docker-registry-frontend](https://github.com/kwk/docker-registry-frontend)
[docker-composeでOS起動時にコンテナを自動起動する方法 - Qiita](https://qiita.com/eijenson/items/25b35916afa38cdf9cea)
[ホストを再起動した時などにDockerコンテナを自動的に再起動できるようにする | Unskilled?](https://unskilled.site/%E3%83%9B%E3%82%B9%E3%83%88%E3%82%92%E5%86%8D%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%9F%E6%99%82%E3%81%AA%E3%81%A9%E3%81%ABdocker%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%92%E8%87%AA%E5%8B%95%E7%9A%84/)
[Using the Azure CLI 2.0 with Azure Storage | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/storage/common/storage-azure-cli)
[AzureのBlobに定期バックアップファイルを投げ込む](https://qiita.com/smallpalace/items/7b738ecfb6782d121f75)