手元でPowerDNSのAPIを叩くためのDockerイメージを作った(その2)

こちらの記事で、手元でPowerDNSのAPIを叩くためのDockerイメージを作りましたが、

takapi86.hatenablog.com

加えて、

  • レコードの保存先をMySQL
  • PowerDNS-Adminを使ってGUIで管理できるようにする

というのをやっていきます。

レコードの保存先をMySQL

docker-composeに以下の設定を追加しました。

  mysql:
    image: mysql:5.7
    healthcheck:
      test: "echo 'SELECT version();'| mysql -u pdns -h 127.0.0.1 --password=pdns pdns"
      timeout: 30s
      retries: 5
    ports:
      - "13306:3306/tcp"
    volumes:
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro
      - mysql_data:/var/lib/mysql
    environment:
      - "MYSQL_DATABASE=pdns"
      - "MYSQL_USER=pdns"
      - "MYSQL_PASSWORD=pdns"
      - "MYSQL_RANDOM_ROOT_PASSWORD=yes"
volumes:
  mysql_data:
  powerdns:
    depends_on:
      mysql:
        condition: service_healthy

また、設定に以下を追加します。

launch=gmysql # launch=bind から変更
gmysql-host=mysql
gmysql-user=pdns
gmysql-password=pdns
gmysql-dbname=pdns

具体的に何をやっているかというと・・・

healthcheck, depends_on

DBの準備ができる前にpowerdnsを起動してしまうと、DBのコネクションエラーになってしまうので、MySQLが立ち上がり、DBがセットアップできるまでpowerdnsを起動させないようにしています。

volumes

/docker-entrypoint-initdb.d/ 以下にSQL, シェルスクリプトなどのファイルを置いておくと、MySQLコンテナ起動時に実行してくれるようになります。 それを利用して、PowerDNSのテーブルをCREATEするようにしています。

SQLはこちら https://github.com/PowerDNS/pdns/blob/rel/auth-4.3.x/modules/gmysqlbackend/schema.mysql.sql

environment

MySQLのDB情報を設定しています。

詳しくはこちら https://hub.docker.com/_/mysql

PowerDNS-Adminを使ってGUIで管理できるようにする

以下の設定を追加しました。

  powerdns-admin:
    image: ngoduykhanh/powerdns-admin:latest
    ports:
      - "9191:80"
    logging:
      driver: json-file
      options:
        max-size: 50m
    environment:
      - SQLALCHEMY_DATABASE_URI=mysql://pdns:pdns@mysql/pdns
      - GUNICORN_TIMEOUT=60
      - GUNICORN_WORKERS=2
      - GUNICORN_LOGLEVEL=DEBUG
      - OFFLINE_MODE=False

これは公式の設定通り

https://github.com/ngoduykhanh/PowerDNS-Admin

動かしてみる

起動は通常通り docker-compose up で起動、http://localhost:9191/ へアクセスし、GUIからのAレコードを追加してみます。

test.takapi-example.jp からIPアドレス127.0.0.1が引けるようにしました。

dig +norec @localhost -p 1053 test.takapi-example.jp A

; <<>> DiG 9.10.6 <<>> +norec @localhost -p 1053 test.takapi-example.jp A
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57925
;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;test.takapi-example.jp.                IN      A

;; ANSWER SECTION:
test.takapi-example.jp. 60      IN      A       127.0.0.1

;; Query time: 7 msec
;; SERVER: ::1#1053(::1)
;; WHEN: Fri Jan 01 17:42:52 JST 2021
;; MSG SIZE  rcvd: 67

構築した環境はこちらで公開しております。 github.com

とりあえず、今日はここまで