見出し画像

【初心者向け】Pythonでスクレイピングする環境を作る② Dockerの使い方

Naruhiko です。

新しいプログラムが必要になったとき、インストールを行います。
でも、あまりインストールしたくない環境ってありませんか?
いろいろなものを入れると管理が大変になったりします。
あと、サーバーには余計なものを入れたくないです。
そういうときが多々あるんです。

では、どうすればいいか。
Docker を入れるんです。

余談ですが、
僕は Linux (Debian) を使っています。
Linux を使っていて、どうしても Windows にしかないソフトが必要になったとき、そんなときがよくあります。
最近では、Amazon Kindle が必要になりました。
解決方法は一つ。
Wine というソフトを使うと Windows のソフトが完璧ではないですが使えるようになるんです。
でも、僕はあまり Wine が好きではありません。
Debian の中身をあまり Wine でぐちゃぐちゃになりたくなかったんです。
では、どうしたか。
そうです。Docker を使ったんです。
そうすれば、Docker 内だけで環境が構築されるので、PCに優しく、どの環境でも適応できます。

そんなことを開発環境でもやってしまおうというわけです。

Docker とは

Docker とは、コンテナ型仮想化という分類になります。
Docker には、ホストOSのカーネルを使用するという特徴があります。
何をいっているのかわからないかもしれませんが、今は気にする必要はありません。
簡単に言うと、早い、軽い、便利というすぐれものです。
その分、覚えるのが大変ですが、順を追って使い方を説明します。

Docker のインストール

Docker のインストールまで説明してしまうと一つの記事ができてしまいます。
ですのでインストール済みとして話を進めます。
もし、要望があるのであれば Docker のインストール方法をまとめたいと思います。

以下から、コンテナ起動からコンテナとイメージの削除まで一通りやってみます。

Python3 イメージでコンテナの起動

Docker イメージでコンテナを起動しますが、イメージがすでに存在するものもあります。
最初はその Python3 のイメージを使ってコンテナを直接起動してみましょう。
Docker は root 権限で実行する必要がありますので、
su で root になるか、sudo を使用します。

~/Workspaces$ sudo docker run python:3

python:3 というのが Python3 用のイメージです。
イメージをダウンロードして実行しています。

Unable to find image 'python:3' locally
3: Pulling from library/python
8f0fdd3eaac0: Pull complete 
d918eaefd9de: Pull complete 
43bf3e3107f5: Pull complete 
27622921edb2: Pull complete 
dcfa0aa1ae2c: Pull complete 
61cf1e8f9385: Pull complete 
6cb6c5f51ace: Pull complete 
6c164355f57f: Pull complete 
261e68ae7eaf: Pull complete 
Digest: sha256:5e2dc76c9668e5bbb5ed77050f17f4e41cc29f42def887ab2033fa9cd101d6fa
Status: Downloaded newer image for python:3
~/Workspaces$

これで取得したイメージでコンテナが起動しました。
ただ、実行しただけなのですぐにプロセスは終了しています。

イメージの確認とコンテナの確認

では、取得したイメージを確認してみましょう。

~/Workspaces$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
python              3                   2d2ae8451803        7 days ago          933MB

python というイメージが確認できますね。

イメージとコンテナの違いってなに?と思うかもしれません。
イメージとはコンテナを起動するための基になるものです。
コンテナはイメージを基に起動します。
利用者からすれば、コンテナが実際に使用する仮想環境なわけです。

今回は直接イメージを実行したのでコンテナも一つでしたが、
あとで説明する Dockerfile を活用することで、カスタマイズした環境のコンテナも起動することができます。
Dockerfile を使えば、どんな環境でも同じように Docker 環境を構築できるんです。

ここでは、
・イメージとコンテナがあるよ!
・コンテナが実行されている仮想環境だよ!
・コンテナだけでは存在できないよ!
・イメージはコンテナが終了してないと削除できないよ!
・イメージを削除するときは先にコンテナを削除する必要があるよ!
と覚えておいてください。

では、コンテナが準備されているか見てみましょう。
ps コマンドをすることで実行されているコンテナを確認することができます。

~/Workspaces$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS               NAMES

python:3 のコンテナはプロセスが停止しているのでこのままでは表示されません。
-a を付けることで、停止中のコンテナを確認することができます。

~/Workspaces$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS               NAMES
e5f921195f78        python:3            "python3"           2 hours ago         Exited (0) 2 hours ago                       gifted_hermann

python:3 のコンテナが確認できましたね。

コンテナの削除

では、停止中のコンテナを削除してみます。
コンテナを削除するときは、コンテナが停止中である必要があります。
もし、コンテナが起動中の場合は、stop コマンドを使用してください。

~/Workspaces$ sudo docker stop e5f921195f78

停止中を確認できたら CONTAINER ID を使って rm します。

~/Workspaces$ sudo docker rm e5f921195f78
~/Workspaces$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS               NAMES

削除されていますね。

イメージの削除

コンテナが削除できたので、イメージも削除してみます。

~/Workspaces$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
python              3                   2d2ae8451803        7 days ago          933MB

このイメージを削除してみます。IMAGE ID を rmi します。

~/Workspaces$ sudo docker rmi 2d2ae8451803
~/Workspaces$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

きれいに削除されました。
イメージを新しくビルドしたい時などは、こうして一度イメージまで削除してから再構築したほうがいいと思います。
できるだけ不要なイメージは削除しておいたほうがいいでしょう。

Dockerfile の準備

Python3 のイメージを使ってコンテナを起動しました。
Dockerfile はそのようなコンテナ起動の設定を記述したもので、Docker の環境を構築するのに便利です。
慣れてきたら自分で作成するのもいいでしょう。

Workspaces に Dockerfile という名前のファイルを作成しましょう。
中はこう記述します。
※追記:root で実行していたのを一般ユーザーを作成してそのユーザーで実行出来るようにしました。

FROM python:3

MAINTAINER Naruhiko

# Japanese Localization
RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# User settings
ARG UID=1000
ARG USER=ユーザー名
RUN useradd -m -u ${UID} ${USER}
# Change user
USER ${UID}

# python package
RUN pip install --upgrade pip && \
pip install requests && \
pip install bs4

中身の説明をします。

まずは、先程実行した Python:3 ですね。
このイメージを基本にします。

FROM python:3

次は、タイムゾーンの設定です。
日本にしておかないと、時間が大幅にずれます。

# Japanese Localization
RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

実行するユーザーを作成して、そのユーザーに切り替えます。

# User settings
ARG UID=1000
ARG USER=ユーザー名
RUN useradd -m -u ${UID} ${USER}
# Change user
USER ${UID}

ARG は Docker 実行時の指定した値を取り出します。
UIDはホストのUIDと同じものをするようにします。デフォルトは1000です。
ターミナルで id と入力すると、詳細が見えるので試しておいてください。
USERは作成したユーザー名を指定しておきます。実行時に変更することも可能です。

最後に、今回の Python で使うパッケージをインストールしておきます。
・pip というパッケージ管理を最新にします。
・スクレイピングする requests をインストールします。
・取得したデータを整形する bs4(beautifulsoup) をインストールします。

# python package
RUN pip install --upgrade pip && \
pip install requests && \
pip install bs4

これをビルドしてコンテナを起動していきます。

Dockerfile のビルド

では、作成した Dockerfile をビルドしてイメージを作ってみましょう。
ターミナルで Workspaces ディレクトリに移動し、docker build を実行します。
イメージの名前は crawler にしました。

~$ cd Workspaces
~/Workspaces$ sudo docker build -t crawler .

UIDを1000以外にする場合は、「-build-arg UID=調べたUID」をオプションとして追加指定します。 --build-arg USER=ユーザー名
USERをデフォルト以外にする場合は、「-build-arg USER=ユーザー名」をオプションとして追加指定します。

Sending build context to Docker daemon   2.56kB
Step 1/3 : FROM python:3
3: Pulling from library/python
・
・
・
 ---> ba242712fa43
Successfully built ba242712fa43
Successfully tagged crawler:latest
~/Workspaces$

途中長かったので省略しましたが、これでビルド完了です。
イメージができているか確認しましょう。

~/Workspaces$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
crawler             latest              ba242712fa43        3 minutes ago       944MB
python              3                   eeadc22d21a9        28 hours ago        933MB

イメージが2つできています。
一つは python3 のイメージ、そしてもう一つは先程ビルドした crawler のイメージです。
crawler のイメージは python を基にして追加したイメージです。
実行にはこの2つがセットになっています。

ここで (None) などと表示されていた場合は失敗しています。
一度イメージを削除して DockerFile を見直してみてください。

ビルドしたイメージでコンテナを起動

とりあえずコンテナを起動できるか確認してみましょう。

~/Workspaces$ sudo docker run crawler
~/Workspaces$

何事もなく終わりました。

~/Workspaces$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                          PORTS               NAMES
5f51c4098810        crawler             "python3"           About a minute ago   Exited (0) About a minute ago  

停止していますが、コンテナの起動を確認できました。

今回のまとめ

Docker の簡単な使い方を説明しました。
慣れるまでは大変かもしれません。
でも、Docker のいいところは、変なことして壊しても
ホスト側には影響がまったくないことです。
ですので、どんどん Docker を起動して削除してみましょう。

この Dockerfile は次の VSCode で使いますので残しておきましょう。
ちなみに、今起動しているコンテナ及びイメージは削除しておいてください。
VSCode では新たにビルドをし直します。

---

気に入っていただけたら、フォローや好きをお願いします!

連載目次

【初心者向け】Pythonでスクレイピングする環境を作る① はじめに
【初心者向け】Pythonでスクレイピングする環境を作る② Dockerの使い方
【初心者向け】Pythonでスクレイピングする環境を作る③ VSCodeでDocker環境を構築する
【初心者向け】Pythonでスクレイピングする環境を作る④ requestsでデータを取得してみる
【初心者向け】Pythonでスクレイピングする環境を作る⑤ Google検索をしてみる
【初心者向け】Pythonでスクレイピングする環境を作る⑥ スクレイピングでの注意事項
【初心者向け】Pythonでスクレイピングする環境を作る⑦ 検索結果のページのタイトルを取得する
【初心者向け】Pythonでスクレイピングする環境を作る⑧ クラスにまとめてみる
【初心者向け】Pythonでスクレイピングする環境を作る⑨ テストしてみる
【初心者向け】Pythonでスクレイピングする環境を作る⑩ crawler と scraper を分ける


ここから先は

0字

¥ 100

この記事が気に入ったらサポートをしてみませんか?