Dockerのプライベートレジストリ(docker registry v1)に対してCoreOS上でdocker pushをhttpsではなくhttpで行う

あるサーバ(ホスト名:example.com)にdockerをインストールしておき、

$ docker run -p 5000:5000 registry

でDockerのプライベートレジストリを動かしているとします。

それに対して、クライアント側としてcoreos上で構築したdockerイメージをpushしようとする際、

$ docker tag XXXXXXXXXXXX example.com:5000/imagename
$ docker push example.com:5000/imagename

としますが、https通信が必要なため、

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

となってしまいます。

解決するためには

クライアント側のdockerサービスに対して

  • insecure-registryオプションをつけてhttpアクセス
  • 証明書を正しくインストールしてhttpsアクセス

のどちらかが必要になり、httpで通信するためには前者の対応が必要になります。

dockerサービスの起動オプションにinsecure-registryを渡すためには、CoreOSが持っているcloud-initの機構を利用して

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

でCoreOSインスタンスを起動することで

$ docker tag XXXXXXXXXXXX example.com:5000/imagename
$ docker push example.com:5000/imagename
The push refers to a repository [example.com:5000/imagename] (len: 1)
Sending image list
Pushing repository example.com:5000/imagename (1 tags)
XXXXXXXXXXXX: Image successfully pushed
XXXXXXXXXXXX: Image successfully pushed
XXXXXXXXXXXX: Image successfully pushed
Pushing tag for rev [XXXXXXXXXXXX] on {http://example.com:5000/v1/repositories/imagename/tags/latest}

とhttpでpushが可能になります。

CoreOS Vagrantを使っている場合

user-data.sampleuser-dataにリネームして、そこに上記の内容を追記したのち、vagrant upします。

Vagrantfile単体でcoreosを使っている場合

CoreOS Vagrantの記述を利用

  1. Vagrantfileと同じ場所にuser-dataという名前のファイルを作成し、上記の内容を記述します。
  2. Vagrantfileに下記内容を追加
    CLOUD_CONFIG_PATH = File.join(File.dirname(__FILE__), "user-data")
    if File.exist?(CLOUD_CONFIG_PATH)
      config.vm.provision :file, :source => "#{CLOUD_CONFIG_PATH}", :destination => "/tmp/vagrantfile-user-data"
      config.vm.provision :shell, :inline => "mv /tmp/vagrantfile-user-data /var/lib/coreos-vagrant/", :privileged => true
    end
    
  3. vagrant up

参考

Customize with Cloud-Config
https://coreos.com/docs/cluster-management/setup/cloudinit-cloud-config/
Docker Private Registry – Qiita (設定ファイルを書き換える方法)
http://qiita.com/megmogmog1965/items/0c9a95bcf7f054f5c065

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中