确保win10系统上安装了docker. 由于我的win10系统是家庭版

请确认win10上安装了mongodb服务

如何把scrapy项目打包成一个docker镜像 ?

  1. 从github上下载scrapy工程:https:///Python3WebSpider/ScrapyTutorial ,当然也可以自己新建一个爬取工程,既然有了,就用现成的代码把,主要是熟悉下打包docker镜像的过程。 下载到本地后,解压的路径如下: D:\python_study\ScrapyTutorial-master\ScrapyTutorial-master
  2. 进入D:\python_study\ScrapyTutorial-master\ScrapyTutorial-master,然后在该目录下,新建一个requirements.txt文件,该文件主要作用,下载爬虫工程所对应的python 库. 例如:该例举工程需要两个库scrapy / pymongo ,所以,文件的内容设定如下:
    不带版本号获取不带版本号都可以:
pymongo
     Scrapy
pymongo==3.9.0
    Scrapy==1.7.3
  1. 同理,在该目录下D:\python_study\ScrapyTutorial-master\ScrapyTutorial-master,新建一个Dockerfile文件,文件不加任何后缀名,修改内容如下所示:
FROM python:3.7
ENV PATH /usr/local/bin:$PATH
ADD . /code
WORKDIR /code
RUN pip3.7 install -r requirements.txt -i http:///simple --trusted-host 
CMD scrapy crawl quotes
  1. docker如和访问 mongodb数据库,需要做以下设定才能正确访问:
    A: 进入mongodb数据库安装路径C:\Program Files\MongoDB\Server\4.2\bin ,然后找到mongod.cfg文件:
    修改前
net:
        port: 27017
        bindIp: 127.0.0.1

mongodb默认监听的是127.0.0.1:27017,因此是不允许远程访问的。所以安装mongodb时,如果:
要远程访问(使用ip访问),应当在配置文件配置开启IP访问. 绑定ip:0.0.0.0表示所有的ip都可以访问, 从docker 虚拟环境中访问win10的mongodb,相当于从远程电脑访问 这台win10主机.所有需要把ip配置成0.0.0.0

net:
       port: 27017
       bindIp: 0.0.0.0

配置好后,然后重启mongodb服务:

docker splash打开页面速度太慢 docker scrapy_docker


进入D:\python_study\ScrapyTutorial-master\ScrapyTutorial-master\tutorial,然后找到settings.py ,把MONGO_URI 设置如下: 192.168.1.6为我本机win10 ip地址

MONGO_URI='mongodb://192.168.1.6:27017'

如果不按上述配置,在docker中运行程序,就会提示: pymongo.errors.ServerSelectionTimeoutError: ip:27017: [WinError 10061] 由于目标计算机积极拒绝,无法连接。

  1. 接下来我们构建Docker镜像,执行如下命令:
    双击打开Docker Quickstart Terminal,出现如下界面:

    然后进入到D:\python_study\ScrapyTutorial-master\ScrapyTutorial-master\,执行如下命令:
docker build -t quotes:latest .

出现如下提示,就说明构建成功:

$ docker build -t quotes:latest .
Sending build context to Docker daemon  196.1kB
Step 1/6 : FROM python:3.7
 ---> 02d2bb146b3b
Step 2/6 : ENV PATH /usr/local/bin:$PATH
 ---> Using cache
 ---> 7b99ea57dee5
Step 3/6 : ADD . /code
 ---> 976ebbfcccc6
Step 4/6 : WORKDIR /code
 ---> Running in 5009b54696d4
 ..........
..........
 ---> cf2bbe222d24
Step 6/6 : CMD scrapy crawl quotes
 ---> Running in 040969dfe2c7
Removing intermediate container 040969dfe2c7
 ---> 5290b4af9ee8
Successfully built 5290b4af9ee8
Successfully tagged quotes:latest

输入下列命令,查看一下构建的镜像,如下所示:

docker images

运行接口可以看到,这就是我们新构建的镜像。

docker splash打开页面速度太慢 docker scrapy_python_02

如何运行?执行下列命令:

docker run quotes

可以看到通过docker抓取流程跟 正常的爬取流程一样:

docker splash打开页面速度太慢 docker scrapy_python_03


docker splash打开页面速度太慢 docker scrapy_Docker_04


docker splash打开页面速度太慢 docker scrapy_docker镜像_05


通过工具Robo3T访问mongodb数据库,就能查看爬取的数据信息:

docker splash打开页面速度太慢 docker scrapy_python_06


如何把镜像推送至Docker Hub

1: 首先在https://注册一个账号,新建一个Repository,名为quotes。比如,我的用户名为***, 新建的Repository名为quotes,那么此Repository的地址就可以用 ***/quotes来表示

为新建的镜像打一个标签,命令如下所示:

docker tag quotes:latest  ***/quotes:latest

Push镜像到Docker Hub即可,命令如下所示:

docker push ***/quotes

push过程中可能会出现如下错误:

$ docker push ***/quotes
The push refers to repository [/***/quotes]
9f060cf20d2d: Preparing
1d72c0ea3cd7: Preparing
46ed3d879948: Preparing
fbeeb71995b3: Preparing
bb9e1c111e49: Preparing
ac3ac7a153b5: Waiting
3bfeb766f97b: Waiting
ea1227feeccb: Waiting
9cae1895156d: Waiting
52dba9daa22c: Waiting
78c1b9419976: Waiting
denied: requested access to the resource is denied

可以参考截图,解决的方法: 启动docker,然后登录自己的账号和密码:

docker login

docker splash打开页面速度太慢 docker scrapy_docker镜像_07


然后登录https://cloud.docker.com,查看,如截图多出了一个Tags列表项, 就代表推送成功:

docker splash打开页面速度太慢 docker scrapy_docker_08


如果我们想在其他的主机上运行这个镜像,主机上装好Docker后,可以直接执行如下命令:

首先登录docker账号/密码,然后运行下列命令:

docker run ***/quotes

还可以指定标签运行(如果有多个标签,需要指定标签运行):

docker run ***/quotes:latest

这样就会自动下载镜像,启动容器运行。不需要配置Python环境,不需要关心版本冲突问题。

运行结果如截图:

docker splash打开页面速度太慢 docker scrapy_docker_09


运行过程中遇到的错误:

1.执行docker-machine restart会提示如下错误:
Unable to verify the Docker daemon is listening: Maximum number of retries (10) exceeded

默认配置出问题,重置默认配置即可。输入指令

docker-machine rm -f default
docker-machine create -d virtualbox default
  1. Looks like something went wrong in step ´Finalize´… Press any key to continue…
    如果遇到这种错误:
    脚本执行错误,找到start.sh文件,我本地默认放到 C:\Program Files\Docker Toolbox目录下,
    注释“Finalize”的下一行“clear”即可(84行的位置)
STEP="Finalize"
#clear
cat << EOF

#通过docker-machine进入docker环境
打开Oracle VM VirtualBox,可以看到对应的虚拟机名称,默认为default

docker-machine ssh default

开启default虚拟机:

docker-machine start default

关闭default虚拟机:

docker-machine stop default

如果还有其他虚拟机,想进入docker环境,也可以输入

docker-machine ssh others

进入/var/lib/boot2docker/profile中,可以配置加速地址:

#在--label provider=virtualbox的下一行添加
--registry-mirror https://

然后重启docker服务

sudo /etc/init.d/docker restart

或者重启VM:exit退出VM bash,在windows bash中执行

docker-machine restart

如何删除本地docker images 某一个tag:

先查看docker 中有几个images :

docker splash打开页面速度太慢 docker scrapy_docker_10

如何要删除 tag: latest, 可以执行以下命令:

docker splash打开页面速度太慢 docker scrapy_docker_11

运行结果出错,由于image被某个container引用(拿来运行),如果不将这个引用的container销毁(删除),那image肯定是不能被删除. 可以通过以下命令查看 该images被哪个container引用:

docker splash打开页面速度太慢 docker scrapy_Docker_12


可以看出5290b4af9ee8的image被14a0b0936326的container使用着,所以必须首先删除该container:

docker splash打开页面速度太慢 docker scrapy_docker_13


出现错误,这是因为该container正在运行中(运行docker ps查看),先将其关闭

docker splash打开页面速度太慢 docker scrapy_Docker_14


docker splash打开页面速度太慢 docker scrapy_docker镜像_15


然后依次删除 container , IMAGE_ID :

docker splash打开页面速度太慢 docker scrapy_python_16


docker splash打开页面速度太慢 docker scrapy_Docker_17


docker splash打开页面速度太慢 docker scrapy_docker_18


可以看出,image已经被删除。