上一篇文章『十分钟入门Docker,带你成为Docker王者之篇二』给你们讲了一下 Docker 中管理容器和镜像的经常使用命令,那么今天咱们就来讲一下,如何让你写的本地代码成为Image,编写DockerFile,而且分享给别人使用。超干货的哦~python
这篇文章的目录:git
这里呢,咱们就来很简单很简单的撸一个 Scrapy 爬虫代码,其实任何代码均可以, Hello World 也是能够的,只不过那样太简单了,因此咱们这边稍微弄一个不简单的。爬取 https://www.3dmgame.com/
的新闻条目信息。github
这里关于Scrapy的爬虫怎么写,我这里就不作太多详细介绍了。docker
有一点,我这里必须先提早说一下:路径的问题! 数据库
有一点,我这里必须先提早说一下:路径的问题! bash
有一点,我这里必须先提早说一下:路径的问题! 服务器
为何要说路径的问题,是由于Scrapy运行爬虫的时候,爬虫的路径和Scarpy命令是相关联在一块儿的。若是你的路径不对,就会出现如下报错:网络
# 错误一Scrapy 1.x.x - no activie projectUnknow command: Crawl复制代码
或者是:app
# 错误二No module named xxxx复制代码
这两种。咱们分别来讲明都发生了什么。dom
错误一的主要问题就是,你在移动你爬虫源代码的时候,你的爬虫引用出现了错误。这个错误是因为scrapy.cfg
里面针对于settings
路径变化引发的。错误二是因为settings.py
文件里面的变量没有修改。
Scrapy爬虫的爬虫依赖主要有这么两个地方,在每次移动的时候,你都要看看这两个位置是否须要修改:
scrapy.cfg
文件里面的 [settings] default = xxxxx.settings
。这里你得看一下你得default对应的路径,是不是你工程的 settings.py 文件。settings.py
文件里面,SPIDER_MODULES
, NEWSPIDER_MODULE
这两个变量是否在修改了文件路径以后,也须要修改路径变量值。以及在这个文件中若是要引入pipeline
和middleware
,那么这两个变量的路径值,是否也要修改。其实目前咱们这一步还不须要修改路径,这里只是简单说一下,以备后用。你们的工程目录能够看下图:
咱们接着说代码的事儿。这里只是把关键的核心Spider的代码简单贴一下,若是有小伙伴想看详细代码,能够去:https://github.com/SwyftG/DockerLearn/tree/dev/DockerPySpider
这里查看。
# Spider.pyclass SamplespiderSpider(scrapy.Spider): name = 'SampleSpider' allowed_domains = ['www.3dmgame.com'] def start_requests(self): start_url = "https://www.3dmgame.com/" yield Request(url=start_url, callback=self.parse_block_page, dont_filter=True) def parse_block_page(self, response): news_list = response.xpath("//div[@class='Listwrap']//a").extract() for content_item in news_list: selector = Selector(text=content_item) spider_item = DockerpyspiderItem() spider_item['title'] = selector.xpath("//text()").extract_first() spider_item['url'] = selector.xpath("//@href").extract_first() print(spider_item)# Items.pyclass DockerpyspiderItem(scrapy.Item): title = scrapy.Field() url = scrapy.Field()复制代码
简单在本地运行一下,发现爬虫是能够跑通的。
咱们进行下一步很关键的操做,编写Dockerfile。
参考地址: https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
若是要编写Dockerfile,首先第一步就是建立一个文件,叫Dockerfile
,注意:没有任何文件后缀。Dockerfile
的位置,就在那个路径图里面标出来了:
接下来,咱们来简单分析一下咱们的 Dockerfile
里面应该操做些什么:
requirement.txt
拷贝到镜像里面;恩,就是简简单单的这么几步,固然,这里只是最简单的说一下运行简单Scrapy爬虫的 Dockerfile
怎么写, Dockerfile
能够写的很复杂,并且有些状况必须写的很复杂,好比初始化数据库啊之类的。
这里我就先把这个项目的 Dockerfile
给先贴出来,和你们说一说:
FROM python:3.6COPY . .RUN pip3 install --no-cache-dir -r requirements.txtCMD [ "python3", "RunSpider.py" ]复制代码
你们能够看到,就是简简单单的四行语句:
FROM
表明你如今的Image是须要在哪一个Docker Image之上运行的。咱们这里本地是Python3.6,Scrapy爬虫也是在 Python3.6的环境里面跑的,因此咱们这里就 FROM python:3.6
,注意,最后那里有 :3.6
版本号标注。若是不标注,Docker 则会自动使用 latest
版原本编译。python 3.6
的 Image 里面。若是有特定的路径要求,这里能够知足。pip3
经过咱们代码里面的 requirements.txt
文件来安装工程依赖。相信使用过 pip 的同窗,对这一步都很熟悉。CMD
命令来运行咱们的爬虫程序,这里翻译过来就是 $ python3 RunSpider.py
命令。是否是很简单?固然,若是以为这么简单就可以玩转Dockerfile
,那是不可能的。想了解更多的,能够去参考如下连接内容:
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
这里要多说一下,就是寻找 Docker Image的方法。 咱们固然能够经过上篇文章所说的 $ docker search xxxx
命令来找 xxxx 的 Image ,可是为了更加直观的寻找Image,咱们能够去:
https://hub.docker.com/
里面搜索,好比咱们搜索 python
,就会出现下面的页面:
咱们点第一个进去看一下:
能够看到,这里全是 Python
的 Tags
。因此,若是咱们未来不管是写 Dockerfile
仍是写 docker-compose.yml
文件,FROM
字段和 IMAGE
字段以后的内容,均可以来 hub.docker.com
这里来找。
这个时候,咱们既然已经编写了 Dockerfile
,那么咱们就赶忙来 $ docker build
一下吧。
首先,进入到你的项目目录里面,而后,经过命令:
$ docker build -t mybuild .复制代码
来编译咱们的Image。这里我来简单说一下这个命令是怎么个回事儿:
-t mybuild
这俩是一块儿的, -t
后面跟着的是你 Image 的名字。.
这个则是表明编译工做在当前目录里寻找 Dockerfile
来进行编译。固然,你也能够指定路径。我这么弄彻底是为了简单。若是,你的编译出错了,像我这样:
梳理一下你的网络,而后重启一下 Docker 服务就行了。重启完,咱们接着编译:
你们看,这里就成功建立了咱们的 Image,名字就叫 mybuild
,和 -t
后面的值是同样的。那么咱们经过命令来看一下:
$ docker run mybuild复制代码
结果以下:
OK,能够看到 3dm 的新闻信息已经打印出来了,很完美。接下来咱们须要把这个 Image 放到 DockerHub 上让你们使用了。
想要把你的代码放到 Dockerhub 上,那么第一步就须要把你的代码得放到 GitHub 上。
https://github.com/
至于这里怎么把你的代码放到 GitHub 上,皮爷这里就很少说了,由于这个很简单并且很基础,不会的同窗能够百度查一下,皮爷这里就直接给你们看现成的吧,这一篇文章的代码皮爷放到了dev分支下面,记住,分支名称
很关键:
既然放好代码了,咱们接下来就就要去 DockerHub 申请帐号了。
https://hub.docker.com/signup
成功注册以后,咱们登陆。登陆 完成以后,咱们点击最上面导航栏里面的 Repositorys
,而后点击 Create Repository
:
咱们就来到了建立界面:
这里有几点要简单说明一下:
咱们点击 GitHub 来看一下:
这里有几点注意的地方:
SwyftG/DockerLearn
;Dev
分支!最后,咱们点击 Create&Build
按钮,就建立成功了。
若是想看 Build 信息,就在 Build 里面看。若是你的代码作了修改,而后也在 GitHub 上更新了代码,你想从新 Build 一下你的 Docker Image,那么你在 Build 里面也能够设置选项,来从新 Build 你的 Image。
既然咱们已经把代码放到了 DockerHub 上,咱们就来看看咱们的 Image 是否可以找获得吧:
很完美,能够找到~~~
此时,你的代码已经编译成功, 而且放到了 Docker Hub 上,那么咱们就来让其余小伙伴玩耍吧。
$ docker run seyftg/3dmspider# 或者把 Image 下载下来$ docker pull swyftg/3dmspider复制代码
无论怎样,咱们均可以看到,$ docker images
里面有了咱们的 swyftg/3dmspider
Image。
无论你是在本地运行,仍是在小伙伴的电脑上运行,仍是在你的云服务器上运行,如今这个样子的运行方式,是否是超级轻松方便?就如同咱们开局所说的,Docker 的 Image 就是一个模具,你拿着这个模具能够在任何机器上面运行。酷炫不酷炫?方便不方便?哈哈哈哈
好了,咱们今天咱们主要说了如何让本地代码制做成 Docker Image,而后如何放到 DockerHub 上,再分享给别人的过程。
那么皮爷有个疑问,就是:若是我想启动一个 Scrapy 的 Spider Image,而后又想启动一个 MongoDB 数据库的Image,我要怎么作呢??
这么好评的干货文章,你们帮忙点个右下角的好看呗,你这么帅,不点好看怎么过去啊。
喜欢的能够关注公号『皮爷撸码』,回复『代码』,其中DC001就是 Docker 系列的代码,你们能够学习一下。你这么帅气,还不关注一下啊???