Dokku

環境構築

現時点(2019/9/9現在)では、UbuntuまたはDebianのみサポート。CentOSはexperimentalが提供されているっぽいですが試してません。
※参考:http://dokku.viewdocs.io/dokku/getting-started/installation/ external_link

ダウンロード及びインストール

$ wget https://raw.githubusercontent.com/dokku/dokku/v0.18.3/bootstrap.sh $ sudo DOKKU_TAG=v0.18.3 bash bootstrap.sh

公開鍵の登録

ブラウザからサーバにアクセスするとDokku Setup画面が表示されるので、SSHキーを入力し「Finish Setup」を押下します。
※登録した鍵は/home/dokku/.ssh/authorized_keyに登録されます。 dokkusetup.jpg

  1. Public SSH Keys
    gitコマンドにコマンドに使用するSSH公開鍵。
  2. Hostname
    ドメイン名。
  3. Use Virtualhost naming for apps
    アプリケーション名をサブドメインにする場合はチェック。「http\://<app-name>.<domain>」の形式でアクセス可能。

動作確認

正しくインストールされたか確認するため、the Heroku Ruby on Rails "Getting Started" app. external_linkを使用して動作確認します。

サーバ側

# アプリケーション作成 $ dokku apps:create ruby-getting-started # postgres pluginのインストール(root権限が必要) $ sudo dokku plugin:install https://github.com/dokku/dokku-postgres.git # postgresデータベース作成。(名前:railsdatabase) $ dokku postgres:create railsdatabase # 作成したデータベースとアプリケーションをリンク $ dokku postgres:link railsdatabase ruby-getting-started

ローカルマシン側

# クローン取得 $ git clone https://github.com/heroku/ruby-getting-started.git # remoteに追加し、push(dokku.meは自分のドメインに読み替える) $ cd ruby-getting-started $ git remote add dokku dokku@dokku.me:ruby-getting-started $ git push dokku master

pushすると自動的にビルドし、デプロイされます。
デプロイ完了後にブラウザからアプリケーションのURLを開き、以下の画面が表示されると確認完了になります。 ruby-getting-started.jpg

アンインストール

# dokku herokuishの削除 $ apt-get purge dokku herokuish # 必要に応じてdockerも削除 $ apt-get docker-ce-cli $ apt-get autoremove

アプリケーション管理

アプリケーションの一覧

コマンド形式

apps:list

実行例

$ dokku apps:list =====> My Apps node-js-sample ruby-getting-started

※簡略化表示したい場合、dokkuコマンドに–quietを指定する。

$ dokku --quiet apps:list node-js-sample ruby-getting-started

アプリケーションの存在確認

コマンド形式

apps:exists <app>

アプリケーションが存在する場合は0の値を返却し、存在しない場合は0以外の値を返却します。

実行例

$ dokku apps:exists ruby-getting-started ※存在する場合 -----> App already exists ※存在しない場合 App does not exist

アプリケーション作成

コマンド形式

apps:create <app>

実行例

$ dokku apps:create node-js-app -----> Creating node-js-app... done

アプリケーション削除

コマンド形式

apps:destroy <app>

実行例

$ dokku apps:destroy node-js-app ! WARNING: Potentially Destructive Action ! This command will destroy node-js-app (including all add-ons). ! To proceed, type "node-js-app" > node-js-app                    ※アプリケーション名の入力が求められます Destroying node-js-app (including all add-ons) Unlinking from railsdatabase App node-js-app has not been deployed -----> Cleaning up...

問い合わせ無しで削除したい場合は、dokkuコマンドに–forceを指定します。

$ dokku --force apps:destroy node-js-app Destroying node-js-app (including all add-ons) Unlinking from railsdatabase App node-js-app has not been deployed -----> Cleaning up...

アプリケーション名の変更

コマンド形式

apps:rename <old-app> <new-app>

実行例

$ dokku apps:rename node-js-app io-js-app -----> Creating io-js-app... done Destroying node-js-app (including all add-ons) Unlinking from railsdatabase App node-js-app has not been deployed -----> Cleaning up... -----> Cleaning up... Renaming node-js-app to io-js-app... done

アプリケーションの複製

コマンド形式

apps:clone [--skip-deploy] [--ignore-existing] <old-app> <new-app> --skip-deploy : 複製のみでデプロイはスキップする。 --ignore-existing : new-appが既に存在していた場合、0を返却する。(指定しなかった場合、0以外を返却。)

複製されるアプリケーションには以下の制限があります。

  • データベースのURLを含む全ての環境変数が保持されます。
  • カスタムドメインは新しいアプリケーションに適用されません。
  • SSL証明書は新しいアプリケーションにコピーされません。
  • httpsのスキーマとホストの443ポートのマッピングはスキップされます。

実行例

$ dokku apps:clone node-js-app io-js-app -----> Creating io-js-app... done -----> Cloning node-js-app to io-js-app... done

アプリケーションのロック/アンロック

ロックを使用することで、一定期間デプロイを無効化することができます。

コマンド形式

apps:lock <app> apps:unlock <app> apps:locked <app>

実行例

# ロック $ dokku apps:lock node-js-sample -----> Deploy lock created # ロック状態確認 $ dokku apps:locked node-js-sample Deploy lock exists # アンロック $ dokku apps:unlock node-js-sample ! A deploy may be in progress. ! Removing the app lock will not stop in progress deploys. -----> Deploy lock removed

レポート出力

コマンド形式

apps:report [<app>] [<flag>] app : 出力するアプリケーション。指定しなかった場合は全てのアプリケーションを出力。 flag : 出力する情報。指定しなかった場合は全ての情報を出力。

実行例

アプリケーション指定
$ dokku apps:report ruby-getting-started =====> ruby-getting-started app information App dir: /home/dokku/ruby-getting-started Git sha: 6037674 Deploy source: git Locked: false
アプリケーション+情報指定
$ dokku apps:report ruby-getting-started --git-sha 6037674

アプリケーションログ

コマンド形式

○直近のログを出力

logs <app> [-h] [-t] [-n num] [-q] [-p process] -h : -t, --tail : 出力内容をリアルタイムで更新。 -n, --num : 画面に出力する行数。 -q, --quiet : RAWデータを出力。(文字色、時刻、アプリケーション名は出力しない) -p, --ps : 画面に出力するプロセス。

○最後に失敗したデプロイのログを出力

logs:failed [<app>]

実行例

○dokku logs ruby-getting-started

$ dokku apps:rename node-js-app io-js-app 2019-09-13T19:37:32.710348749Z app[web.1]: [8] Puma starting in cluster mode... 2019-09-13T19:37:32.710619587Z app[web.1]: [8] * Version 3.11.2 (ruby 2.4.4-p296), codename: Love Song 2019-09-13T19:37:32.710775099Z app[web.1]: [8] * Min threads: 5, max threads: 5 2019-09-13T19:37:32.710928898Z app[web.1]: [8] * Environment: production 2019-09-13T19:37:32.711078665Z app[web.1]: [8] * Process workers: 2 2019-09-13T19:37:32.711351229Z app[web.1]: [8] * Preloading application 2019-09-13T19:37:40.392532902Z app[web.1]: [8] * Listening on tcp://0.0.0.0:5000 2019-09-13T19:37:40.400286865Z app[web.1]: [8] Use Ctrl-C to stop 2019-09-13T19:37:40.408249283Z app[web.1]: [8] - Worker 0 (pid: 157) booted, phase: 0 2019-09-13T19:37:40.412525678Z app[web.1]: [8] - Worker 1 (pid: 169) booted, phase: 0 2019-09-16T05:23:42.521275188Z app[web.1]: [8] ! Terminating timed out worker: 157 2019-09-16T05:23:43.609182402Z app[web.1]: [8] - Worker 0 (pid: 185) booted, phase: 0

○最後に失敗したデプロイのログを出力

$ dokku logs:failed ruby-getting-started =====> ruby-getting-started failed deploy logs ! No failed containers found

リモートコマンド

コマンド形式

○dokkuコマンド

dokku [--quiet] [--trace] [--rm] [--force] <command> --quiet : ヘッダ出力なし。 --trace : DOKKU_TRACEを有効にして実行。 --rm, --rm-container : dokku run成功後にdockerコンテナを削除。 --force : apps:destroyや他の:destroyコマンドで問い合わせをせずに強制実行。

○sshコマンド

ssh -t dokku@dokku.me -- [--quiet] [--trace] [--rm] [--force] <command> ※オプションの内容はdokkuコマンドと同様。

コマンド実行

コマンド形式

run [-e KEY=VALUE] <app> <cmd> -e, --env : 環境変数を設定する

実行例

$ dokku run ruby-getting-started ls -lah total 108K drwxr-xr-x 1 herokuishuser herokuishuser 4.0K Sep 13 19:36 . drwxr-xr-x 1 root root 4.0K Sep 16 09:14 .. drwxr-xr-x 8 herokuishuser herokuishuser 4.0K Sep 13 19:33 app -rw-r--r-- 1 herokuishuser herokuishuser 281 Sep 13 19:33 app.json drwxr-xr-x 2 herokuishuser herokuishuser 4.0K Sep 13 19:36 bin drwxr-xr-x 2 herokuishuser herokuishuser 4.0K Sep 13 19:33 .bundle drwxr-xr-x 5 herokuishuser herokuishuser 4.0K Sep 13 19:33 config -rw-r--r-- 1 herokuishuser herokuishuser 154 Sep 13 19:33 config.ru drwxr-xr-x 3 herokuishuser herokuishuser 4.0K Sep 13 19:33 db ~~~ 省略 ~~~ $ dokku run --env "PATH=/usr/sbin:/usr/bin:/sbin:/bin" --env "NODE_ENV=development" ruby-getting-started env USER=herokuishuser DOKKU_POSTGRES_RAILSDATABASE_PORT_5432_TCP=tcp://172.17.0.2:5432 DOKKU_POSTGRES_RAILSDATABASE_ENV_POSTGRES_PASSWORD=bdcf4d9a0a973402d6736c8d423f6435 DOKKU_POSTGRES_RAILSDATABASE_PORT_5432_TCP_PROTO=tcp RACK_ENV=production DOKKU_APP_TYPE=herokuish DOKKU_POSTGRES_RAILSDATABASE_ENV_PG_VERSION=11.4-1.pgdg90+1 DYNO=run.6139 PATH=/app/bin:/app/vendor/bundle/bin:/app/vendor/bundle/ruby/2.4.0/bin:/usr/sbin:/usr/bin:/sbin:/bin ~~~ 省略 ~~~

Tip

  • Procfileに定義したコマンドを実行
console: bundle exec racksh
$ dokku run my-app console  ※bundle exec rackshが実行される。
  • コマンド実行後、コンテナを削除
# コマンド実行後、コンテナを削除 $ dokku config:set --global DOKKU_RM_CONTAINER=1 # コンテナを保持する設定に戻す $ dokku config:unset --global DOKKU_RM_CONTAINER

以下の方法でも実行可能です。

# コマンド実行後、コンテナを削除 $ dokku --rm-container run node-js-app ls -lah # コンテナを保持する設定に戻す $ dokku --rm run node-js-app ls -lah
  • detachモードで起動 detachモードで起動すると、すぐにCONTAINER_IDが返却されます。
    detachモードではコンテナは自動的に終了しないため、ユーザが適切な方法で管理する必要があります。
$ dokku --detach run node-js-app ls -lah

コンテナをdetachモードで実行する場合、–rm-containerや–rmフラグを使用することは出来ません。
これらのオプションが指定された場合、–detachは無視されます。

コンテナ管理

コンテナ一覧

コマンド形式

ps <app>

実行例

$ dokku ps ruby-getting-started ! Deprecated: Please use ps:report -----> running processes in container: 36f09d53f29499a42545b3d180315ac2f14e347314d295f937609f7bf189038b USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 4668 0 ? Ssl Sep15 0:01 /start web herokui+ 8 0.0 2.3 296272 46984 ? Sl Sep15 0:14 puma 3.11.2 (tcp://0.0.0.0:5000) [app] /puma.rb herokui+ 169 0.0 2.4 843308 50336 ? Sl Sep15 0:16 puma: cluster worker 1: 8 [app] /puma.rb herokui+ 185 0.0 2.4 843176 49256 ? Sl 05:23 0:04 puma: cluster worker 0: 8 [app] /puma.rb root 199 101 0.0 4624 832 pts/0 Ss+ 10:12 0:01 /bin/sh -c ps auxwww root 204 0.0 0.1 34396 2888 pts/0 R+ 10:12 0:00 ps auxwww

コンテナ情報取得

コマンド形式

ps:inspect <app>

実行例

$ dokku ps:inspect ruby-getting-started [ { "AppArmorProfile": "docker-default", "Args": [ "web" ], "Config": { "AttachStderr": false, "AttachStdin": false, "AttachStdout": false, "Cmd": [ "/start", "web" ], "Domainname": "", "Entrypoint": null, ~~~~ 省略 ~~~~

アプリケーションのリビルド

コマンド形式

ps:rebuild <app> # アプリケーション指定 ps:rebuildall # 全アプリケーション

実行例

$ dokku ps:rebuild ruby-getting-started -----> Cleaning up... -----> Building ruby-getting-started from herokuish... -----> Adding BUILD_ENV to build environment... -----> Ruby app detected ~~~~ 省略 ~~~~

アプリケーション再起動

コマンド形式

ps:restart <app> # アプリケーション指定 ps:restartall # 全アプリケーション

実行例

$ dokku ps:restart ruby-getting-started -----> Releasing ruby-getting-started (dokku/ruby-getting-started:latest)... -----> Deploying ruby-getting-started (dokku/ruby-getting-started:latest)... -----> App Procfile file found (/home/dokku/ruby-getting-started/DOKKU_PROCFILE) DOKKU_SCALE declares scale -> web=1 -----> Attempting pre-flight checks For more efficient zero downtime deployments, create a file CHECKS. See http://dokku.viewdocs.io/dokku/deployment/zero-downtime-deploys/ for examples CHECKS file not found in container: Running simple container check... -----> Waiting for 10 seconds ... -----> Default container check successful! ~~~~ 省略 ~~~~

プロセスのスケーリング

コマンド形式

ps:scale <app> <proc>=<count> [<proc>=<count>]

実行例

設定表示
$ dokku ps:scale ruby-getting-started -----> Scaling for ruby-getting-started proctype qty -------- --- web: 1
設定変更
$ dokku ps:scale ruby-getting-started web=2 -----> Scaling ruby-getting-started:web to 2 -----> Releasing ruby-getting-started (dokku/ruby-getting-started:latest)... -----> Deploying ruby-getting-started (dokku/ruby-getting-started:latest)... -----> App Procfile file found (/home/dokku/ruby-getting-started/DOKKU_PROCFILE) DOKKU_SCALE declares scale -> web=2 -----> Attempting pre-flight checks For more efficient zero downtime deployments, create a file CHECKS. See http://dokku.viewdocs.io/dokku/deployment/zero-downtime-deploys/ for examples CHECKS file not found in container: Running simple container check... -----> Waiting for 10 seconds ... ~~~~ 省略 ~~~~

アプリケーション停止

コマンド形式

ps:stop <app> # アプリケーション指定 ps:stopall # 全アプリケーション

実行例

$ dokku ps:stop ruby-getting-started Stopping ruby-getting-started ...

アプリケーション起動

コマンド形式

ps:start <app> # アプリケーション指定 ps:startall # 全アプリケーション

実行例

$ dokku ps:start ruby-getting-started -----> Releasing ruby-getting-started (dokku/ruby-getting-started:latest)... -----> Deploying ruby-getting-started (dokku/ruby-getting-started:latest)... -----> App Procfile file found (/home/dokku/ruby-getting-started/DOKKU_PROCFILE) DOKKU_SCALE declares scale -> web=1 -----> Attempting pre-flight checks For more efficient zero downtime deployments, create a file CHECKS. See http://dokku.viewdocs.io/dokku/deployment/zero-downtime-deploys/ for examples CHECKS file not found in container: Running simple container check... -----> Waiting for 10 seconds ... ~~~~ 省略 ~~~~

再起動ポリシー

コマンド形式

ps:restart-policy <app> # 表示 ps:set-restart-policy <app> <policy> # 反映 policy : 以下の値が設定可能。 always : 終了したコンテナは常に再起動する。 no : 終了したコンテナは再起動しない。 unless-stopped : 手動停止しなかった場合のみDocker再起動時に再起動する。 on-failure : 終了ステータスが0以外のみ再起動する。 on-failure:times : 終了ステータスが0以外のみ最大times回数再起動する。

実行例

$ dokku ps:restart-policy ruby-getting-started =====> ruby-getting-started restart-policy: on-failure:10

レポート出力

コマンド形式

ps:report [<app>] [<flag>]

実行例

アプリケーション指定
$ dokku ps:report ruby-getting-started =====> ruby-getting-started ps information Processes: 1 Deployed: true Running: true Restore: true Restart policy: on-failure:10 Ps can scale: true Status web.1: running (CID: 8c47bb0e4af8)
アプリケーション+flag指定
$ dokku ps:report ruby-getting-started --restart-policy on-failure:10

SSH鍵管理

鍵一覧

コマンド形式

ssh-keys:list

実行例

$ dokku ssh-keys:list SHA256:[鍵データ] NAME="admin1" SSHCOMMAND_ALLOWED_KEYS="no-agent-forwarding,no-user-rc,no-X11-forwarding,no-port-forwarding"

鍵追加

コマンド形式

ssh-keys:add <name> [/path/to/key]

※複数指定する場合は、,(カンマ)区切りで指定。

実行例

$

チェックスキップ

コマンド形式

ssh-keys:remove <name>

※複数指定する場合は、,(カンマ)区切りで指定。

実行例

$

デプロイのダウンタイム管理

設定表示

コマンド形式

checks <app>

実行例

$ dokku checks ruby-getting-started ! Deprecated: Please use checks:report -----> App Name Proctypes Disabled Proctypes Skipped ruby-getting-started none none

無効化

コマンド形式

checks:disable <app> [process-type(s)]

※複数指定する場合は、,(カンマ)区切りで指定。

実行例

$ dokku checks:disable ruby-getting-started web -----> Disabling zero downtime for app's (ruby-getting-started) proctypes (web)

チェックスキップ

コマンド形式

checks:skip <app> [process-type(s)]

※複数指定する場合は、,(カンマ)区切りで指定。

実行例

$ dokku checks:skip ruby-getting-started web -----> Skipping zero downtime for app's (ruby-getting-started) proctypes (web)

レポート出力

コマンド形式

checks:report [<app>] [<flag>]

※複数指定する場合は、,(カンマ)区切りで指定。

実行例

アプリケーション指定
$ dokku checks:report ruby-getting-started =====> ruby-getting-started checks information Checks disabled list: none Checks skipped list: web
アプリケーション+flag指定
$ dokku checks:report ruby-getting-started --checks-disabled-list none

有効化

コマンド形式

checks:enable <app> [process-type(s)]

※複数指定する場合は、,(カンマ)区切りで指定。

実行例

$

チェック実行

コマンド形式

checks:run <app> [process-type(s)]

※複数指定する場合は、,(カンマ)区切りで指定。

実行例

$

Buildpackによるデプロイ

Dockerfileによるデプロイ

Dockerイメージによるデプロイ

Tarballによるデプロイ

環境変数

ドメイン設定

Nginx設定

SSL設定

DMS設定

ネットワーク管理

ポート管理

Proxy管理

バックアップ/リカバリ

デプロイタスク

Dockerコンテナオプション

イベントログ

永続的ストレージ

プラグイン管理

リポジトリ管理

リソース管理

Dockerローカルスケジューラ

プラグイン作成

プラグイントリガ

実行テスト

リリースプロセス

クライアント

プラグイン

Gitlab CIでのデプロイ

外部ストレージ上でのDokku起動