同福

使用Dockerfile基于3.8-buster镜像搭建Python+selenium微服务环境【20210516】

介绍

介绍

大家根福哥学会了使用Dockerfile创建Docker镜像的技巧了,那么我们现在搭建服务器环境就不需要再去下载软件的源代码了,也不需要编译安装了,更加不用操心软件和操作系统的各种兼容问题了。

今天福哥带着大家来安装python的环境,Python能做的事情非常多,不过福哥这里先用它来实现搜索引擎的爬虫功能。前面我们已经学到了使用Python实现爬虫功能需要selenium库以及chrome插件,今天福哥就带着大家编写Python+selenium的Dockerfile配置文件。

镜像

tag

看到hub上面已经找不到python2.7的镜像了,所以福哥只能选择python3.8了。

home/topic/2021/0516/07/3d9084f003b4ed2208f63f6702d9e959.png

结构

照例我们先把镜像拉取下来,然后启动一个容器,看看里面都有什么,弄明白了自己才好捣鼓啊!

拉取镜像

docker pull python:3.8-buster

启动临时容器

docker run -tid --name python3.8 -h python3.8 python:3.8-buster

切入临时容器

docker exec -ti python3.8 "/bin/bash"

查看结构

python的版本是3.8.10。

home/topic/2021/0516/07/5d4f6c4a7218396115418ca272759cc3.png

pip的版本是21.1.1。

home/topic/2021/0516/07/79dc4dfd709ae1f3a3b50a418d96ec49.png

停止临时容器

docker stop python3.8

删除临时容器

docker rm python3.8

手动安装

福哥先在临时容器里面手动安装一遍环境,然后再整理到Dockerfile里面,这样大家会看得比较清楚一些~~

更新apt

我们需要安装一些工具,需要用到apt命令,用之前需要先更新一下。

apt-get update

安装依赖库和工具

部分扩展需要从外面下载,所以wget还是需要的。

apt-get -y install wget

准备安装包目录

我们还是建立一个目录用来保存软件的安装包。

mkdir /packages
cd /packages

selenium

首先我们先来安装selenium库,直接提供pip安装即可。

pip install selenium

home/topic/2021/0516/07/6040d0d2b3e3cd111de0f03ec55a1e0b.png

chrome

在debian里安装chrome是使用deb格式的安装包的。

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
dpkg -i google-chrome-stable_current_amd64.deb

直接使用dpkg安装会提示缺少一堆的依赖项,可以使用下面的命令把依赖项安装上来。

apt-get -fy install

再来使用dpkg安装就不会报错了。

dpkg -i google-chrome-stable_current_amd64.deb

home/topic/2021/0516/08/2dfa533298cde1c8da8b4945d2594660.png

chrome驱动

除了chrome浏览器的Linux版本外,还需要安装驱动,让Python可以调用chrome浏览器。

wget https://chromedriver.storage.googleapis.com/90.0.4430.24/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
mv chromedriver /usr/bin/
chmod +x /usr/bin/chromedriver

验证

使用下面的程序验证Python+selenium环境是否安装成功了!

from selenium import webdriver
import time
import re

# make options of Chrome
opts = webdriver.ChromeOptions()
opts.add_argument("--headless")
opts.add_argument("--disable-gpu")
opts.add_argument("--no-sandbox")

# init Chrome
chrome = webdriver.Chrome(options=opts);

# call baidu.com
chrome.get("http://www.baidu.com")

# add keyword and press submit
input = chrome.find_element_by_id("kw")
input.send_keys("site:tongfu.net")
button = chrome.find_element_by_id("su")
button.click()

# wait a moment
time.sleep(3)

# check source code
source = chrome.page_source
regexp = re.compile("同福主页 - 首页 - 同福网 - TONGFU.net", re.M)
mats = regexp.search(source)
if mats:
    print (mats.group())
else:
    print ("miss match")

# quit Chrome
chrome.quit()

home/topic/2021/0516/08/d08cd2b33a7e17ffc1bf625b5eff95ae.png

Dockerfile

最后福哥把前面的设置命令整理到一起写成Dockerfile,这样大家就可以通过Dockerfile安装环境了。

由于在Dockerfile里面通过RUN执行命令的时候,一旦执行过程中出现返回非0结果的情况就会终止创建镜像。所以安装chrome的时候的那些依赖项就不能通过dpkg的特性一并交给apt-get安装了,需要一个一个地整理出来,福哥也是无语了~~

FROM python:3.8-buster

MAINTAINER Andy Bogate
MAINTAINER tongfu@tongfu.net
MAINTAINER http://docker.tongfu.net

WORKDIR /tongfu.net/web

# env
RUN apt-get update \
&& apt-get -y install wget

# package build
RUN mkdir /packages

# selenium
RUN pip install selenium

# chrome
RUN cd /packages \
&& wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb \
&& apt-get -y install fonts-liberation \
libasound2 \
libatk-bridge2.0-0 \
libatk1.0-0 \
libatspi2.0-0 \
libcups2 \
libdbus-1-3 \
libdrm2 \
libgbm1 \
libgtk-3-0 \
libnspr4 \
libnss3 \
libxcomposite1 \
libxdamage1 \
libxfixes3 \
libxkbcommon0 \
libxrandr2 \
libxshmfence1 \
xdg-utils \
&& dpkg -i google-chrome-stable_current_amd64.deb

# chrome driver
RUN cd /packages \
&& wget https://chromedriver.storage.googleapis.com/90.0.4430.24/chromedriver_linux64.zip \
&& unzip chromedriver_linux64.zip \
&& mv chromedriver /usr/bin/ \
&& chmod +x /usr/bin/chromedriver

# package delete
RUN rm -rf /packages

总结

今天福哥带着大家使用Dockerfile基于3.8-buster镜像搭建了Python+selenium微服务环境了,可以发现使用Dockerfile方式搭建环境我们真的只需要关心我们需要关心的部分,繁琐的编译参数、依赖库、环境参数等等一系列的问题基础镜像都给我们解决好了。

下一课,福哥会带着搭建学习使用Dockerfile搭建MySQL环境,敬请期待~~