目次

ConoHaのオブジェクトストレージを使って、PrivateなDocker Registryを構築する方法をご紹介致します。Docker Hubを使ってPrivateなリポジトリを作ることができますが、リポジトリ数に制限があったりします。オブジェクトストレージを使うことで容量を気にせずに好きなだけPrivateなリポジトリを作成することができます。


今回は「CUIのみ(docker-registry)」の方法をご紹介しようと思います。

まずDockerとは?

Dockerはアプリケーションを動作させることに特化したコンテナ型の仮想環境です。起動が早かったり、イメージさえあればどんな環境でも動いたりというメリットがあります。ここではご紹介しませんがDockerfileを使ったインフラのコード化(Infrastructure as Code)や、Kubernetesを使って運用の自動化を行なったりと様々なことができます。

Docker Registryとは?

Dockerのイメージを保存しておく場所で自分で作成したイメージを保存しておいたり、他の人とイメージを共有する時とかに使います。PrivateなDocker Registryを構築する事で公開したくない自分だけの環境を作ることができます。

CUIのみ(docker-registry)

構築方法

registryというイメージを使用します。これはDockerが公式で公開しているDocker Registryを立てるためのイメージです。

1. まずは最新のregistryをpullする

$ docker pull registry:2.6.2

2. 設定ファイルの作成

$ cat << EOF > config.yml
version: 0.1
log:
  fields:
    service: registry
storage:
  swift:
    authurl: https://identity.tyo1.conoha.io/v2.0
    username: gncuxxxxxxxx
    password: xxxxxxxx
    tenant: gnctxxxxxxxx
    container: image_container
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
EOF
項目 説明
authurl identityのURL
username APIユーザー名
password APIパスワード
tenant テナント名
container コンテナ名 使いたいコンテナ名、好きなものを設定可能


3. コンテナの起動

$ docker run -d -p 5000:5000 --name conoha-registry 
  -v `pwd`/config.yml:/etc/docker/registry/config.yml registry:2.6.2
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
xxxxxxxxxxxx        registry:2.6.2      "/entrypoint.sh /etc…"   2 seconds ago       Up 1 second         0.0.0.0:5000->5000/tcp   conoha-registry

4. docker psで表示されなかった場合は以下のコマンドで確認します

以下のように出てた場合は認証に失敗していますので、APIのユーザー名等確認しましょう。

$ docker logs conoha-registry 
panic: Swift authentication failed: Response didn't have storage url and auth token

goroutine 1 [running]:
panic(0xb7dbc0, 0xc4201942e0)
        /usr/local/go/src/runtime/panic.go:500 +0x1a1
github.com/docker/distribution/registry/handlers.NewApp(0x1066800, 0xc42033f6e0, 0xc42034ca80, 0x1066800)
        /go/src/github.com/docker/distribution/registry/handlers/app.go:123 +0x3908
github.com/docker/distribution/registry.NewRegistry(0x7efc726a91b0, 0xc42033f6e0, 0xc42034ca80, 0xc42034ca80, 0x0, 0x0)
        /go/src/github.com/docker/distribution/registry/registry.go:86 +0x213
github.com/docker/distribution/registry.glob..func1(0x108e180, 0xc4202e7ba0, 0x1, 0x1)
        /go/src/github.com/docker/distribution/registry/registry.go:55 +0x106
github.com/docker/distribution/vendor/github.com/spf13/cobra.(*Command).execute(0x108e180, 0xc4202e7b50, 0x1, 0x1, 0x108e180, 0xc4202e7b50)
        /go/src/github.com/docker/distribution/vendor/github.com/spf13/cobra/command.go:495 +0x190
github.com/docker/distribution/vendor/github.com/spf13/cobra.(*Command).Execute(0x108e320, 0xc4201aff40, 0xc4200001a0)
        /go/src/github.com/docker/distribution/vendor/github.com/spf13/cobra/command.go:560 +0x3c3
main.main()
        /go/src/github.com/docker/distribution/cmd/registry/main.go:24 +0x2d

使用方法

1. コンテナの作成

$ docker run -itd --name conoha-chan centos

2. コンテナ内に入って操作を行う

conoha-memo.txtというファイルを作成するだけです。

$ docker exec -it conoha-chan bash
# cat << EOF > conoha-memo.txt
conoha container
EOF
# cat conoha-memo.txt
conoha container
# exit

3. イメージの作成、タグを付与

「conoha-chan」というコンテナから「localhost:5000/conoha/kawaii_container」というイメージを作成しています。

$ docker stop conoha-chan
$ docker commit conoha-chan localhost:5000/conoha/kawaii_container
$ docker images
REPOSITORY                               TAG                 IMAGE ID            CREATED             SIZE
localhost:5000/conoha/kawaii_container   latest              2b68e3b20999        7 seconds ago       200MB
centos                                   latest              75835a67d134        5 weeks ago         200MB
registry                                 2.6.2               2e2f252f3c88        2 months ago        33.3MB

4. イメージをpushする

$ docker push localhost:5000/conoha/kawaii_container
The push refers to repository [localhost:5000/conoha/kawaii_container]

5. 不要なイメージ、コンテナを削除

最初に使ったCentOSのコンテナやイメージはローカルからは削除します。

$ docker rmi localhost:5000/conoha/kawaii_container
$ docker rm conoha-chan
$ docker rmi centos
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
0215a2083fd6        registry:2.6.2      "/entrypoint.sh /etc…"   35 minutes ago      Up 35 minutes       0.0.0.0:5000->5000/tcp   conoha-registry
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
registry            2.6.2               2e2f252f3c88        2 months ago        33.3MB

6. 先ほどのイメージをpullしてコンテナを作成する。

$ docker pull localhost:5000/conoha/kawaii_container
$ docker run -itd --name new-conoha-chan localhost:5000/conoha/kawaii_container
$ docker ps
CONTAINER ID        IMAGE                                    COMMAND                  CREATED             STATUS              PORTS                    NAMES
68c1f534c8b1        localhost:5000/conoha/kawaii_container   "/bin/bash"              19 seconds ago      Up 17 seconds                                new-conoha-chan
0215a2083fd6        registry:2.6.2                           "/entrypoint.sh /etc…"   38 minutes ago      Up 38 minutes       0.0.0.0:5000->5000/tcp   conoha-registry

7. コンテナ内を確認する

$ docker exec -it new-conoha-chan bash
# cat conoha-memo.txt 
conoha container

終わりに

今回はConoHaのオブジェクトストレージを使って、PrivateなDocker Registryを構築する方法をご紹介しました。イメージの作成からpushしてpullまでの簡単な動作をご紹介しましたが、設定を変更することでWebhookだったり様々なことができます。詳細についてはDocker Registryのドキュメントをご参考にしてください。

問題は解決できましたか?

お役立ち情報

ConoHaではサポートコンテンツの他にも以下のようなお役立ち情報をご用意しております。ぜひご活用ください。