Docker实现Python+selenium+chrome服务

Linux 系统上使用 Docker 实现 Python+selenium+chrome 服务

环境

Centos 7.2

安装

安装Docker

安装docker-compose

docker-compose是用于定义和运行多容器Docker应用程序的工具,在windows系统不需要安装,在linux系统上运行需要安装

下载稳定版本:

1
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

对二进制文件应用可执行权限:

1
sudo chmod +x /usr/local/bin/docker-compose

Docker官方:

拉取镜像

拉取 python:3.8

1
docker pull python:3.8

拉取 selenium/standalone-chrome

1
docker pull selenium/standalone-chrome:latest

selenium/standalone-chrome官方:

准备文件

创建一个 ceshi 目录,该目录下有以下五个文件:

Dockerfile :用于构建新Python镜像,因为要安装selenium
docker-compose.yml :用于定义和运行多容器Docker应用程序的工具
main.py :Python代码
install.sh :为了不让 Dockerfile 文件看起来太长,将一些命令写在这里
Pipfile :Python包管理

Dockerfile

用来构建新Python镜像,因为还没有安装 selenium

1
2
3
4
5
FROM python:3.8
COPY . /code
WORKDIR /code
RUN sh install.sh
CMD ["pipenv","run","python3","main.py"]

FROM :基础镜像
COPY :将 ceshi 目录下的所有文件复制到容器 /code 目录下
WORKDIR :指定 /code 为工作目录
RUN :构建镜像时执行的命令,这里用来执行 install.sh
CMD ::容器启动时执行的命令

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: "3.6"
services:
cs:
image: mypy:latest
container_name: cs
volumes:
- /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime
- ./main.py:/code/main.py
command:
depends_on:
- chrome
chrome:
image: selenium/standalone-chrome:latest
container_name: selenium-chrome
ports:
- "4444:4444"
shm_size: 2g

image :指定镜像,mypy:latest 镜像后面会创建
container_name:指定容器名称
volumes :数据挂载,冒号 : 前面是宿主机路径,后面是容器内路径;第一行同步宿主机与容器时间;第二行同步代码
depends_on :依赖
ports :宿主机端口映射容器端口,需确保安全组已开放4444端口
shm_size :大小

main.py

容器启动时要执行的Python代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import time
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

## 启动chrome服务需要时间,所以等待10s再执行代码
time.sleep(10)

# 连接到 selenium-chrome 容器
driver = webdriver.Remote(
command_executor="http://selenium-chrome:4444/wd/hub",
desired_capabilities=DesiredCapabilities.CHROME
)

# 访问百度
driver.get("http://www.baidu.com")
# 打印网页标题
print(driver.title)

selenium-chrome:4444 对应 docker-compose.yml 文件中的的容器名称 selenium-chrome 和端口 ports

install.sh

因为我习惯使用 pipenv 来管理虚拟环境、包及依赖,自然有 PipfilePipfile.lock 这两个文件,那么 install.sh 内容为:

1
2
3
4
# 更新pip至最新版、安装pipenv、创建虚拟环境并安装依赖包
python3 -m pip install --upgrade pip \
&& pip3 install pipenv -i https://pypi.tuna.tsinghua.edu.cn/simple \
&& pipenv install

如果没有使用过 Pipenv ,可以手动创建一个 Pipfile 文件(文件内容看后面说明),那么 install.sh 内容为:

1
2
3
4
5
# 更新pip至最新版、安装pipenv、创建虚拟环境、安装依赖库(第三方库)
python3 -m pip install --upgrade pip \
&& pip3 install pipenv -i https://pypi.tuna.tsinghua.edu.cn/simple \
&& pipenv --python 3.8 \
&& pipenv update

pipenv update 相当于执行 pipenv lockpipenv sync 两个命令

Pipfile

Python包管理

1
2
3
4
5
6
7
8
9
10
11
12
[[source]]
name = "清华镜像"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
verify_ssl = true

[dev-packages]

[packages]
selenium = "*"

[requires]
python_version = "3.8"

url :清华源,用于加速下载第三方库,这就是为什么要手动创建 Pipfile 文件,因为要修改这里
selenium :要安装的库
python_version :Python版本,需与使用的Python镜像版本一致

构建mypy镜像

ceshi 目录下执行

1
docker build -t mypy:latest .

查看镜像

1
docker images

应该看到有一个 mypy 镜像

启动Python+selenium+chrome

ceshi 目录下执行

1
docker-compose up -d

查看容器

1
docker ps -a

这时有 csselenium-chrome 两个容器

查看 cs 容器日志

1
docker logs cs

如果看到输出 百度一下,你就知道 ,说明构建成功了