Save 37% off PRO during our Black Friday Sale! »

PortusでプライベートDockerレジストリを作ってみよう 設定編

PortusでプライベートDockerレジストリを作ってみよう 設定編

2018年2月23日(金)に発表した、「PortusでプライベートDockerレジストリを作ってみよう」の、付属資料です。Portusを動かす時の設定内容を説明しています。

2b3af8a2652d7e6c9caf92e6b1fe7c34?s=128

hashimotosyuta

March 11, 2018
Tweet

Transcript

  1. Portus で プライベート Docker レジストリを作ってみよう 〜設定編〜 橋本修太 – openSUSE-UG syuta.hashimoto@gmail.com

  2. 2 この資料に付いて OSC 東京 2018 年 spring で発表しました、 「 Portus

    でプライベート registry を作ってみよう」の中 にありました、 Portus の構築手順を詳細に述べたもの です。 • 使用バージョン Portus 2.3 最後に、自作のサンプルデータの紹介をしています。 とにかく動かしてみたい方等はこちらもどうぞ。
  3. 設定編

  4. 4 方針 公式のデータをダウンロード その中に example として docker compose で起動 するサンプルがあるので、それを改変して使用

    チュートリアル的に細かい指定等していますが、明るい所 は各自好みに設定してください。 URL ( GitHub ) https://github.com/SUSE/Portus URL (公式サイト) http://port.us.org/
  5. 5 docker-compose で起動する構成 nginx リバースプロキシ Portus regstry background registry と

    Portus の同期等 DB インターネット・イントラネット ・それぞれが docker コンテナ ・ SSL 通信を行う
  6. 6 ステップ ①サンプルデータをダウンロード( github ) ②ファイアーウォールの設定( 80,443 ) ③設定ファイルを編集(マシン FQDN

    を設定) ④自己証明書を作成、インストール ⑤起動    ------- ここからは Portus にて -------- A)admin ユーザーを作成 B)registry を登録 C)push したり、 pull したり
  7. 7 ステップ ①サンプルデータをダウンロード( github ) ②ファイアーウォールの設定( 80,443 ) ③設定ファイルを編集(マシン FQDN

    を設定) ④自己証明書を作成、インストール ⑤起動    ------- ここからは Portus にて -------- A)admin ユーザーを作成 B)registry を登録 C)push したり、 pull したり
  8. 8 ① サンプルデータをダウンロード • 公式をダウンロード > git clone --depth 1

    -b v2.3 https://github.com/SUSE/Portus.git ➢ 【 --depth 1 】最新版のみを取得し、データ量を減らす ➢ 【 -b v2.3 】バージョン 2.3 のブランチを指定 • Portus/examlples/compose ディレクトリがサンプル データの配置場所なので移動 > cd Portus/examples/compose • 以降はこのディレクトリで作業 ちなみに、 Portus ディレクトリ直下は Portus のソース
  9. 9 ディレクトリ構成 ├── .env - docker-compose ファイル用の設定ファイル ├── README.md ├──

    docker-compose.insecure.yml │ - SSL 無し用の docker-compose ファイル ├── docker-compose.yml │ - SSL 通信用 docker-compose ファイル ├── nginx │ └── nginx.conf - nginx 設定ファイル ├── registry │ ├── config.yml - registry 設定ファイル │ └── init - registry 起動時初期化ファイル │ 証明書の登録を行う └── secrets - 証明書格納ディレクトリ └── .gitignore
  10. 10 ディレクトリ構成 追加分 以下は、必要に応じて作成。 詳細は使用する場面で説明。 ├── Portus │ └── config -

    Portus の設定ファイル格納ディレクトリ ├── mariadb_volume │ - mariadb のボリューム用ディレクトリ └── registry_volume - registry のボリューム用ディレクトリ
  11. 11 ステップ ①サンプルデータをダウンロード( github ) ②ファイアーウォールの設定( 80,443 ) ③設定ファイルを編集(マシン FQDN

    を設定) ④自己証明書を作成、インストール ⑤起動    ------- ここからは Portus にて -------- A)admin ユーザーを作成 B)registry を登録 C)push したり、 pull したり
  12. 12 ② ファイアーウォールの設定( 80,443 )   • リバースプロキシで使用する、 MACHINE FQDN

    の 80 番、 443 番のファイアーウォールを開放。 • 外部公開しない場合でも、 Portus と Registry の やりとりでここを使う為、開放する必要がある。 • 当然、 80 番、 443 番で既に稼働しているサービス があれば停止。 openSUSE なら YaST で簡単設定
  13. 13 ステップ ①サンプルデータをダウンロード( github ) ②ファイアーウォールの設定( 80,443 ) ③設定ファイルを編集(マシン FQDN

    を設定) ④自己証明書を作成、インストール ⑤起動    ------- ここからは Portus にて -------- A)admin ユーザーを作成 B)registry を登録 C)push したり、 pull したり
  14. 14 docker-compose 全体の設定 対象コンテナ nginx リバースプロキシ Portus registry background registry

    と Portus の同期等 DB
  15. 15 docker-compose 全体の設定 設定ファイルは二つ • .env docker-compose.yml で使われる変数に値を設定する → 「

    MACHINE_FQDN 」を適切に設定 • docker-compose.yml docker-compose で参照する設定ファイル この中の ${MACHINE_FQDN} は、 .env に記述した 値に置き換えられる 各個別ファイルの設定より優先される
  16. 16 nginx の設定 対象コンテナ nginx リバースプロキシ Portus registry background registry

    と Portus の同期等 DB
  17. 17 nginx の設定 docker-compose.yml その 1 nginx の設定個所は二つ 1.docker-compose.yml の

    service:nginx セクション ポイントを抜粋 nginx: ーーーーーーーーーーーーーーーーーー ports: - リバースプロキシのポートをホストで公開 - 80:80 - 443:443  ーーーーーーーーーーーーーーーーーー
  18. 18 nginx の設定 nginx.conf nginx の設定個所は二つ 2.nginx/nginx.conf nginx の設定ファイル リバースプロキシを設定している →http

    の server の server_name に、   MACHINE_FQDN を設定 設定ファイルの中の「 portus 」「 registry 」は、 docker- compose.yml で定義しているサービス名 docker-compose で起動した各サービスは、このサービス名でアク セス出来る
  19. 19 Portus の設定 対象コンテナ nginx リバースプロキシ Portus registry background registry

    と Portus の同期等 DB
  20. 20 Portus の設定 docker-compose.yml その 1 Portus の設定個所は二つ 1.docker-compose.yml の

    service:portus セクション ポイントを抜粋 portus: image: opensuse/portus:head 【推奨】変更→ image: opensuse/portus:2.3 head は master ブランチを指している為、変動する バージョン指定なら大きな変化が無く設定しやすい
  21. 21 Portus の設定 docker-compose.yml その 2 Portus の設定個所は二つ 1.docker-compose.yml の

    service:portus セクション ポイントを抜粋 volumes: - ./secrets:/certificates:ro - static:/srv/Portus/public 【推奨】追記: -./Portus/config/config.yml: /srv/Portus/config/config.yml Portus の設定ファイルである config.yml をマウントさせる。   これにより、設定ファイルで設定が出来る。    clone したディレクトリの config/config.yml を元にする。 
  22. 22 Portus の設定 config.yml Portus の設定個所は二つ 2.Portus/config/config.yml 全体的な設定。 LDAP 設定等、

    Portus の各種設定が行える。 手動でファイルを複製し、 docker-compose.yml でマウントの設 定をする事で利用可能。 →machine_fqdn value: に MACHINE_FQDN  を設定  ・・・実は、設定は docker-compose.yml が優先   され、そちらに MACHINE_FQDN は設定されている   ので、必須事項では無い。   しかし、可読性の為、設定を推奨。
  23. 23 registry の設定 対象コンテナ nginx リバースプロキシ Portus registry background registry

    と Portus の同期等 DB
  24. 24 registry の設定 registry の設定ファイルは三つ 1.docker-compose.yml の service:registry セクション ポイントを抜粋

    registry: volumes: - /var/lib/portus/registry:/var/lib/registry 【推奨】変更→ - ./registry_volume:/var/lib/registry /var/lib/portus/registry のままだと /var/lib/ 配下に データが作成され、コンテナを再作成した場合や別パターン で生成した場合に、データが引き継がれてしまう。 逆に、データを持ち回りたい時は変更しないで良い。 変更する場合はディレクトリを作成する。
  25. 25 registry の設定 registry の設定ファイルは三つ 2.registry/config.yml registry の詳細設定。特に手を加える所は無し。 3.registry/init 起動時の設定スクリプト。証明書を読み込んでくれる。

    docker-compose.yml の中で COMMAND エントリで指定され ている。
  26. 26 background の設定 対象コンテナ nginx リバースプロキシ Portus registry background registry

    と Portus の同期等 DB
  27. 27 background の設定 docker-compose.yml background の設定ファイルは一つ • docker-compose.yml の      

    service:background セクション background: image: opensuse/portus:head 【推奨】変更→ image: opensuse/portus:2.3 head は master ブランチを指している為、変動する バージョン指定なら大きな変化が無く設定しやすい 【 background とは】 Portus と registry の同期を行ったり、 Clair (脆弱性診断)を走ら せたりする。 実体は portus イメージ
  28. 28 DB の設定 対象コンテナ nginx リバースプロキシ Portus registry background registry

    と Portus の同期等 DB これ
  29. 29 DB の設定 docker-compose.yml その 1 DB の設定個所は二つ 1.docker-compose.yml の

    service:db セクション ポイントを抜粋 【推奨】追記: volumes: - ./mariadb_volume:/var/lib/mysql データ領域にローカルのディレクトリをマウントする。 無くても、コンテナの中にデータが作成されるが、コンテナを終了 するとデータが消えてしまうため、この方法等で永続化させる。 【 DB とは】 Portus はデータを DB に格納する。その為のコンテナ。 Postgres 用のドライバもある。 
  30. 30 ステップ ①サンプルデータをダウンロード( github ) ②ファイアーウォールの設定( 80,443 ) ③設定ファイルを編集(マシン FQDN

    を設定) ④自己証明書を作成、インストール ⑤起動    ------- ここからは Portus にて -------- A)admin ユーザーを作成 B)registry を登録 C)push したり、 pull したり
  31. 31 自己証明書の作成 証明書があればそれを利用。無ければ自己証明書の作成 を行う。 作成した秘密鍵と証明書を、 secrets ディレクトリへ格納 する。そうする事で、 Portus 、

    registry 、 background 、 nginx の各コンテナが読み込んでくれる。 secrets ├── portus.crt └── portus.key これを作成。 名称は docker-compose.yml に書かれているので、この通りにす る。
  32. 32 自己証明書の作成方法 1 自己証明書を作成する場合 ① 証明書格納フォルダ「 secrets 」へ移動 > cd

    secrets ② 自己証明書を作成 • CommonName(CN) が MACHINE_FQDN と同じ になるように • SAN ( Subject Alternative Name )が MACHINE_FQDN と同じになるように →registry が、証明書の使用に SAN を見る ( SAN が設定されていないと docker login でエラー となる)
  33. 33 自己証明書の作成方法 2 SAN の設定 ・ openSUSE の場合なら例えばこんな方法 > cp

    /etc/ssl/openssl.cnf ./san.cnf 標準の作成ファイルを複製し、編集   [ v3_ca ]  のセクションに、 subjectAltName=IP:{MACHINE_FQDN} を追加 ( ドメイン名なら DNS:{MACHINE_FQDN} )
  34. 34 自己証明書の作成方法 3 例えばこんなコマンドで作成 > openssl req -newkey rsa:4096 \

    -nodes \ -sha256 \ -keyout ./portus.key \ -x509 \ -days 365 \ -out ./portus.crt \ -config san.cnf  ←先程作成した           設定ファイルを使用
  35. 35 自己証明書の作成方法 4 ちなみに CN や SAN の確認は・・・   >

    openssl x509 -text -noout -in portus.crt ・ Subject の所に、 CN={MACHINE_FQDN} とある ・ X509v3 Subject Alternative Name の所に、   IP Address:{MACIHNE_FQDN} とある (DNS なら、 DNS:{MACHINE_FQDN})
  36. 36 自己証明書のインストール 証明書のインストールターゲットは二つ ① 各サーバーへインストール  →「 secrets 」フォルダに入れておけば OK ②

    クライアントの docker へインストール  →「 /etc/docker/certs.d/{MACHINE_FQDN} 」   というディレクトリを( root で)作成し、   その中に証明書を ca.crt という名前で複製   その後、 docker を再起動。   この②の作業を、 Portus を使いたい   各クライアントで行う
  37. 37 ステップ ①サンプルデータをダウンロード( github ) ②ファイアーウォールの設定( 80,443 ) ③設定ファイルを編集(マシン FQDN

    を設定) ④自己証明書を作成、インストール ⑤起動    ------- ここからは Portus にて -------- A)admin ユーザーを作成 B)registry を登録 C)push したり、 pull したり
  38. 38 ⑤ 起動 • 作業していたディレクトリ( example/compose) で、 > docker-compose up

    色鮮やかなログが出力される。 その後、 https://{MACHINE_FQDN} にアクセスし て、 Portus の画面が表示されれば無事起動終了。 (リバースプロキシなので、ポートの指定は不要。 また、ルーティングを細かく設定していないので、 http でアクセスしてしまうとエラーとなる)
  39. ここからは Portus で

  40. 40 Portus でのステップ 1.admin 作成 2.registry 登録 3.(必要に応じて)ユーザーの作成 docker login

    、 push 、 pull が利用可能
  41. 41 1. admin の作成 • 初回ログイン時のユーザー がアドミンとなる • この機能は Portus/config/config.y

    ml でオフに出来る • rake で CLI でアドミンユー ザーを作成する事も可能
  42. 42 2. registry 登録 • 続いて registry の登録

  43. 43 registry の設定方法 • registry が設定されていないと、この設定画面にリダイレクト される • Name は好きな名前を入力

    • Hostname に .env で指定した {MACHINE_FQDN} の 値を入力 (上部の説明等に” e.g. registry.test.lan:5000” とある が、リバースプロキシなのでポートは不要) • SSL 通信を設定しているので、 Use SSL にチェック • すべて上手くいけば「 Create 」がアクティブになりクリッ ク可能に
  44. 44 3. (必要に応じて)ユーザーの作成 • admin でログイン、 admin 画面の Users で作

    成可能 • その他、チーム、ネームスペースを必要に応じて 作成 (画面等は「 Portus でプライベート docker レ ジストリを作ってみよう」参照)
  45. それでは Portus を 使ってみよう

  46. 46 docker login • まずは Login MACHINE_FQDN が 192.168.0.4 とすると、

       > docker login 192.168.0.4 ユーザー名とパスワードを尋ねられるので、 Portus で 作成したユーザー情報を入力 nginx をリバースプロキシにしているので、ポート番号は 不要
  47. 47 push 用 tag 付け • login ができれば、イメージの Push 等は

    docker hub と同じ • まず、イメージに tag を付ける 前半のネームスペースの所を参照 先頭に、 {MACHINE_FQDN} (サーバー)を追加   > docker tag opensuse:latest 192.168.0.4/PortusUser/local_opensuse:latest サーバー ネーム スペース リポジトリ名(タグ付き)
  48. 48 docker push & docker pull あとは push   >

    docker push 192.168.0.4/PortusUser/local_opensuse:latest Pull も同様に可能   > docker pull 192.168.0.4/PortusUser/local_opensuse:latest • もちろん docker login してなければ権限エラー Portus の画面で Push したイメージの確認や 履歴を見てみましょう
  49. 最後に

  50. 50 手元で image 管理 • docker-compose.yml を設計・運用に合わせて書き換 えればおおよそ OK •

    今回の設定内容のサンプルを作成しています。あまりメン テナンスする予定は無いのですが、よければ使ってみて下さ い。 https://github.com/syutadeveloper/osc_2018_ tokyo_spring_Portus.git • ポート、リンクの設定に不要部分がある為、そこをコメントアウトして います。 • clone 後、 .env の MACHINE_FQDN を書き換え、 secrets 内で証明書を作成し、 portus.crt を /etc/docker/certs.d/ {MACHINE_FQDN}/ca.crt に複製すれば、 docker- compose up で Portus が使えます。( 80 、 443 のポートは開 放しましょう。)
  51. Thank you. Join the conversation, contribute & have a lot

    of fun! www.opensuse.org
  52. General Disclaimer This document is not to be construed as

    a promise by any participating organisation to develop, deliver, or market a product. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. openSUSE makes no representations or warranties with respect to the contents of this document, and specifically disclaims any express or implied warranties of merchantability or fitness for any particular purpose. The development, release, and timing of features or functionality described for openSUSE products remains at the sole discretion of openSUSE. Further, openSUSE reserves the right to revise this document and to make changes to its content, at any time, without obligation to notify any person or entity of such revisions or changes. All openSUSE marks referenced in this presentation are trademarks or registered trademarks of SUSE LLC, in the United States and other countries. All third-party trademarks are the property of their respective owners. License This slide deck is licensed under the Creative Commons Attribution-ShareAlike 4.0 International license. It can be shared and adapted for any purpose (even commercially) as long as Attribution is given and any derivative work is distributed under the same license. Details can be found at https://creativecommons.org/licenses/by-sa/4.0/ Credits Template Richard Brown rbrown@opensuse.org Design & Inspiration openSUSE Design Team http://opensuse.github.io/branding- guidelines/