上一篇文章『十分钟入门Docker,带你成为Docker王者之篇二』给大家讲了一下 Docker 中管理容器和镜像的常用命令,那么今天我们就来说一下,如何让你写的本地代码成为Image,编写DockerFile,并且分享给别人使用。超干货的哦~
这篇文章的目录:
- 撸一份可以运行的本地代码;
- 编写Dockerfile文件;
- 运行本地 Image;
- 注册Docker Hub账号;
- 将本地代码弄到Docker Hub上去;
- 他人通过命令可以下载你的Image玩耍了。
0x00_本地撸一份可以运行的代码
这里呢,我们就来很简单很简单的撸一个 Scrapy 爬虫代码,其实任何代码都可以, Hello World 也是可以的,只不过那样太简单了,所以我们这边稍微弄一个不简单的。爬取 https://www.3dmgame.com/ 的新闻条目信息。
这里关于Scrapy的爬虫怎么写,我这里就不做太多详细介绍了。
有一点,我这里必须先提前说一下:路径的问题!
有一点,我这里必须先提前说一下:路径的问题!
有一点,我这里必须先提前说一下:路径的问题!
为什么要说路径的问题,是因为Scrapy运行爬虫的时候,爬虫的路径和Scarpy命令是相关联在一起的。如果你的路径不对,就会出现以下报错:
# 错误一Scrapy 1.x.x - no activie projectUnknow command: Crawl
或者是:
# 错误二No module named xxxx
这两种。我们分别来说明都发生了什么。
错误一的主要问题就是,你在移动你爬虫源代码的时候,你的爬虫引用出现了错误。这个错误是由于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。
0x01_纯手工打造Dockerfile
参考地址: https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
如果要编写Dockerfile,首先第一步就是创建一个文件,叫Dockerfile,注意:没有任何文件后缀。Dockerfile 的位置,就在那个路径图里面标出来了:
接下来,我们来简单分析一下我们的 Dockerfile 里面应该操作些什么:
- 创建Python环境;
- 将代码和
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版本来编译。 - 第二行,很简单,就是说将当前目录下的代码,拷贝到 Image 里面,这里也就是
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 这里来找。
0x02_套马的汉子跑起来
这个时候,我们既然已经编写了 Dockerfile,那么我们就赶紧来 $ docker build 一下吧。
首先,进入到你的项目目录里面,然后,通过命令:
$ docker build -t mybuild .
来编译我们的Image。这里我来简单说一下这个命令是怎么个回事儿:
-t mybuild这俩是一起的,-t后面跟着的是你 Image 的名字。.这个则是代表编译工作在当前目录里寻找Dockerfile来进行编译。当然,你也可以指定路径。我这么弄完全是为了简单。
如果,你的编译出错了,像我这样:
梳理一下你的网络,然后重启一下 Docker 服务就好了。重启完,我们接着编译:
大家看,这里就成功创建了我们的 Image,名字就叫 mybuild,和 -t 后面的值是一样的。那么我们通过命令来看一下:
$ docker run mybuild
结果如下:
OK,可以看到 3dm 的新闻信息已经打印出来了,很完美。接下来我们需要把这个 Image 放到 DockerHub 上让大家使用了。
0x03_代码放到DockerHub
想要把你的代码放到 Dockerhub 上,那么第一步就需要把你的代码得放到 GitHub 上。
https://github.com/
至于这里怎么把你的代码放到 GitHub 上,皮爷这里就不多说了,因为这个很简单而且很基础,不会的同学可以百度查一下,皮爷这里就直接给大家看现成的吧,这一篇文章的代码皮爷放到了dev分支下面,记住,分支名称很关键:
既然放好代码了,我们接下来就就要去 DockerHub 申请账号了。
https://hub.docker.com/signup
成功注册之后,我们登录。登录 完成之后,我们点击最上面导航栏里面的 Repositorys,然后点击 Create Repository:
我们就来到了创建界面:
这里有几点要简单说明一下:
- 第一个红框,是让你输入Image名字的;
- 第二个红框,你可以创建Private和Public两种Image,具体区别如同字面意思;
- 第三个红框,这个就是你Docker Image的代码来源。神奇不?看到 GitHub 了吗?想到我们刚才所做的了吗?
我们点击 GitHub 来看一下:
这里有几点注意的地方:
- 第一个红框,选用的是 GitHub 代码;
- 第二个红框,填写的则是你的 GitHub 的代码具体仓库,这里则是
SwyftG/DockerLearn; - 第三个红框,则是填写你要编译代码的分支,这里我们强调一下,是
Dev分支!
最后,我们点击 Create&Build 按钮,就创建成功了。
如果想看 Build 信息,就在 Build 里面看。如果你的代码做了修改,然后也在 GitHub 上更新了代码,你想重新 Build 一下你的 Docker Image,那么你在 Build 里面也可以设置选项,来重新 Build 你的 Image。
既然我们已经把代码放到了 DockerHub 上,我们就来看看我们的 Image 是否能够找得到吧:
很完美,可以找到~~~
0x04_开始放纵玩耍
此时,你的代码已经编译成功, 并且放到了 Docker Hub 上,那么我们就来让其他小伙伴玩耍吧。
$ docker run seyftg/3dmspider# 或者把 Image 下载下来$ docker pull swyftg/3dmspider
不管怎样,我们都可以看到,$ docker images 里面有了我们的 swyftg/3dmspider Image。
不管你是在本地运行,还是在小伙伴的电脑上运行,还是在你的云服务器上运行,现在这个样子的运行方式,是不是超级轻松方便?就如同我们开局所说的,Docker 的 Image 就是一个模具,你拿着这个模具可以在任何机器上面运行。酷炫不酷炫?方便不方便?哈哈哈哈
0x05_课后小练习?
好了,我们今天我们主要说了如何让本地代码制作成 Docker Image,然后如何放到 DockerHub 上,再分享给别人的过程。
那么皮爷有个疑问,就是:如果我想启动一个 Scrapy 的 Spider Image,然后又想启动一个 MongoDB 数据库的Image,我要怎么做呢??
这么好评的干货文章,大家帮忙点个右下角的好看呗,你这么帅,不点好看怎么过去啊。
喜欢的可以关注公号『皮爷撸码』,回复『代码』,其中DC001就是 Docker 系列的代码,大家可以学习一下。你这么帅气,还不关注一下啊???