Dockerってみんな使っているからっていうことで使っていたけど、イマイチ使いどころがよく分からなかった。 まあ、個人開発でやっている分には誰かに環境を配布することもないし、複数の同じ環境が必要になることもなかったからだろうと思う。
しかし、今回初めてDockerええなあと思うことがあった。 クローリングである。
最初はPythonでクローラーを書いて、VPSで1つのクローラーをちまちま動かしていたのだが、よく考えたらDockerでコンテナを立ち上げまくって、複数のクローラーを動かせばええやないかということに今さらながら気づいた。 Dockerでクローリング専用のイメージを作っておけば、そこからコンテナを複数作ることで、クローリングのスピードをX倍にすることができる。
別にDocker使わなくても、1つのOSでPythonスクリプトを複数動かせばいいじゃないかと言われるかもしれないが、TorでIP分散をしていることもあり、別のOSでクローラーを動かす必要があったのだ。
最初は何を考えることもなく、Python、Chrome、Torを詰め込んだイメージを作って、そのコンテナの状態をイメージにコミットして、そのイメージを使い回していた。
docker stop crawler
docker commit crawler crawler:v1
docker run -i -t crawler:v1 /bin/bash
しかし、どうせならこの際Dockerfileを作っておこうということで、作ってみた。
FROM ubuntu:latest
MAINTAINER Capsule-Man <https://github.com/Capsule-Man>
LABEL Description="This image is used to crawl" Version="1.0"
ADD crawling_env.sh /root
RUN bash /root/crawling_env.sh
ADD tor/torrc /etc/tor
RUN rm /root/crawling_env.sh
RUN mkdir /root/mlbdata_crawler
ADD mlbdata_crawler /root/mlbdata_crawler
また、実際に環境構築するシェルコマンドはcrawling_env.shに切り出した。
cd /root
apt-get update
## PythonやTorなどの導入
apt-get -y install wget unzip python3 python3-pip libx11-dev \
libnss3-dev tor xdg-utils lsb-release libxtst6 libxss1 libxrender1 \
libxrandr2 libxi6 libxfixes3 libxext6 libxdamage1 libxcursor1 libxcomposite1 \
fonts-liberation libappindicator3-1 libasound2 libatk-bridge2.0-0 \
libatk1.0-0 libcairo2 libcups2 libgdk-pixbuf2.0-0 libgtk-3-0 \
libpango-1.0-0 libpangocairo-1.0-0 libx11-xcb1
## 必要なPythonパッケージの導入
pip3 install mlbgame pandas selenium
## chromedriverの導入
wget https://chromedriver.storage.googleapis.com/2.40/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
mv chromedriver /usr/local/bin
## GoogleChromeの導入
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
dpkg -i google-chrome-stable_current_amd64.deb
mkdir /var/run/tor
rm *zip *deb
もしこのクローリング環境を使いたい場合は、
git clone https://github.com/Capsule-Man/docker-crawler.git
cd docker-crawler
sudo docker build .
で使えます。
正直、RUNとADDしか使っていないので、簡単なDockerfileとなってしまっているが、とりあえず初めてDockerfileを書いたということで。 これからDockerの良いユースケースを知りたいなあと思った。