需求:公司需要采集一批数据,需要将selenium爬虫部署在20多台国外服务器上面
搭建swarm集群
# 步骤一:
# 构建swarm主节点(47.*.*.A服务器)
docker swarm init --advertise-addr=47.*.*.A
docker swarm join --token SWMTKN-1-43a3vzvyk8j6**nfxscrbyo*****2g1fpobxiyljuu-1nr43qsho3ytqjg55x46drsp1 47.*.*.A:2377
# 其余服务器加入,成为从节点(将上面生成的的token运行到其余的服务器上)
47.*.*.B
47.*.*.C
........
# 查看节点
docker node ls
利用dockerfile构建相应的爬虫镜像
编写Dockerfile
FROM python:3.7
# base python env
RUN pip install requests && pip install pymysql && pip install redis && pip install selenium && pip install lxml && pip install tablestore && pip install watchdog && pip install flask
# install google chrome
RUN wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
RUN apt-get -y update
RUN apt-get install -y google-chrome-stable
# install chromedriver
RUN apt-get install -yqq unzip
RUN wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip
RUN unzip /tmp/chromedriver.zip chromedriver -d /usr/bin/
# set display port to avoid crash
ENV DISPLAY=:99
# 将当前的文件拷贝到docker中的 /code/Facebook_my路径下
COPY ./ /code/Facebook_my
# 将docker内部的图片路径映射到外部服务器相应的路径
VOLUME ["/Face_book_img"]
# 运行爬虫脚本
CMD python /code/Facebook_my/f_craw_tablestore_class_docker.py
搭建一个私有的仓库
docker pull registry
docker run -d -p 5000:5000 --name=facebookregistry --restart=always --privileged=true -v /usr/local/docker_registry:/var/lib/registry docker.io/registry
echo '{ "insecure-registries":["47.*.*.A:5000"] }' >> /etc/docker/daemon.json
systemctl restart docker
构建一个镜像并将镜像push到私有仓库中
docker build -t 47.*.*.A:5000/f_craw_tablestore_class_docker .
docker push 47.*.*.A:5000/f_craw_tablestore_class_docker
tips
:如何删除仓库中的镜像
# 查看在运行的容器
docker ps
# 进入到仓库容器
docker exec -it ac930bb sh
cd /var/lib/registry/docker/registry/v2/repositories
# 删除镜像
rm -rf f_craw_tablestore_class_docker
利用相应的镜像启动相应的name为f_craw_tablestore_class_docker的服务(主节点运行)
# --mode=global 参数可以将服务运行到每个节点上面
docker service create --name f_craw_tablestore_class_docker 47.*.*.A:5000/f_craw_tablestore_class_docker
删除相应的服务器(主节点运行)
# docker service rm f_craw_tablestore_class_docker
更新相应的服务器(主节点运行)
# docker service update f_craw_tablestore_class_docker
将服务横向扩展为20个(主节点运行)
docker service scale f_craw_tablestore_class_docker=20
查看日志
docker logs --since 10m 容器id
docker service logs -f f_craw_tablestore_class_docker
docker service ps f_craw_tablestore_class_docker | grep Running | awk '{print $1}' | xargs -i docker service logs --tail 20 {}
关闭服务再更新
docker service scale f_craw_tablestore_class_docker=0
docker service update --image 47.*.*.A:5000/f_craw_tablestore_class_docker:v2 f_craw_tablestore_class_docker
docker service scale f_craw_tablestore_class_docker=10
进入到相应的容器中
# 查看正在运行的容器
docker ps
# 进入到相应的容器中
docker exec -it 容器id sh
卸载docker环境
# 各种版本的docker卸载(仅限是用yum安装的docker, rpm安装的请用rpm命令卸载)
yum remove docker docker-common docker-selinux docker-engine
# 查看docker是否已经卸载
yum list install | grep docker
# 查看docker保留文件
rm -rf /var/lib/docker
相应的python脚本
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
browser=webdriver.Chrome(executable_path="/usr/bin/chromedriver",options=chrome_options)
可能会遇到的问题
failed to register layer: lstat /var/lib/docker/overlay2/703e616d59138b772e16d42b3601449bedd8705bc55db9bfbb571546953eee7a: no such file or directory
docker system prune -a
新增从节点
# 主节点运行
docker swarm join-token worker
swarm主备实现高可用
docker node promote 工作节点主机名2
docker设置代理
# vim /usr/lib/systemd/system/docker.service
Environment="HTTP_PROXY=yourproxyaddresss:8080" "HTTPS_PROXY=yourproxyaddresss:8080"
http://c.biancheng.net/view/3178.html