はじめに
Dockerについて学習したので、とりあえず動くものを作ってみましたメモ。
Dockerを使用してPython環境を構築し、Seleniumでブラウザ操作を行い、Google検索結果のヒット数を取得し、MySQLにログを保存します。
Dockerが立ち上がったらSeleniumのヘッドレスモードでブラウザ操作を行うので、GUI操作はないです。
↓このアプリのリポジトリ
ディレクトリ構成
seliniumApp/
│
├── Docker/
│ ├── web/
│ │ ├── app.py
│ │ ├── Dockerfile
│ │ └── requirements.txt
│ └── init.sql
├── docker-compose.yml
実行手順
プロジェクトのルートディレクトリに移動
cd seliniumApp
Dockerコンテナをビルドして起動
docker-compose up --build
結果の確認
下記コマンドでコンテナIDを確認して
docker ps
MySQLに接続して、ログが正しく保存されているか確認します。
docker exec -it <db_container_id> mysql -u root -p
USE web_logs;
SELECT * FROM logs;
healthcheckについて
このアプリを作成するにあたって一番詰まったところ。
DBサーバーが完全に立ち上がる前に、Webサーバーが立ち上がって検索数をDBに保存しようとしてしまうので、DBにうまくアクセスできず以下のログがでていました。
seliniumapp-web-1 | ブラウザを起動中...
seliniumapp-web-1 | データベースに接続中...
seliniumapp-web-1 | データベースエラー: 2003 (HY000): Can't connect to MySQL server on 'db:3306' (111)
seliniumapp-web-1 | if cursor is not None:
seliniumapp-web-1 | NameError: name 'cursor' is not defined
DBサーバーが完全に立ち上がってからWebサーバーが立ち上がるようにhealthcheckの設定をおこないました。
docker-compose.yml
version: '3'
services:
web:
build:
context: ./Docker
dockerfile: ./web/Dockerfile
volumes:
- ./Docker/web:/app
ports:
- "8000:8000"
environment:
TZ: "Asia/Tokyo"
DB_HOST: db
DB_USER: root
DB_PASS: mysql_pass
DB_NAME: web_logs
depends_on:
db:
condition: service_healthy
db:
image: mysql:5.7
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
environment:
MYSQL_ROOT_PASSWORD: mysql_pass
MYSQL_DATABASE: web_logs
ports:
- "3307:3306"
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
test
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
意味: コンテナの健康状態をチェックするために実行するコマンドを指定します。
mysqladmin ping -h localhost コマンドを実行し、MySQLサーバーにpingを送り、応答をチェックします。
interval
interval: 10s
意味: ヘルスケアチェックを実行する間隔を指定します。
10秒ごとにヘルスケアチェックが実行されます。
timeout
timeout: 5s
意味: ヘルスケアチェックのコマンドが実行される際のタイムアウト時間を指定します。
コマンドが5秒以内に完了しない場合、チェックは失敗と見なされます。
retries
retries: 5
意味: コンテナの状態が不健康と見なされる前にヘルスケアチェックが連続して失敗する回数を指定します。
ヘルスケアチェックが連続して5回失敗した場合、コンテナはチェック失敗と見なされます。
depends_on:
db:
condition: service_healthy
depends_on 設定で condition: service_healthy を使用することで、DBサーバーがヘルスケアチェックをパスした後にWebサーバーが起動するようにしています。これにより、WebサーバーがDBサーバーの起動を待ってから動作を開始するため、DBサーバーがまだ起動中であるために発生する接続エラーを防ぐことができました。
参考