vagrantのshell provisionerにrun: “always”オプションを使うことでvagrant upするたびにdocker-composeを実行させる

開発環境をVagrantDocker(docker-compose)で構築したのですが、毎回コンテナを起動するために

  1. vagrant up
  2. SSHでゲストOSにログイン
  3. ゲストOS上でdocker-compose up

という手順を踏んでいました。

VagrantとDockerを使ったPHP実行環境を生成するサービス:PHPDocker.io – PHP and Docker development environment generator で生成されるVagrantfileを見ると、以下の方法でdocker-composeを起動させていました。

    # Bring up containers
    config.vm.provision "shell", run: "always", inline: "cd /home/docker/sample/phpdocker && docker-compose up -d 1>&2"

runオプションはProvisionerの共通オプションで、デフォルトでは最初のvagrant upでのみprovisionerが実行されますが、alwaysを指定することで、vagrant up, vagrant reloadのたびに実行されるようになります。

実際には以下のようにして使っています。

冒頭の3.のdocker-compose upはserver.shというスクリプトに書いてserver.sh upとして使っていました。

#!/bin/bash -eu

PWD=$(cd $(dirname $0); pwd)
PROJNAME=sampleproject

ARGS=
if [ $# -eq 0 ];then
    ARGS="up -d"
else
    ARGS=$@
fi

cd $PWD && docker-compose -p $PROJNAME $ARGS

Vagrantfileに以下の内容を追加しました。

  config.vm.provision "shell", run: "always", inline: "[ -f /home/vagrant/sampleproject/server.sh ] && /home/vagrant/sampleproject/server.sh"
広告

プライベートGyazoサービスの構築

スクリーンショットをサーバにアップロードしてURLで共有できるGyazoというサービスがあります。
このOpen Source ClientのコードがGitHubにあるので、これでプライベートGyazoサービスを構築します。

今回の構成は

  • クライアント
    • Windows 10
    • gyazo/Gyazowinをもとにアップロード先URLを変更したものを作成
  • サーバー
    • Ubuntu 14.04
    • gyazo/GyazoのServerにあるRubyスクリプトを使う
    • Gyazoサーバプログラムはインストールから動作までDocker内で行う
    • アップロードされた画像、プログラム内部で利用するデータベースのような動的生成されるデータはdockerのマウント機能を使ってサーバ上に保存する

という形にしました。

サーバー側

必要なもの

  • Docker (記事執筆時に利用したのは1.7.1)
  • サービス用のドメイン

ドメインは http://~ でアクセスできるようにDNSで関連付けておいてください。

今回はgyazo.example.jpとしました。

  1. Gyazo用のディレクトリを作成
    mkdir gyazo
    cd gyazo
    
  2. Dockerfileを作成

    11行目の[SERVERDOMAIN]はサービス用のドメインに置き換えてください。

    例)

    RUN sed -i -e "s/gyazo.com/gyazo.example.jp\/data/" /usr/local/apache2/htdocs/upload.cgi
    
  3. イメージを作成

    docker buildでイメージを作成します。イメージにgyazoという名前を付けます。

    docker build --rm -t gyazo .
    
  4. gyazoイメージからgyazoという名前でコンテナを起動する
    docker run -d -p 80:80 --name gyazo -v `pwd`/data:/usr/local/apache2/htdocs/data -v `pwd`/db:/usr/local/apache2/htdocs/db gyazo
    
  5. http://gyazo.example.jp にアクセスして動作を確認

    「It’s works」がでればOK。

    Itsworks

クライアント側

必要なもの

  • Visual Studio 2015 Community (本記事ではインストール時に既定でインストールしています)
  1. ソースコードの取得

    gyazo/Gyazowinからソースコードをクローン、またはダウンロードします。今回はZIPでダウンロードしました。

  2. ZIPを展開して中にある、「gyazowin.sln」をダブルクリックで開く

    gyazowin.slnはVisual Studio 2015よりも古いフォーマットのファイルのため、アップグレード警告が表示されます。そのままアップグレードします。
    またVC++の開発環境がない場合、ここで追加インストールのウィザードが始まるのでインストールしたのち、gyazowin.slnを開きなおします。

    Upgrade_1Upgrade_2Upgrade_3

    InstallVC_2
    InstallVC_3

  3. コードの編集

    gyazowinはスクリーンショット画像をgyazoに送信する機能を持っていますが、送信先はソースコードにハードコーティングされているため、そこを今回用意したサーバへ変更します。

    gyazowin.cppの794行目のupload.gyazo.comgyazo.example.jpに変更します。

    Diff_gyazowin

  4. ビルドの実行

    1. メニュー「ビルド」の下にあるソリューション構成を「Debug」から「Release」に変更する
      Build Settings
    2. メニュー「ビルド」→「ソリューションのビルド」でビルドを実行

    正常に終了すれば、Releaseディレクトリが作成され、中にgyazowin.exeが生成されます。

  5. 実行確認

    1. gyazowin.exeを実行する
    2. カーソルが十字になる
    3. スクリーンショットを撮りたい範囲の左上をクリックしたまま、右下までドラッグ
    4. 指を話すと、スクリーンショットがgyazo.example.jpにアップロードされたのち、アップロード先URLで既定のブラウザが起動される。
      Gyazowinフォルダのエクスプローラをスクリーンショットしたもの
    5. サーバのdockerを起動したディレクトリの直下にdataディレクトリが作成され、そこにアップロードされた画像が配置する
      server_upload_images

備考

参考

KnowledgeをHerokuで動かす

Qiita:Teamのような情報共有ツールで社内LANのような限定的に使うことができるものを探していたところ、Knowledgeを見つけました。

そこで、ためしに、Heroku上で動かしてみました。
作業環境はLinux (Ubuntu 14.04)で行っています。

なお、公式でDeploy to Heroku Buttonに対応しているため、下記の手順を行わなくても、GitHub上のsupport-project/knowledgeの「Deploy to Heroku」を押下するとデプロイ~PostgreSQLアドオンの追加まで行ってくれます。

インストールから起動まで

  1. Herokuアカウントの作成

    Herokuアカウントを持っていない場合は、Sign Upでアカウントを作成します。

  2. JREのインストール

    KnowlegeをHerokuにデプロイする際にJavaが必要なため、作業環境にJREをインストールしておきます。

    $ sudo apt-get install -y default-jre
    
  3. Herokuのコマンドラインツールのインストールとログイン

    Heroku Toolbeltをインストールします。サイト上で、「Debian/Ubuntu」を選択すると表示されるコマンドを実行します。

    $ wget -O- https://toolbelt.heroku.com/install-ubuntu.sh | sh
    

    つぎにHerokuにログインします。

    $ heroku login
    
  4. Herokuアプリの作成

    作業用ディレクトリを作成します。

    $ mkdir knowledge
    $ cd knowledge
    

    アプリ名をsample-knowlegeとしてHerokuアプリを作成します。(アプリ名は適宜変更します)

    $ heroku create sample-knowlege
    
  5. Knowledgeのダウンロード

    KnowledgeはJavaのWAR形式で提供されているので、それをダウンロードします。

    ダウンロードはこちらから Releases support-project/knowledge

    執筆時点での最新バージョン1.3.1を使います。

    $ wget https://github.com/support-project/knowledge/releases/download/v1.3.1/knowledge.war
    
  6. WARをHeroku上で動かすために、Heroku ToolbeltのWARデプロイプラグインを追加する

    WARデプロイについて – WAR Deployment | Heroku Dev Center
    WARデプロイプラグインについて – heroku/heroku-deploy

    $ heroku plugins:install https://github.com/heroku/heroku-deploy
    
  7. knowledge.warをHerokuにデプロイ
    $ heroku deploy:war --war knowledge.war --app sample-knowlege
    

    アクセス先URLの確認

    $ heroku apps:info sample-knowlege
    === sample-knowlege
    Dynos:         web: 1
    :
    :
    :
    :
    Web URL:       https://sample-knowlege.herokuapp.com/
    
  8. URLでアクセス

    https://sample-knowlege.herokuapp.com/ にアクセスします。

    Topページ

    ログインはドキュメントKnowledge – Free knowledge base systemより

    ID:admin、パスワード:admin123

    でできます。

DBをPostgreSQLに変更する

KnowledgeのDBはデフォルトでは、組み込みのH2 Databaseを使用しているため、デプロイしなおすとデータが消えます。
永続化するためにデータベースをPostgreSQLに変更します。

  1. HerokuにPostgrSQLのアドオンを追加
    $ heroku addons:create heroku-postgresql --app sample-knowlege
    
  2. JDBC用のURL情報を取得

    KnowledgeにPostgreSQLの接続情報を設定するためにJDBC情報を取得します。
    Connecting to Relational Databases on Heroku with Java | Heroku Dev Centerより

    $ heroku run echo \$JDBC_DATABASE_URL --app sample-knowlege
    Running echo $JDBC_DATABASE_URL on sample-knowlege... up, run.2571
    jdbc:postgresql://ec2-WW-XX-YY-ZZ.compute-1.amazonaws.com:5432/XXXXXXXXXX?user=XXXXXXXXX&password=XXXXXXXXXXXXX&sslmode=require
    
  3. KnowledgeにPostgreSQLの接続情報を登録

    adminでログインしたのち、「システム設定」→「データベースの接続先変更」に以下の情報を入力して「保存」ボタンを押下します。

    driverClass: org.h2.Driver # 選択済みの状態
    URL: 先ほどの手順で取得したJDBCの接続URL
    user:先ほどの手順で取得したJDBCの接続URLにあるuser=の値
    password:先ほどの手順で取得したJDBCの接続URLにあるpassword=の値
    schema:先ほどの手順で取得したJDBCの接続URLにある:5432/と?の間の文字列
    max connection: 0 # そのまま
    auto commit: false # そのまま
    

    DB接続情報入力

  4. 組み込みDBの内容をPostgreSQLにコピー

    先の手順で登録に成功すると、「保存」ボタンの横に「組み込みDBで保存したデータをカスタム設定のDBにコピー」ボタンが現れるので、それを押下してデータをコピーします。

  5. 接続先をPostgreSQLに切り替える

    「driverClass」を「org.h2.Driver」から「org.postgresql.Driver」に変更して「保存」ボタンを押下します。

    ※なお、デプロイしなおすと、DB接続設定がクリアされるため、再度同じ内容を入力して切り替える必要があります。(その際は「組み込みDBで保存したデータをカスタム設定のDBにコピー」は実行しないこと)

その他

  • PostgreSQLの接続情報を登録した際、誤った情報を登録してしまい、Server Errorになった

    Server ErrorになるとTopページは表示されますが、ログインなどができなくなってしまいます。再度、デプロイすることでログインできます。その際組み込みDBに登録している内容はクリアされます。

  • PostgreSQLの内容を見るには

    https://postgres.heroku.com/databases では中身を確認できないため、コマンドラインツール(psqlなど)、WEBツール(phpPgAdminなど)・GUIツールなどで見る必要があります。

FuelPHPにRollbarを組み込む

FuelPHPのLogクラスは内部で、Monologを使用している。
MonologにはHandlersという仕組みでログの出力先をカスタマイズできる仕組みがあり、Rollbarにも対応している。

参考:monolog の Handler を追加する場合の記述場所 – Google グループ

前提

  1. Rollbarのアカウントを作成し、プロジェクトを作成する。
  2. https://rollbar.com/アカウント名/プロジェクト名/settings/access_tokens/ を参照して post_server_item のアクセストークンをメモしておく(※)

手順

fuel/app/bootstrap.phpを編集して末尾に以下を加える

$rollbar_config = array(
    'access_token' => 'POST_SERVER_ITEM_ACCESS_TOKEN',
    'environment' => \Fuel::$env,
);
\Log::instance()->pushHandler(new \Monolog\Handler\RollbarHandler(
        new RollbarNotifier($rollbar_config), \Monolog\Logger::NOTICE
));

POST_SERVER_ITEM_ACCESS_TOKENは※で取得したトークンに置き換える。

これにより、\Log::warning()や\Log::error()やFuelPHP上で発生したPHPエラーがRollbarにも出力されるようになる。

Heroku上のPHPアプリケーションにBASIC認証を導入する

Heroku上でnginxをWEBサーバとしたPHPアプリケーションに対してBASIC認証をかける

流れ

  • BASIC認証の設定はnginxの設定ファイルに記述
  • IDやパスワードは環境変数に登録
  • htpasswdファイルはデプロイ時に生成

前提

ディレクトリの初期構成は以下の通り。

public/
    index.php
vendor/
composer.json
Procfile

composer.jsonは

{
    "require-dev": {
        "heroku/heroku-buildpack-php": "*"
    }
}

として、composer install or updateをして、vendor/binディレクトリにvendor/bin/heroku-php-nginxがインストールされている。

Procfileは

web: bin/heroku-php-nginx public

として、ドキュメントルートをpublicフォルダとしてデプロイしている。

手順

  1. 環境変数にBASIC認証アカウントを登録
    $ heroku config:set BASIC_AUTH_USERNAME="basic_auth_user"
    $ heroku config:set BASIC_AUTH_PASSWORD="basic_auth_pass"
    

    またはWEBコンソール (https://dashboard.heroku.com/apps/APPNAME/settings) で追加する

  2. nginxにBASIC認証の設定を加えるため、設定の追加をする

    1. 設定用のフォルダを作成する
      $ mkdir heroku
      $ cd heroku
      
    2. nginx_app.confというファイルを作成する。すでにある場合は、auth_basic,auth_basic_user_fileの部分を追記する
      location / {
          auth_basic            "Restricted";
          auth_basic_user_file  $document_root/../.htpasswd;
      }
      

      このサンプルではルート下すべてをBASIC認証の領域とする。

    3. Procfileを編集して、デプロイ時にnginx_app.confを読み込むませる

      web: bin/heroku-php-nginx -C heroku/nginx_app.conf public
      
  3. Herokuの.profile.dの仕組みを使って、htpasswdファイルを生成するbashスクリプトを追加する
    $ mkdir .profile.d
    $ cd .profile.d
    $ vi gen-htpasswd.sh
    

    gen-htpasswd.shは

    #!/usr/bin/env bash
    set -ex
    
    echo -e "${BASIC_AUTH_USERNAME}:$(perl -le 'print crypt($ENV{"BASIC_AUTH_PASSWORD"}, rand(0xffffffff));')" > /app/.htpasswd
    
  4. Herokuにデプロイする

参考

Dockerコンテナをホスト名で参照できるDNSサーバコンテナ「dnsdock」を使う

ホストとなるサーバ上にA,Bの2つのコンテナが稼働しているとき、片方のコンテナからもう片方のコンテナを参照したいときは、簡単な方法はdockerコマンドの–linkオプションを使います。

これとは別に、ホスト名を使うことにより各コンテナを参照することができるコンテナがdnsdockです。
これを使うと–linkオプションなしで相互のコンテナにアクセスできます。
dnsdockはskydockをもとに簡易化したものです。

※コンテナ同士のやり取りは前提としてDockerデーモンのiccパラメータがtrue(デフォルト)で、アクセスされたいコンテナがexposeでポートをさらしている必要があります。

使用例

前提

  • ホストのOSはubuntu14.04
  • ホストのプロンプトを(host),コンテナのプロンプトを(コンテナ名)とする
  • rootは#、ユーザーは$とする

今回は、php(php:5-apache)とmysql(mysql:5.6)のコンテナを使い、

  • ホストからmysqlコマンドでmysqlコンテナにアクセス
  • ホストからcurlコマンドでphpコンテナにアクセス
  • phpコンテナからでmysqlコンテナにアクセス

をしてみます。

1.ホスト側の設定(要root)

Dockerのネットワークを172.17.0.1/24にして、コンテナが参照するDNSを172.17.0.1にする。

  • Dockerデーモンの起動オプションにbipとdnsを加えて、サービスを再起動

    /etc/default/docker

    DOCKER_OPTS="--bip=172.17.0.1/24 --dns=172.17.0.1 --dns=8.8.8.8"
    

    ※各コンテナは172.17.0.1をデフォルトのDNSとしてdnsdockを通して名前解決を行うが、dnsdockが停止していると名前解決が行えないので予備も設定しておく

    (host)# service docker restart
    
  • ネームサーバに172.17.0.1を/etc/resolv.confのnameserverの先頭に加える。直接加えると再起動時に消えるので、resolvconfを利用する

    /etc/resolvconf/resolv.conf.d/head

    nameserver 172.17.0.1
    
    (host)# resolvconf -u
    

2.作業領域と確認用コードの作成

(host)$ mkdir work
(host)$ cd work
(host)$ mkdir src
(host)$ echo '<?php echo "Hello World\n"; ' > src/index.php

3.dnsdockコンテナの起動

(host)$ docker run -d --name dnsdock -v /var/run/docker.sock:/var/run/docker.sock -p 172.17.0.1:53:53/udp aacebedo/dnsdock:latest-amd64

(追記 2016/10/14)Githubのページがtonistiigi/dnsdockからaacebedo/dnsdockに変更されたのに伴ってコンテナイメージをaacebedo/dnsdock、バージョンをDocker Hubに従ってlatest-amd64に変更しました。
(追記 2016/8/24)issueがcloseされ、clouddynamics/dnsdockがなくなりました
※dnsdockの本家は tonistiigi/dnsdock だが、ホストからアクセスする際にバグがあり、対応されたものが clouddynamics/dnsdock にあるためコンテナイメージはそちらを利用しています。
参考:dig dnsdocker.docker works, curl dnsdocker.docker doesn’t · Issue #34 · tonistiigi/dnsdock

  • digコマンドで名前が解決できるか確認

    (host)$ dig *.docker

    ; <> DiG 9.9.5-3ubuntu0.6-Ubuntu <> *.docker
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24923
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;*.docker.                      IN      A
    
    ;; ANSWER SECTION:
    *.docker.               0       IN      A       172.17.42.2
    
    ;; Query time: 1 msec
    ;; SERVER: 172.17.42.1#53(172.17.42.1)
    ;; WHEN: Thu Jan 14 20:12:05 JST 2016
    ;; MSG SIZE  rcvd: 50
    

4.MySQLコンテナとPHPコンテナの起動

(host)$ docker run -d --name some-mysql -e MYSQL_ROOT_PASSWORD=mysqlpass mysql:5.6
(host)$ docker run -d --name some-php -v $(pwd)/src:/var/www/html -p 80:80 php:5-apache
  1. 現在起動中のコンテナの確認

    (host)$ docker ps

    CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                    NAMES
    d70f295f19fb        php:5-apache            "apache2-foreground"     36 seconds ago      Up 34 seconds       0.0.0.0:80->80/tcp       some-php
    2b1323183779        mysql:5.6               "/entrypoint.sh mysql"   3 minutes ago       Up 3 minutes        3306/tcp                 some-mysql
    7258ecfbfd04        tonistiigi/dnsdock   "/go/bin/dnsdock"        7 minutes ago       Up 7 minutes        172.17.42.1:53->53/udp   dnsdock
    
  2. 起動したコンテナの名前解決を確認

    ホスト名は<anything>.<container-name>.<image-name>.<environment>.<domain>というルールになっており、デフォルトだと<domain>はdocker、<environment>は空文字列のため、<container-name>.<image-name>.dockerでアクセスできる。

    MySQLコンテナはmysqlイメージを使ってsome-mysqlという名前で起動したため、ホスト名はsome-mysql.mysql.docker

    (host)$ dig some-mysql.mysql.docker

    ; <> DiG 9.9.5-3ubuntu0.6-Ubuntu <> some-mysql.mysql.docker
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14084
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;some-mysql.mysql.docker.       IN      A
    
    ;; ANSWER SECTION:
    some-mysql.mysql.docker. 0      IN      A       172.17.42.3
    
    ;; Query time: 0 msec
    ;; SERVER: 172.17.42.1#53(172.17.42.1)
    ;; WHEN: Thu Jan 14 20:20:11 JST 2016
    ;; MSG SIZE  rcvd: 80
    

    同様にPHPコンテナはphpイメージを使って、some-phpという名前で起動したのでホスト名はsome-php.php.docker

    (host)$ dig some-php.php.docker

    ; <> DiG 9.9.5-3ubuntu0.6-Ubuntu <> some-php.php.docker
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30088
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;some-php.php.docker.           IN      A
    
    ;; ANSWER SECTION:
    some-php.php.docker.    0       IN      A       172.17.42.4
    
    ;; Query time: 0 msec
    ;; SERVER: 172.17.42.1#53(172.17.42.1)
    ;; WHEN: Thu Jan 14 20:21:15 JST 2016
    ;; MSG SIZE  rcvd: 72
    

5.ホストからPHPコンテナにホスト名でアクセスしてみる

(host)$ curl http://some-php.php.docker/index.php

Hello World

6.ホストからmysqlコマンドでMySQLコンテナにホスト名でアクセスしてみる

mysqlコマンドはあらかじめインストールしておく必要があります。
(ubuntu14.04ならapt-get install mysql-client-core-5.6)

(host)$ mysql -h some-mysql.mysql.docker -u root --password=mysqlpass

7.phpコンテナからmysqlにアクセス

7.1 PHPコンテナにPDOとMySQLのモジュールを組み込む

php:5-apacheにはPDOとMySQLのモジュールが組み込まれていないので、組み込む必要がある。

方法1 モジュール入りカスタムイメージを使う
  1. Dockerfileを作成する

    Dockerfile

    FROM php:5-apache
    RUN docker-php-ext-install pdo pdo_mysql
    
  2. イメージを作成する
    (host)$ docker build -t php:custom  .
    
  3. 動かしているsome-phpコンテナを終了させて、代わりにカスタムイメージで起動する
    (host)$ docker stop some-php
    (host)$ docker rm some-php
    (host)$ docker run -d --name some-php -v $(pwd)/src:/var/www/html -p 80:80 php:custom
    
方法2 現在動いているコンテナにモジュールをインストールする
  1. some-phpコンテナに入る
    (host)$ docker exec -it some-php bash
    
  2. モジュールをインストールする
    (some-php)$ docker-php-ext-install pdo pdo_mysql
    (some-php)$ exit
    
  3. コンテナ再起動
    (host)$ docker restart some-php
    

7.2 index.phpをPDOを使ってMySQLにアクセスするプログラムに書き換える

src/index.php

<?php

    $pdo = new PDO('mysql:host=some-mysql.mysql.docker;dbname=mysql', 'root', 'mysqlpass');
    $sth = $pdo->query("show tables");
    $sth->execute();
    $result = $sth->fetchAll();
    print_r($result);

7.3 ホストからアクセス

(host)$ curl http://some-php.php.docker/index.php

Array
(
    [0] => Array
        (
            [Tables_in_mysql] => columns_priv
            [0] => columns_priv
        )

    [1] => Array
        (
            [Tables_in_mysql] => db
            [0] => db
        )
     :
     :
     :

WEBインタフェース

dnsdockにはRESTインタフェースを持っているので、curlなどで問い合わせやデータの更新ができます。

tonistiigi/dnsdock#HTTP Server

整形にjqコマンドを使用しています。

コンテナの一覧

curl -s http://dnsdock.docker/services|jq .

{
  "672963efeef98b3c473f87f7ede66e51f661cc6f5f28075c79ec44c633d2a564": {
    "Aliases": [],
    "Ttl": -1,
    "Ip": "172.17.42.2",
    "Image": "dnsdock",
    "Name": "dnsdock"
  },
  "2d17b46d944919797ed4f62d9c763e240cf2ed511573f22b438b07ba3239f77b": {
    "Aliases": [],
    "Ttl": -1,
    "Ip": "172.17.42.4",
    "Image": "php",
    "Name": "some-php"
  },
  "263c0325f15f0f4c95f68f1975df5a50104ca766529c772d29d9a1357b8fab17": {
    "Aliases": [],
    "Ttl": -1,
    "Ip": "172.17.42.3",
    "Image": "mysql",
    "Name": "some-mysql"
  }
}

参考

(追記 2016/10/14)
記事執筆時はアドレスとして172.17.42.1を使用していましたが、

ERROR: for dnsdock  Cannot start service dnsdock: driver failed programming external connectivity

というエラーが出るようになったため、下記及びaacebedo/dnsdockを参考に172.17.0.1に変更したらうまく動作するようになりました

1.9: Default docker0 IP is not 172.17.42.1 for new installs · Issue #17305 · docker/docker