Ubuntuでdocker環境でDjango+MySQLを動かす

2019年2月7日docker, Python, プログラミング

KindleUnlimitedExtenderの準備

Ubuntu環境でkindleUnlimitedツールを動かすために、pip3でbottlenoseとbeautifulSoup4を入れようとしたら、そもそもpip3がなかったので、pip3のインストールから。

[blogcard url=”https://qiita.com/TatchNicolas/items/ca6b8007d914bdef3662″]

環境準備は↓を参考に。

[blogcard url=”http://ichizo.biz/2016/12/20/python-kindleunlimited.html”]

ソースはWindows環境で使っていたものを共有フォルダで展開したら、普通に動きました!

docker環境でDjango+MySQL

いよいよ本来やりたかったdocker環境でpython動かしてみたいと思います。

[blogcard url=”https://aoishi.hateblo.jp/entry/2017/11/05/153341″]

Permission deniedがでてMySQLが建てられないorz

db_1 | mysqld: Can't change dir to '/var/lib/mysql/' (Errcode: 13 - Permission denied)

今回ダメだった理由はMySQLの永続化をVirtualBox-Windowsの共有フォルダに設定したのが原因でした。パーミッションが変えられないみたい。詳しくは下記のQA

[blogcard  url=”https://ja.stackoverflow.com/questions/9320/%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E4%B8%8A%E3%81%AEcoreos%E3%81%A7-docker%E3%81%AE%E6%B0%B8%E7%B6%9A%E5%8C%96%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E3%83%9B%E3%82%B9%E3%83%88%E3%81%A8%E3%81%AE%E5%85%B1%E6%9C%89%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%AB%E4%BD%9C%E6%88%90%E3%81%A7%E3%81%8D%E3%81%9A-%E6%A8%A9%E9%99%90%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%A8%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86″]

ということを踏まえて・・・

永続化先を

/home/dockers/docker/db-datadir:/var/lib/mysql
/home/dockers/docker/sql:/docker-entrypoint-initdb.d

これに変更しました。ちなみに[dockers]はUbuntuのユーザー名です。

・・・

結局コレでもだめっぽかったので、とりあえず共有フォルダからフォルダごと移動しました。

Docker+Django+MySQLのエラー原因判明

昨日エラーを吐き続けていた理由が判明しました。

$ docker-compose run web ./manage.py makemigrations $ docker-compose run web ./manage.py migrate

 

↓出ていたエラーはこちら。

見ると、”Access denied for user ‘django’@’172.19.0.3′(using password: YES)” とエラーメッセージがあります。つまりはDBにアクセスするときにユーザ名、もしくはパスワードが違うよ~とのことです。

[blogcard url=”https://aoishi.hateblo.jp/entry/2017/11/05/153341″]

このブログを参考にやっていたのですが、VirtualBoxの共有フォルダでアクセス権が変えられないことが判明したタイミングでフォルダを移動した際に、MySQLの初期化ファイルを移すのを忘れていたのが原因でした。

ちなみに、初期化ファイルを実行しようと思い、何度も下記コマンドを叩いたのですが既に初期化されていたため、初期化されることはありませんでした。

$ docer-compose up -d db

結局、MySQLの永続化したvolumesの中にデータが残ったままなのが原因なので、db-datadirをGUIから消そうとしたのですが、それもできず。

【参考】Volumesの説明とか、MySQLの初期化はコチラ

[blogcard url="https://qiita.com/juhn/items/274e44ee80354a39d872"]

ただ、ターミナルでsudoで一発で消せました。

$ sudo rm -r db-dadir

以上のことをやって、Firefoxで「localhost:8000/admin」を叩けば、無事Dgangoのadmin画面を開くことができました!

【参考】DBを作り直す手順

$ docker-compose down
$ sudo rm -rf db-datadir
$ docker-compose up -d db
$ docker-compose run web ./manage.py makemigrations
$ docker-compose run web ./manage.py migrate
$ docker-compose run web ./manage.py shell -c "from django.contrib.auth.models import User; User.objects.create_superuser('admin', 'admin@localhost', 'admin')"
$ docker-compose up -d

Kindle Unlimited Extenderの制作

Kindle情報を取ってくるスクリプト(1時間で3600件)でMySQLにデータをぶちこんで、Djangoで表示&検索するシステムにしよう。

Django関係はPythonエンジニアファーストブック の第6章で再履修する。

MySQLにPythonで接続する

接続するためにパッケージをインストールする必要があります。Ubuntu環境で、pip3 install mysqlclientしたらエラーが出て完了しなかったので、やることのまとめです。

$ sudo apt-get install python-dev libmysqlclient-dev
$ sudo apt-get install python3-dev
$ sudo pip3 install mysqlclient

あとは、MySQLの初期化とかをしてサンプルソースを動かそうと思います。

MySQLサーバーをDockerで起動しておいて、設定はUbuntu自体にMySQLをインストールして操作する。

$ sudo apt-get install mysql-client-core-5.7

昨日作った環境で次のコマンドで接続しようとしてもエラーが出てだめでした。

$ sudo mysql -u root -p -h localhost -P 3305 --protocol=tcp

これを実行すると、

ERROR 1130 (HY000): Host '172.21.0.1' is not allowed to connect to this MySQL server

このエラーが出て進めなくなってしまった。

MySQLの接続エラー解決

いろいろと探した結果、MySQLの設定方法を変えることで解決できた。参考にしたページは↓

[blogcard url=”https://qiita.com/Esfahan/items/70047ea2e4fecab4e2cc”]

docker-compose.ymlの内容を下記のように書き換えました。

version: '3'

services:

  db-kindle:
    image: mysql:5.7
    restart: always
    environment:
    BIND-ADDRESS: 0.0.0.0
    env_file:
      - .env
    tty: true

    volumes:
      - ./db-datadir:/var/lib/mysql
    ports:
      - "3305:3306"

 

あと、.envにパスワードを書きました。

MYSQL_ROOT_PASSWORD=password

これをdocker-compose up -d buildしてあげれば、次のコマンドで接続できました!

$ mysql -u root -p -h localhost -P 3305 --protocol=tcp

MySQLのTABLE作成等

[blogcard url=”https://qiita.com/okamuuu/items/c4efb7dc606d9efe4282″]

こちらを参考に、pythonの書き込みサンプルソースを見ながらTABLEを作成してみた。in.sqlというファイルを作って”<”で流し込み。

MySQLの中身をGUIで見たい

なかをちょこっと、サクッと確認したい衝動に駆られたため。GUIで見れる環境を入れました。

[blogcard url=”https://www.limemo.net/blog/2013/09/%E3%80%90ubuntu%E3%80%91gui%E3%81%A7mysql%E3%82%92%E7%AE%A1%E7%90%86%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%8Cmysql-workbench%E3%80%8D.html”]

使い方は↓

[blogcard url=”http://proengineer.internous.co.jp/content/columnfeature/6605″]

Kindle Unlimitedデータの取得デモ

デモでデータ取得→MySQL格納までの流れが一応動きました!!!

わりと感動。最後はエラーはいて落ちたので、エラー修正と最適化をしていきます。

ちなみに作成したMySQLデータをMySQL Workbenchでみるとこんな形で見れます。なんかプログラミングしてる感があってすごくいい!

ちなみに気付いたらエラーで止まってました。

止まったときに表示されていたのは「MemoryError」。

たりなくなっているのでしょうか?

別記事で検証しています。