【Docker】RancherOSで本格的な自宅サーバーを構築しよう(5) ~private registry でdocker imageを管理~


private registry でdocker imageを管理しよう

  • 通常は自作したdockerのimageをdocker hub等にあげて管理しますが、今回は private registryを自社サーバーに立て、外部に公開したくないimageをそこで管理します

関連記事

メリット

  • 外部に公開したくないimageが管理できる
  • 別の環境(ローカルのdocker等)で作成したimageをそのまま使用することができる
  • すなわち、production環境でdocker buildなど叩かないので 安全

仕様の確認

  • ローカルで作成したimageを docker push 〜〜 とすることで管理でき、puroductionサーバーですぐに使える
  • 作成したimageはregistry-frontendで確認することができる
  • docker pull 〜〜 でどこからでもimageがpullできる

使うライブラリ

  • registry:2.3.0
  • konradkleine/docker-registry-frontend:v2

registry + registry-frontend

  • registry-frontendというやつが、現在registryに何がpushされているか確認することができます
  • まずはrancherの管理画面から Add stack します

  • docker-compose.yml

    registry:
      image: registry:2.3.0
      volumes:
        - vol_registry:/var/lib/registry
      volume_driver: convoy-gluster
      ports:
        - 5000:5000
      labels:
        io.rancher.scheduler.global: 'true'
    
    registry-frontend:
      image: konradkleine/docker-registry-frontend:v2
      environment:
        - ENV_DOCKER_REGISTRY_HOST=registry
        - ENV_DOCKER_REGISTRY_PORT=5000
      links:
        - registry:registry
      ports:
        - 8888:80
    
    
  • create してしばらく待つ

httpsのエラー

  • --insecure-registryがどうたらこうたら

    FATA[0004] Error: v1 ping attempt failed with error: Get https://example.com:5000/v1/_ping: EOF.
    If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry example.com:5000` to the daemon's arguments.
    In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/example.com:5000/ca.crt
    
  • どうやら、private registryの通信にはhttps通信が使われるっぽくて、証明書ないやんっておこってくる。
    なので、httpにするように設定を書くのが楽だったからそっちでとりあえず対応

RancherOSの場合

$ sudo ros config set rancher.docker.args "['daemon','--insecure-registry,docker.ooo.com:5000']"

$ sudo ros config get rancher.docker

#ここでrestartをするわけだが、コンテナも一時的に死ぬので注意
$ sudo system-docker restart docker

boot2dockerの場合

$ boot2docker ssh
$ sudo vi /var/lib/boot2docker/profile

  EXTRA_ARGS="--insecure-registry docker.oooo.com:5000"

#ここでrestartをするわけだが、コンテナも一時的に死ぬので注意
$ sudo /etc/init.d/docker restart

CoreOSの場合

coreos:
  units:
    - name: docker.service
      drop-ins:
        - name: 50-insecure-registry.conf
          content: |
            [Service]
            Environment=DOCKER_OPTS='--insecure-registry="example.com:5000"'

## coreosをrestart

registryの動作確認

  • 別の環境からアクセスしてみる
$ docker login docker.oooo.com:5000
$ docker pull centos
$ docker tag centos docker.oooo.com:5000/centos
$ docker push docker.oooo.com:5000/centos


##いったん消してpullしてみる
$ docker images
$ docker rmi xxxxxxxx{centosのID}
$ docker pull docker.oooo.com:5000/centos

frontendの動作確認

  • frontendは外部に公開したくないので、.ssh/configでローカルフォワードの設定から8888を転送する
  • アクセスするとこんな感じ

これでregistryは設定できた

  • だいぶregistryにはハマってしまった
  • macのboot2dockerである程度開発してから、productionサーバーにpushできるようになった