CFアプリ開発と管理#4 Dockerでアプリをデプロイする

このトピックでは、Cloud Foundryコマンドラインインターフェイス（CLI）を使用して、新しいDockerイメージまたは更新されたDockerイメージでアプリケーションをプッシュする方法について説明します。 Cloud Foundryは、Dockerイメージを使用してアプリのコンテナを作成します。Cloud FoundryでのDockerの動作については、[Cloud FoundryでのDockerの使用](http://docs.cloudfoundry.org/adminguide/docker.html)に関するトピックを参照してください。

*注意事項：この記事は、Cloud Foundry Documentaion [Deploy an App with Docker](http://docs.cloudfoundry.org/devguide/deploy-apps/push-docker.html)(last updated: July 20, 2017)からの独自の翻訳とコメントです。内容を保証するものではありません。* 


*コメント：IBM Blumemix には、IBM Container Support の機能があり、Docker イメージのデプロイを実施することができます。しかし、本文書は、IBMの提供する拡張機能ではなく、Cloud Foundry Diego の標準機能についての記述です。*


## 要件

Dockerでアプリをpushするには、次のものが必要です。

* Dockerサポートが[有効](http://docs.cloudfoundry.org/adminguide/docker.html#enable)になっているCloud Foundry（CF）デプロイメント。
* Dockerハブまたは別の[Dockerレジストリ](https://hub.docker.com/)上のDockerイメージの場所。
  * レジストリ：
      * [Docker Registry HTTP API V2](https://docs.docker.com/registry/spec/api/)をサポートします。
      * HTTPSトラフィックの有効な証明書を提示します。

  * これらのポート番号が一致すること：
      * コンテナが公開するために、画像のDockerfileで設定された[EXPOSE](https://docs.docker.com/engine/reference/builder/)ポート。
      * アプリケーションがリッスンするように設定されたPORT環境変数。 アプリで [PORT](http://docs.cloudfoundry.org/devguide/deploy-apps/environment-variable.html#PORT) が指定されていない場合、Cloud Foundryではデフォルトで8080に設定されます。

*コメント: IBM Bluemix では Dockerサポート機能が有効になっていました。【Qiita】[Bluemix で Cloud Foundry Docker Support を使ってみた](http://qiita.com/MahoTakara/items/db1e662bd19a8ad60ba1)を参照してください。*


## Docker Hub 上の DockerイメージをPushする

Docker Hubリポジトリからコンテナ・イメージを展開するには、次のコマンドを実行します。

~~~
$ cf push APP-NAME --docker-image REPO/IMAGE:TAG
~~~

上記のコマンドで次の値を置き換えます。

* APP-NAME：プッシュされているアプリの名前
* REPO：イメージが格納されているリポジトリの名前
* IMAGE：Docker Hubのコンテナ・イメージの名前
* TAG：コンテナ・イメージのタグまたはバージョン（オプション）

たとえば、次のコマンドはDocker Hubのmy-imageイメージをCloud Foundryアプリケーションにプッシュします。

~~~
$ cf push my-app --docker-image cloudfoundry/my-image
~~~



## プライベート・レジストリからDockerイメージをpushする

Docker Hubの代わりに、会社内部のDockerレジストリなど、正式な証明書を持つHTTPSのDockerイメージ・レジストリを使用できます。
指定したDockerレジストリを使用してDockerイメージを展開するには、次のコマンドを実行します。

~~~
$ cf push APP-NAME --docker-image MY-PRIVATE-REGISTRY.DOMAIN:PORT/REPO/IMAGE:TAG
~~~

上記のコマンドの値を次のように置き換えます。

* APP-NAME：プッシュされるアプリの名前
* MY-PRIVATE-REGISTRY.DOMAIN：Dockerレジストリへのパス
* PORT：レジストリがトラフィックを処理するポート
* REPO：イメージが格納されているリポジトリの名前
* IMAGE：プッシュされているコンテナ・イメージの名前
* TAG：コンテナ・イメージのタグまたはバージョン（オプション）

例えば：

~~~
$ cf push my-app --docker-image internal-registry.example.com:5000/my-repo/my-image:v2
~~~


## 認証付きのレジストリからDockerイメージをpushする

多くのDockerレジストリは、ユーザー名とパスワードで認証してDockerイメージへのアクセスを制御します。 レジストリ認証を使用してDockerイメージを展開するには：
CF_DOCKER_PASSWORD環境変数をDockerレジストリユーザのパスワードに設定した状態で、cf pushを--docker-imageと--docker-usernameで実行します。
     


~~~
$ CF_DOCKER_PASSWORD=YOUR-PASSWORD cf push APP-NAME --docker-image REPO/IMAGE:TAG --docker-username USER
~~~


上記のコマンドの値を次のように置き換えます。

* YOUR-PASSWORD: レジストリとの認証に使用するパスワード
* APP-NAME：プッシュされているアプリの名前
* REPO：イメージが格納されているリポジトリ： 
   Docker Hubでは、これは単にリポジトリ名です
   プライベートレジストリの場合、これには、プライベートレジストリからのドッカー画像のプッシュで説明されているように、レジストリアドレスとポートが含まれます。MY-PRIVATE-REGISTRY.DOMAIN：PORT / REPO
* IMAGE：プッシュされているコンテナ・イメージの名前
* TAG：コンテナ・イメージのタグまたはバージョン（オプション）
* USER：レジストリとの認証に使用するユーザー名
   
   
## DockerのVolumeサポート

DiegoはDockerボリュームをサポートしています。 ボリュームサポートを有効にする方法の詳細については、「[外部ファイルシステムの使用（ボリュームサービス）](http://docs.cloudfoundry.org/devguide/services/using-vol-services.html)」を参照してください。 NFSボリュームの制限事項については、「[NFS Bosh Volume Release](https://github.com/cloudfoundry/nfs-volume-release#special-notes-for-docker-image-based-apps)」を参照してください。

*コメント: IBM Bluemix では PaaSとしてファイルシステムサービスが提供されていません。 Bluemix Infrastructure の ファイルシステムサービス Endurance Storageなどを利用する場合、インターネット回しとなるために、通信料が発生します。*