このドキュメントで説明されているソフトウェアはサポートされていないか、拡張サポートが提供されています。
現在サポートされているリリースにアップグレードすることをお薦めします。

5.2 ローカルのDockerレジストリ・サーバーを設定

Dockerレジストリ・サーバーを設定する前に、次の点に注意してください:

  • レジストリ・サーバーはDockerコンテナ・アプリケーションです。 パブリックDockerハブまたはサポートが必要な場合は、Oracle Container Registryからレジストリ・イメージをダウンロードするには、ホストにインターネット接続が必要です。

  • レジストリ・サーバーは、デフォルトでポート5000上で実行されます。 OpenStack Keystoneサービスなど、同じTCPポートを使用する代替サービスを実行する場合は、ポートの競合を避けるために構成を変更する必要があります。 レジストリ・サーバーへのアクセスを必要とするすべてのシステムは、このポートで自由に通信できる必要があるため、これを防ぐファイアウォール・ルールを調整してください。

  • レジストリ・ホストには、WebサーバーにSSLを使用する場合と同様に、有効なSecure Sockets Layer(SSL)証明書と秘密鍵が必要です。

    ホストにすでにSSL証明書がある場合は、その証明書を使用できます。 ただし、中間証明機関(CA)によってSSL証明書が発行された場合は、ホストSSL証明書と中間CA証明書を組み合わせてDockerがホストSSL証明書を検証できるように証明書バンドルを作成する必要があります。 次に例を示します。

    # cat registry.example.com.crt intermediate-ca.pem > domain.crt

    ホストにまだSSL証明書がない場合は、次の手順でテスト目的で自己署名証明書を作成する方法について詳しく説明します。

  • レジストリ・サーバーには、レジストリ・データを格納するために少なくとも15GBの空きディスク容量が必要です。 これは通常/var/lib/registryにあります。 この目的のために、別のbtrfs形式のファイルシステムを作成して、簡単にレジストリを拡張し、このファイルシステム内のスナップショットなどの機能を活用できるようにすることをお勧めします。 次の手順では、1つまたは複数の使用可能なデバイスを使用してbtrfsファイルシステムを設定する方法について詳しく説明します。 デバイスは、ディスク・パーティション、LVMボリューム、ループバック・デバイス、マルチパス・デバイス、またはLUNのいずれかです。

Dockerレジストリ・サーバーを設定するには:

  1. レジストリのbtrfsファイルシステムを作成します。

    btrfsファイルシステムは、btrfs-progsパッケージで使用可能なユーティリティを使用して作成します。このパッケージは、デフォルトでインストールする必要があります。

    1つまたは複数のブロック・デバイスでbtrfsファイルシステムを作成します:

    # mkfs.btrfs [-L label] block_device ...

    ここで、-L labelは、ファイルシステムのマウントに使用できるオプションのラベルです。

    次に例を示します。

    • パーティション/dev/sdc1にファイルシステムを作成するには:

      # mkfs.btrfs -L var-lib-registry /dev/sdc1

      パーティションはすでに存在している必要があります。 必要に応じてfdisk(MBRパーティション)やgdisk(GPTパーティション)などのユーティリティを使用して作成します。

    • 2つのディスク・デバイス間でファイルシステムを作成するには、/dev/sdd/dev/sde:

      # mkfs.btrfs -L var-lib-registry /dev/sd[de]

      デフォルトの構成では、ファイルシステムのデータ(raid0)をストライプ化し、ファイルシステムのメタデータ(raid1)をデバイス間でミラー・リングします。 必要なRAID構成を指定するには、-d(data)および-m(metadata)オプションを使用します。 raid10では、偶数のデバイスを指定する必要があり、少なくとも4つのデバイスが必要です。

    • olボリューム・グループ内のdocker-registryという名前の論理ボリュームにファイル・システムを作成するには、次のようにします:

      # mkfs.btrfs -L var-lib-registry /dev/ol/docker-registry

      論理ボリュームはすでに存在していなければなりません。 必要に応じてLogical Volume Manager(LVM)を使用して作成します。

    btrfsファイルシステムの作成の詳細については、次の「Oracle Linux管理者ガイドforリリース6」を参照してください:

    https://docs.oracle.com/cd/E37670_01/E41138/html/ol_create_btrfs.html

  2. /var/lib/registryにbtrfsファイルシステムをマウントします。

    1. btrfsファイルシステムを含むデバイスのUUIDを取得します。

      blkidコマンドを使用してデバイスのUUIDを表示し、次のようにこの値を書きとめておきます。

      # blkid /dev/sdc1 
      /dev/sdc1: LABEL="var-lib-registry" UUID="50041443-b7c7-4675-95a3-bf3a30b96c17" \
      UUID_SUB="09de3cb1-2f9b-4bd8-8881-87e591841c75" TYPE="btrfs"

      btrfsファイルシステムが複数のデバイスにまたがって作成されている場合は、いずれかのデバイスを指定してUUIDを取得できます。 または、btrfsファイルシステム・ショーコマンドを使用してUUIDを表示することもできます。 論理ボリュームの場合は、/dev/ol/docker-registryなどのデバイスとして論理ボリュームへのパスを指定します。 UUID_SUBの値は無視してください。

    2. /etc/fstabファイルを編集し、システムの起動時にファイルシステムが確実にマウントされるようにエントリを追加します。

      UUID=UUID_value /var/lib/registry  btrfs  defaults  0 0

      UUID_valueを前のステップで見つかったUUIDに置き換えます。 btrfsファイルシステムのラベルを作成した場合は、UUIDの代わりにラベルを使用することもできます。たとえば、次のようにします:

      LABEL=label /var/lib/registry  btrfs  defaults  0 0
    3. /var/lib/registryディレクトリを作成します。

      # mkdir /var/lib/registry
    4. /etc/fstabにリストされているすべてのファイルシステムをマウントします。

      # mount -a
    5. ファイルシステムがマウントされていることを確認します。

      # df
      Filesystem     1K-blocks    Used Available Use% Mounted on
      ...
      /dev/sdc1            ...    ...  ...       1%   /var/lib/registry
      
  3. DockerにホストのSSL証明書と秘密鍵を追加します。

    1. /var/lib/registry/conf.dディレクトリを作成します。

      # mkdir -p /var/lib/registry/conf.d
    2. ホストのSSL証明書と秘密鍵を/var/lib/registry/conf.dディレクトリにコピーします。

      # cp certfile /var/lib/registry/conf.d/domain.crt
      # cp keyfile /var/lib/registry/conf.d/domain.key

      ここで、certfileはホストのSSL証明書へのフルパスで、keyfileはホストの秘密鍵へのフルパスです。 次に例を示します。

      # cp /etc/pki/tls/certs/registry.example.com.crt \
      /var/lib/registry/conf.d/domain.crt
      # cp /etc/pki/tls/private/registry.example.com.key \
      /var/lib/registry/conf.d/domain.key

      ホストにSSL証明書と秘密鍵がない場合は、次のようにテスト目的で自己署名証明書を作成できます:

      # cd /var/lib/registry/conf.d
      
      # openssl req -newkey rsa:4096 -nodes -sha256 -x509 -days 365 \
      -keyout domain.key -out domain.crt
      Generating a 4096 bit RSA private key
      ............................................................................................
      ............................................................................................
      .....++
      ............................................................................................
      ............................................................................................
      .........................++
      writing new private key to 'domain.key'
      -----
      You are about to be asked to enter information that will be incorporated
      into your certificate request.
      What you are about to enter is what is called a Distinguished Name or a DN.
      There are quite a few fields but you can leave some blank
      For some fields there will be a default value,
      If you enter '.', the field will be left blank.
      -----
      Country Name (2 letter code) [XX]:US
      State or Province Name (full name) []: Massachusetts
      Locality Name (eg, city) [Default City]:Boston
      Organization Name (eg, company) [Default Company Ltd]:Example Com
      Organizational Unit Name (eg, section) []:DevOps            
      Common Name (eg, your name or your server's hostname) []:registry.example.com
      Email Address []:admin@example.com

      共通名は、ホストの完全修飾ドメイン名(FQDN)と同じである必要があります。

    3. 秘密鍵のファイル・アクセス権を変更する:

      # chmod 600 /var/lib/registry/conf.d/domain.key 
  4. ファイアウォールを実行している場合は、待機するDockerレジストリに接続するTCPポートがアクセス可能であることを確認する必要があります。

    iptablesを実行している場合は、次のようにルールを追加できます:

    # iptables -I INPUT -p tcp -m tcp --dport 5000 -j ACCEPT
    # service iptables save
  5. Dockerレジストリ・コンテナを作成します。

    # docker run -d -p 5000:5000 --name registry --restart=always \
        -v /var/lib/registry:/registry_data \
        -e REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/registry_data \
        -e REGISTRY_HTTP_TLS_KEY=/registry_data/conf.d/domain.key \
        -e REGISTRY_HTTP_TLS_CERTIFICATE=/registry_data/conf.d/domain.crt \
        registry:latest
    Unable to find image 'registry:latest' locally
    latest: Pulling from library/registry
    8387d9ff0016: Pull complete 
    3b52deaaf0ed: Pull complete 
    4bd501fad6de: Pull complete 
    a3ed95caeb02: Pull complete 
    1d4dc7bffbb8: Pull complete 
    7c4baf947271: Pull complete 
    e14b922ad4f5: Pull complete 
    f1d1dbdd4f97: Pull complete 
    f2bbca3948d0: Pull complete 
    4e3899dc28fa: Pull complete 
    Digest: sha256:f374c0d9b59e6fdf9f8922d59e946b05fbeabaed70b0639d7b6b524f3299e87b
    Status: Downloaded newer image for registry:latest
    e6232c2bae1f4918d22e931b3b40434aea5ab2964c0e3e01b67a1481f780425b

    レジストリ・イメージがパブリックDocker Hubから取得され、Dockerレジストリ・コンテナが開始されます。 --restart=alwaysオプションは、Dockerが起動されるたびにレジストリ・コンテナが開始されるようにします。 必要に応じて、上記のコマンドの5000を、使用したいポート番号と一致するように変更して、ドッキング・レジストリの代替ポート番号をマップすることができます。

  6. レジストリ・ホストが自己署名SSL証明書を使用する場合は、ローカルDockerレジストリを使用するデプロイメント内のallホストにSSL証明書を配布する必要があります。

    次のステップを実行します。各ホスト上で(registry_hostnameはレジストリ・ホストの名前)、portはDockerレジストリ・サーバー用に選択したポート番号(デフォルトは5000)です:

    1. /etc/docker/certs.d/registry_hostname:portディレクトリを作成します。

      # mkdir -p /etc/docker/certs.d/registry_hostname:port
    2. レジストリ・ホストからSSL証明書をコピーします。

      # scp root@registry_hostname:/var/lib/registry/conf.d/domain.crt \
      /etc/docker/certs.d/registry_hostname:port/ca.crt

      次に例を示します。

      # mkdir -p /etc/docker/certs.d/registry.example.com:5000
      # scp \
      root@registry.example.com:/var/lib/registry/conf.d/domain.crt \
      /etc/docker/certs.d/registry.example.com:5000/ca.crt
    3. dockerサービスを再起動します。

      # service docker restart