Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

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

hashimotosyuta

March 11, 2018
Tweet

More Decks by hashimotosyuta

Other Decks in Technology

Transcript

  1. Portus で
    プライベート Docker
    レジストリを作ってみよう
    〜設定編〜
    橋本修太 – openSUSE-UG
    [email protected]

    View Slide

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

    View Slide

  3. 設定編

    View Slide

  4. 4
    方針
    公式のデータをダウンロード
    その中に example として docker compose で起動
    するサンプルがあるので、それを改変して使用
    チュートリアル的に細かい指定等していますが、明るい所
    は各自好みに設定してください。
    URL ( GitHub )
    https://github.com/SUSE/Portus
    URL (公式サイト)
    http://port.us.org/

    View Slide

  5. 5
    docker-compose で起動する構成
    nginx
    リバースプロキシ
    Portus regstry background
    registry と Portus の同期等
    DB
    インターネット・イントラネット
    ・それぞれが docker コンテナ ・ SSL 通信を行う

    View Slide

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

    View Slide

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

    View Slide

  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 のソース

    View Slide

  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

    View Slide

  10. 10
    ディレクトリ構成 追加分
    以下は、必要に応じて作成。
    詳細は使用する場面で説明。
    ├── Portus
    │ └── config - Portus の設定ファイル格納ディレクトリ
    ├── mariadb_volume
    │ - mariadb のボリューム用ディレクトリ
    └── registry_volume
    - registry のボリューム用ディレクトリ

    View Slide

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

    View Slide

  12. 12
    ② ファイアーウォールの設定( 80,443 )
     

    リバースプロキシで使用する、 MACHINE FQDN
    の 80 番、 443 番のファイアーウォールを開放。

    外部公開しない場合でも、 Portus と Registry の
    やりとりでここを使う為、開放する必要がある。

    当然、 80 番、 443 番で既に稼働しているサービス
    があれば停止。
    openSUSE なら
    YaST で簡単設定

    View Slide

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

    View Slide

  14. 14
    docker-compose 全体の設定
    対象コンテナ
    nginx
    リバースプロキシ
    Portus registry background
    registry と Portus の同期等
    DB

    View Slide

  15. 15
    docker-compose 全体の設定
    設定ファイルは二つ
    • .env
    docker-compose.yml で使われる変数に値を設定する
    → 「 MACHINE_FQDN 」を適切に設定
    • docker-compose.yml
    docker-compose で参照する設定ファイル
    この中の ${MACHINE_FQDN} は、 .env に記述した
    値に置き換えられる
    各個別ファイルの設定より優先される

    View Slide

  16. 16
    nginx の設定
    対象コンテナ
    nginx
    リバースプロキシ
    Portus registry background
    registry と Portus の同期等
    DB

    View Slide

  17. 17
    nginx の設定 docker-compose.yml その 1
    nginx の設定個所は二つ
    1.docker-compose.yml の service:nginx セクション
    ポイントを抜粋
    nginx:
    ーーーーーーーーーーーーーーーーーー
    ports: - リバースプロキシのポートをホストで公開
    - 80:80
    - 443:443
     ーーーーーーーーーーーーーーーーーー

    View Slide

  18. 18
    nginx の設定 nginx.conf
    nginx の設定個所は二つ
    2.nginx/nginx.conf
    nginx の設定ファイル リバースプロキシを設定している
    →http の server の server_name に、
      MACHINE_FQDN を設定
    設定ファイルの中の「 portus 」「 registry 」は、 docker-
    compose.yml で定義しているサービス名
    docker-compose で起動した各サービスは、このサービス名でアク
    セス出来る

    View Slide

  19. 19
    Portus の設定
    対象コンテナ
    nginx
    リバースプロキシ
    Portus registry background
    registry と Portus の同期等
    DB

    View Slide

  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 ブランチを指している為、変動する
    バージョン指定なら大きな変化が無く設定しやすい

    View Slide

  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 を元にする。 

    View Slide

  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 は設定されている
      ので、必須事項では無い。
      しかし、可読性の為、設定を推奨。

    View Slide

  23. 23
    registry の設定
    対象コンテナ
    nginx
    リバースプロキシ
    Portus registry background
    registry と Portus の同期等
    DB

    View Slide

  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/ 配下に
    データが作成され、コンテナを再作成した場合や別パターン
    で生成した場合に、データが引き継がれてしまう。
    逆に、データを持ち回りたい時は変更しないで良い。
    変更する場合はディレクトリを作成する。

    View Slide

  25. 25
    registry の設定
    registry の設定ファイルは三つ
    2.registry/config.yml
    registry の詳細設定。特に手を加える所は無し。
    3.registry/init
    起動時の設定スクリプト。証明書を読み込んでくれる。
    docker-compose.yml の中で COMMAND エントリで指定され
    ている。

    View Slide

  26. 26
    background の設定
    対象コンテナ
    nginx
    リバースプロキシ
    Portus registry background
    registry と Portus の同期等
    DB

    View Slide

  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 イメージ

    View Slide

  28. 28
    DB の設定
    対象コンテナ
    nginx
    リバースプロキシ
    Portus registry background
    registry と Portus の同期等
    DB これ

    View Slide

  29. 29
    DB の設定 docker-compose.yml その 1
    DB の設定個所は二つ
    1.docker-compose.yml の service:db セクション
    ポイントを抜粋
    【推奨】追記:
    volumes:
    - ./mariadb_volume:/var/lib/mysql
    データ領域にローカルのディレクトリをマウントする。
    無くても、コンテナの中にデータが作成されるが、コンテナを終了
    するとデータが消えてしまうため、この方法等で永続化させる。
    【 DB とは】
    Portus はデータを DB に格納する。その為のコンテナ。
    Postgres 用のドライバもある。 

    View Slide

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

    View Slide

  31. 31
    自己証明書の作成
    証明書があればそれを利用。無ければ自己証明書の作成
    を行う。
    作成した秘密鍵と証明書を、 secrets ディレクトリへ格納
    する。そうする事で、 Portus 、 registry 、 background 、
    nginx の各コンテナが読み込んでくれる。
    secrets
    ├── portus.crt
    └── portus.key
    これを作成。
    名称は docker-compose.yml
    に書かれているので、この通りにす
    る。

    View Slide

  32. 32
    自己証明書の作成方法 1
    自己証明書を作成する場合
    ① 証明書格納フォルダ「 secrets 」へ移動
    > cd secrets
    ② 自己証明書を作成
    • CommonName(CN) が MACHINE_FQDN と同じ
    になるように
    • SAN ( Subject Alternative Name )が
    MACHINE_FQDN と同じになるように
    →registry が、証明書の使用に SAN を見る
    ( SAN が設定されていないと docker login でエラー
    となる)

    View Slide

  33. 33
    自己証明書の作成方法 2
    SAN の設定
    ・ openSUSE の場合なら例えばこんな方法
    > cp /etc/ssl/openssl.cnf ./san.cnf
    標準の作成ファイルを複製し、編集
      [ v3_ca ]
     のセクションに、
    subjectAltName=IP:{MACHINE_FQDN}
    を追加
    ( ドメイン名なら DNS:{MACHINE_FQDN} )

    View Slide

  34. 34
    自己証明書の作成方法 3
    例えばこんなコマンドで作成
    > openssl req -newkey rsa:4096 \
    -nodes \
    -sha256 \
    -keyout ./portus.key \
    -x509 \
    -days 365 \
    -out ./portus.crt \
    -config san.cnf  ←先程作成した
              設定ファイルを使用

    View Slide

  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})

    View Slide

  36. 36
    自己証明書のインストール
    証明書のインストールターゲットは二つ
    ① 各サーバーへインストール
     →「 secrets 」フォルダに入れておけば OK
    ② クライアントの docker へインストール
     →「 /etc/docker/certs.d/{MACHINE_FQDN} 」
      というディレクトリを( root で)作成し、
      その中に証明書を ca.crt という名前で複製
      その後、 docker を再起動。
      この②の作業を、 Portus を使いたい
      各クライアントで行う

    View Slide

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

    View Slide

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

    View Slide

  39. ここからは Portus で

    View Slide

  40. 40
    Portus でのステップ
    1.admin 作成
    2.registry 登録
    3.(必要に応じて)ユーザーの作成
    docker login 、 push 、 pull
    が利用可能

    View Slide

  41. 41
    1. admin の作成
    • 初回ログイン時のユーザー
    がアドミンとなる
    • この機能は
    Portus/config/config.y
    ml でオフに出来る
    • rake で CLI でアドミンユー
    ザーを作成する事も可能

    View Slide

  42. 42
    2. registry 登録
    • 続いて registry の登録

    View Slide

  43. 43
    registry の設定方法
    • registry が設定されていないと、この設定画面にリダイレクト
    される
    • Name は好きな名前を入力
    • Hostname に .env で指定した {MACHINE_FQDN} の
    値を入力
    (上部の説明等に” e.g. registry.test.lan:5000” とある
    が、リバースプロキシなのでポートは不要)
    • SSL 通信を設定しているので、 Use SSL にチェック
    • すべて上手くいけば「 Create 」がアクティブになりクリッ
    ク可能に

    View Slide

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

    View Slide

  45. それでは Portus を
    使ってみよう

    View Slide

  46. 46
    docker login
    • まずは Login
    MACHINE_FQDN が 192.168.0.4 とすると、
       > docker login 192.168.0.4
    ユーザー名とパスワードを尋ねられるので、 Portus で
    作成したユーザー情報を入力
    nginx をリバースプロキシにしているので、ポート番号は
    不要

    View Slide

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

    View Slide

  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 したイメージの確認や
    履歴を見てみましょう

    View Slide

  49. 最後に

    View Slide

  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 のポートは開
    放しましょう。)

    View Slide

  51. Thank you.
    Join the conversation,
    contribute & have a lot of fun!
    www.opensuse.org

    View Slide

  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
    [email protected]
    Design & Inspiration
    openSUSE Design Team
    http://opensuse.github.io/branding-
    guidelines/

    View Slide