Dokkuを使って自分自身のプラットフォーム・アズ・ア・サービス(PaaS)をホストする方法
Dokkuは、独自のハードウェア上で自己ホストできるPlatform-as-a-Service(PaaS)の実装です。DokkuはDockerを使用して、ターミナルからgit pushすると自動的にコードをデプロイします。
Dokkuサーバーを設定することで、馴染みのあるGitワークフローを使用して新しいアプリケーションを迅速にデプロイできます。ホスティングコストは商業的なPaaSソリューションやマネージドKubernetesオファリングよりもずっと低くなる可能性があります。Dokkuサーバーが稼働を始めれば、新しいアプリケーションの起動には数分しかかからないはずです。
始めに
Dokku はいくつかのインストール方法をサポートしています。ベアメタルハードウェアにインストールする際は、公式のブートストラップスクリプトを使用して最新バージョンをダウンロードしてください。
wget https://raw.githubusercontent.com/dokku/dokku/v0.24.7/bootstrap.sh
sudo DOKKU_TAG=v0.24.7 bash bootstrap.sh
ブートストラップスクリプトは、新しいLinuxインストールを機能するDokkuサーバーに変換します。Dockerを含むソフトウェアの依存関係は、自動的にダウンロードされ、インストールされます。このプロセスは、インターネット接続によって最大10分かかる可能性があります。
DokkuはDockerコンテナとして実行できます。これは、すでにDockerが利用可能な環境で使用している場合に理想的です。
docker run
--env DOKKU_HOSTNAME=example.com
--name doku
-p 3022:22
-p 8080:80
-p 8443:443
-v /var/lib/dokku:/mnt/dokku
-v /var/run/docker.sock:/var/run/docker.sock
dokku/dokku:0.24.7
example.comをサーバーにアクセスするために使用するホスト名に置き換えてください。この例では、ポート80と443がそれぞれホストポート8080と8443にバインドされます。ホストのポート3022はコンテナ内のポート22にマッピングされます。このポートはGit+SSH接続に使用されます。
/mnt/dokku にボリュームが作成されます。Dokku アプリケーションのデータはここに保存されます。また、ホストの Docker ソケットもコンテナにマウントされており、Dokku が Docker デーモンと対話して新しいコンテナを作成できるようになっています。
Dokkuの設定
インストールが完了したら、ブラウザでホストのIPアドレスにアクセスしてください。Dokkuにホスト名を割り当てた場合は、ここでもそれを使用できます。ウェブインストーラーが表示され、残りのセットアップを案内します。
SSHキーを「公開鍵」フィールドにコピーして貼り付けてください。Dokkuはこのキーを使用して行われる任意のSSH接続を受け入れます。他のキーは後でDokku CLIを使って追加できます。
まだ設定されていない場合は、Dokkuインストールのホスト名も設定する必要があります。マシンにドメインがマッピングされている場合は、ここに入力してください。それ以外の場合は、localhostまたはIPアドレスを使用できます。
ホスト名が設定されると、Dokkuは個別のサブドメインを使用して自動的にアプリを提供できます。ドメインが利用できない場合は、「バーチャルホスト名の使用」のチェックボックスを外してください。Dokkuは、専用のポートで各アプリを提供します。
DockerでDokkuをインストールした場合、Webセットアップはサポートされていません。コンテナを作成する際にDOKKU_HOSTNAME環境変数を設定することで、ホスト名を追加できます。SSHキーを追加するには、コンテナに接続し、Dokku CLIを使用する必要があります。
docker exec -it dokku dokku ssh-keys add my-key < /path/to/keyホスト名を設定し、SSHキーを追加すると、Dokkuは使用できる状態になります。ウェブUIを使用してのさらなる管理は不可能です。DokkuとはGitコマンドとCLIを介してやり取りします。
アプリケーションのデプロイ
さあ、あなたは初めてのアプリを公開する準備が整いました!Dokkuのデプロイメントは、git pushから始まります。Dokkuはビルドパック(Cloud NativeまたはHerokuishのいずれか)を使用して、あなたのアプリのプログラミング言語を検出し、自動的にビルドを作成します。
Dokkuは、プロジェクトにDockerfileが含まれている場合に、直接docker buildを実行することもサポートしています。この機能は、ビルドパックベースのビルダーがプロジェクトに利用できない場合にのみ使用できます。直接Dockerビルドに関する詳細情報はDokkuのドキュメントで確認できます。
ビルドパックの使用により、Dokkuはプロジェクトの作成方法にほとんど制限を設けません。人気の言語やフレームワークを使用している場合、git pushを使用してデプロイメントを作成できるはずです。こちらは基本的なReactアプリの例です:
mkdir my-app
cd my-app
npx create-react-app .
git remote add dokku dokku@example.com:my-app
git push dokku master
最後の2行が最も重要です。あなたのDokkuサーバーはGitリモートとして追加されているので、そこにコードをプッシュできます。example.comをあなたのインストールのIPまたはホスト名に置き換えてください。コロンの後の部分はプッシュするDokkuプロジェクトを示しています。それを手動で作成する必要はありません。
リモートが設定された後、コードをプッシュする準備が整いました。例のコマンドは master ブランチを Dokku にプッシュします。Dokku はあなたのプロジェクトを取り込み、適切なビルドパックを自動検出し、Docker イメージを作成し、アプリをデプロイします。
アプリドメインの添付
Dokkuはあなたのアプリをホスト名のサブドメインにデプロイします。Dokku CLIを使ってカスタムドメインを追加することができます。まず、適切なDNSレコードを設定していることを確認してください。
dokku domains:add my-app example.comexample.comにアクセスすると、あなたのmy-appデプロイメントが表示されます。
SSLを追加する
Dokkuは、アプリのSSLを有効にするのを簡単にします。DokkuとLet's Encryptを統合するプラグインを追加できます。プラグインがインストールされると、1つのコマンドでSSL証明書を取得できます。
まず、プラグインをインストールしてください:
dokku plugin:install https://github.com/dokku/dokku-letsencrypt.git次に、Let's Encryptプラグインをあなたのメールアドレスで設定します。Let's Encryptは、このアドレスを使用して、証明書に関連する警告を送信します。
dokku config:set --global no-restart DOKKU_LETSENCRYPT_EMAIL=me@example.comDokkuが証明書を自動的に更新できるように、Let's Encryptのcronジョブを追加する必要があります:
dokku letsencrypt:cron-job --add最後に、アプリケーションのためにLet's Encryptを有効にしてください:
dokku letsencrypt my-appLet's Encryptプラグインは、アプリに接続されたドメインをカバーするための証明書を取得します。その証明書は、有効期限が切れる前に自動的に更新されます。
アプリの更新
DokkuはGitワークフローの上に構築されています。コードベースの変更を行い、Gitコミットを作成し、次にあなたのブランチをDokkuにプッシュすることで、アプリを更新できます。
Dokkuが新しいプッシュを受け取ると、ビルドパックを使用して更新されたDockerコンテナを構築します。ビルドが完了すると、現在実行中のコンテナは新しいものに置き換えられます。更新はダウンタイムなしで完全に自動化されています。
ビルドプロセスの所要時間は、アプリのサイズや使用している技術によって異なります。Dokkuは、ビルドが完了した後、トラフィックを新しいコンテナに向ける前にさらに10秒待機します。これにより、ブートストラップスクリプトが完了する機会が与えられます。
Dokkuは継続的インテグレーション(CI)システムに簡単に統合できます。CIパイプラインの最終ステージは、ライブデプロイメントを更新するためのgit push dokkuになる可能性があります。
支店の管理
Dokkuは通常、masterブランチに加えられた変更をデプロイします。グローバル設定またはアプリごとの設定を使用して、異なるブランチを選択することができます:
dokku git:set --global deploy-branch dokku-deploy
dokku git:set my-app deploy-branch production
この設定では、Dokkuはデフォルトでdokku-deployブランチからデプロイを行います。しかし、my-appアプリのデプロイは代わりにproductionから行われます。
追加機能を加える
ドックは、ここで焦点を当てた基本的なデプロイメント以上のものがあります。デフォルトのディストリビューションは意図的にシンプルにされています。公式およびコミュニティのプラグインを使用することで、データベースや認証などのサービスを提供できます。これにより、ドックを静的なフロントエンドだけでなく、ステートフルなバックエンドにも使用することができます。
サービスの設定は一般に二段階のプロセスです。まず、サービスのインスタンスを作成し、その後それをアプリにリンクさせます。複数のアプリがそれぞれのサービスインスタンスに接続できます。
アプリにMySQLデータベースを追加する方法は次のとおりです:
dokku plugin:install https://github.com/dokku/dokku-mysql.git
dokku mysql:create demo-db
dokku mysql:link demo-db my-app
Dokkuは、アプリケーションコンテナ内にDATABASE_URL環境変数を設定します。この変数にアクセスして、MySQL接続文字列を取得できます。データベース用のDokkuプラグインを使用することで、別の外部データベースサーバーを管理する必要がなくなります。
結論
Dockerは、自分のアプリケーションプラットフォームをホストできるPaaSソリューションです。Dokkuが稼働したら、新しいアプリを立ち上げるのはgit pushのように簡単です。
Dokkuは、Heroku、Amazon Elastic Beanstalk、Google Firebaseなどのサービスと比較して優れています。多くの開発技術をサポートしており、特定のクラウドプロバイダーに縛られることはありません。安価なクラウドベースのVMでDokkuを実行することも、自分の物理ハードウェアに保持することもできます。

