[Python #20] Dockerを用いたUbuntuでのスクレイピング

こんにちは!PythonチームのA.Kです.

一丁前に弊社のインターンに参加して,運用メンバーとして活動しているものの,Dockerを本格的に触ったことが無かったので,いつか自分でDockerを用いた環境構築なるものを任された時に備えて,遊んでみることにしました.

「遊び」と言っても目標が無いとおもしろくないので,windowsで動くseleniumでのスクレイピングプログラムをDockerで構築したUbuntuの最新バージョン内で動かすことを目標としました.この遊びを進め,目標を達成したときには「Docker便利やなー」と感動したので,まだDockerに触れたことの無い方,そもそもDockerというソフトウェアを知らない方向けに,本ブログを書いていくことにします.

このブログがDockerに触れるきっかけになりましたら,私はこの上なく嬉しいです.

Dockerって何?

そもそもDockerというのは,「コンテナ型の仮想環境を作成、配布、実行するためのプラットフォーム」です.

なんやそれ?って感じですよね...

私の言葉で簡単に言うと,例えば,自分のローカル環境にPythonをインストールしなくても,Dockerを用いれば仮想環境の中で様々なバージョンのPythonをインストールしたり他のソフトウェアもまとめてインストールしたりするのをコードでまとめておけるツールです.

したがって,Dockerを用いれば,複数人での開発をするときの環境を揃えるということが楽になります.コードを配布してそれを実行すれば,同じ仮想環境を構築できるということです.

しかも,Dockerは他の仮想環境構築ツールよりも軽いです!

似たような仮想環境構築ソフトであるVirtualBoxやVMwareよりも軽いです.私のメインPCはメモリ8GBを搭載しているのですが(プログラミングで開発をバリバリするためにはメモリ足りないですよねー笑)VirtualBoxにUbuntuはうまいこと動作しませんし,VMwareに関してはインストールのときに「あなたのPCは要件を満たしておりません」との警告が出ました笑.

その点Dockerはギリギリ動いてくれます.(よかったー!)

つまり,Dockerは「軽めの仮想環境構築ソフト」といったところです.

実際に仮想環境を構築してみる

準備

Dockerのバージョンは以下になります.

Docker version 20.10.23, build 7155243

ここでは,Pythonのモジュールであるseleniumを使ったスクレイピングプログラムをDockerで構築したUbuntuの最新バージョンで動かしていこうと思います.

作業ディレクトリ構造は

| Dockerfile
| requirements.txt
|
└─src
chromedriver
sample.py

上記のようにします.sample.pyがスクレイピングを実行するPythonファイルで,requirements.txtにはsample.pyで使用するためにインストールする外部モジュールを

pandas==1.5.2
selenium==3.141.0

バージョン指定して書き込んでいます.

今回はUbuntuの仮想環境でスクレイピングをおこなうので,chromedriverはLinux用のものにします.

sample.pyにはホストOSで動くプログラムを書きます.ただ,Dockerの中で動かすときには,ヘッドレスモードにしないとエラーが出てしまいました.

Dockerfileには

FROM ubuntu:latest
USER root

RUN apt update
RUN apt install -y python3.11

RUN apt install -y python3-pip

ENV TZ=Asia/Tokyo
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN apt install -y x11vnc xvfb fluxbox wget wmctrl gnupg2
RUN apt-get update && apt-get install -y wget
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list
RUN apt update
RUN apt install -y google-chrome-stable

COPY . .

RUN python3.11 -m pip install -r requirements.txt

WORKDIR /src

RUN apt update

RUN apt upgrade

を書き込みます.

Dockerfileとは,Dockerで構築する仮想環境をどのうように設定するかを書きむもので,これを実行することで,ローカル環境に依存せずに同じ仮想環境を構築できるようになっています.

簡単に内容を説明しますと,「FROM」は構築する仮想環境のベースを指定するもので,今回はUbuntuの最新バージョンを指定しています.

「RUN」は仮想環境内で実行するコマンドを設定でき,今回はスクレイピングに必要なソフトウェアをインストールしています.

「COPY」でローカル環境のファイルを仮想環境にコピーしています.

「WORKDIR」では,ワークディレクトリを指定しています.

ここまで準備ができましたら,コマンドを実行して仮想環境を立ち上げていきます.(本ブログでは指定していませんが,ホストOSにDockerがインストールされている必要があります)

Docker実行

まず,以下のコマンドを実行します.

docker build -t python_sample:1.0 .

このコマンドでは,作業ディレクトリ上にあるDockerfileを参照してimageのビルドをおこなっています.

「imageのビルド?」となりますが,最初のうちは「仮想環境の電源をONできる状態に部品を組み立てる」という感覚でいいと思います.(現に私がそう思ってます)

imageのビルドを終えて出来上がるものを「container」と言います.

ここでは「python_sample:1.0」と名付けたのimageをビルドしています.

docker run --name python_sample -it -d python_sample:1.0

このコマンドでcontainerを立ち上げ(電源ON)「-d」というオプションでバックグラウンドで実行しています.

docker exec -it python_sample bash

このコマンドでcontainerに入ることができ,

python3.11 sample.py

でPythonファイルを実行できます.

Docker終了・container削除

containerから出るためには

exit

上記のコマンドを実行します.

docker stop python_sample

でcontainerを停止できます.

containerの削除は

docker rm python_sample

imageの削除は

docker rmi python_sample:1.0

で実行できます.

最後に

今回はUbuntuの最新バージョンの仮想環境内でスクレイピングを実行する手法について解説しました.

今回は複雑なDockerfileを作りませんでしたが,Dockerを用いれば複数のソフトウェアを組み合わせた開発環境もコマンドを実行するだけで立ち上げることができます.

例えば,データベースとの連携を必要とするWebアプリだとか...

今回のブログがDockerに対する興味のきっかけになれば幸いです.

最後まで読んでいただき,ありがとうございました!

参考文献

↓おすすめのDocker勉強YouTube動画です!↓

Docker超入門講座 合併版 | ゼロから実践する4時間のフルコース