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に登録されます。
- Public SSH Keys
gitコマンドにコマンドに使用するSSH公開鍵。 - Hostname
ドメイン名。 - 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を開き、以下の画面が表示されると確認完了になります。
アンインストール
# 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)]
※複数指定する場合は、,(カンマ)区切りで指定。
実行例
$