プライベートDockerHubをゆるく使う

Dockerを使ってるとDockerHubも使いたくなることがあると思いますが、
業務だとimageをパブリックな所に置けなかったりしますよね。

Docker Registryを使えばプライベートなDockerHubを割と簡単に構築できるので、
作り方や使い方などを備忘録も兼ねて公開したいと思います。
imageを共有できれば良いや程度のゆるい感じでやっていきます。

使用マシン

  • registry-host(Registryコンテナを起動するマシン)
  • my-pc(自分の作業PC)

自分の場合、社内の空きPCをregistry-hostとして使いました。

構築

registry-hostに以下のdocker-compose.ymlを用意してコンテナを起動します。

[registry-host]$ mkdir ~/docker_hub && cd ~/docker_hub
[registry-host]$ vi docker-compose.yml
version: '2'
services:
  registry:
    image: registry:2
    volumes:
      - ./registry:/var/lib/registry
    ports:
        - "5000:5000"
    restart: always

[registry-host]$ docker-compose up -d

volumesの指定は登録したリポジトリデータを永続化するためのものです。
初回構築時にはdocker-compose.ymlだけあれば良いです。

登録

事前設定

httpで通信する場合、my-pcのDockerでregistry-hostを許可する設定が必要です。
registry-hostの部分はご自身の環境のIPやホスト名に置き換えてください。

f:id:inocop:20181105142229p:plain

これでmy-pcからregistry-hostへimageをpushできます。
例としてalpine linuxを登録してみます。

[my-pc]$ docker pull alpine:latest
[my-pc]$ docker tag  alpine:latest registry-host:5000/my-alpine:latest
[my-pc]$ docker push registry-host:5000/my-alpine:latest

登録の確認

リポジトリ一覧
[my-pc]$ curl http://registry-host:5000/v2/_catalog
{"repositories":["my-alpine"]}
タグ一覧

repositoriy名を指定して、タグ一覧を取得します。
この例ではmy-alpineを指定しています。

[my-pc]$ curl http://registry-host:5000/v2/my-alpine/tags/list
{"name":"my-alpine","tags":["latest"]}
Pull
[my-pc]$ docker pull registry-host:5000/my-alpine:latest

削除

リポジトリの削除
[registry-host]$ cd ~/docker_hub/registry/docker/registry/v2/repositories
[registry-host]$ rm -rf <repositoriy-name>
タグの削除
[registry-host]$ cd ~/docker_hub/registry/docker/registry/v2/repositories
[registry-host]$ rm -rf <repositoriy-name>/_manifests/tags/<tag-name>

たぶん削除用のAPIとかあると思うんですが、今のところディレクトリ削除で何とかなってます。
削除自体あまりしないですし、壊れたらまたPushすればいいやってノリです。


今回はゆるく使うということでimageの管理は適当ですが、
ちゃんと管理したい人はPortusというのを使うと色々出来そうです。

port.us.org

まぁ自分だったら、これ以上は面倒なので素直にaws ECRとかを使いますが。


以上、現場からでした。