上一篇文章『十分钟入门Docker,带你成为Docker王者之篇三』给大家讲了一下 如何将本地代码搞到DockerHub上做成Image,分享给比人,那么今天我们就来说一下,编写docker-compose,一次性同时启动多个Docker Image。超干货的哦~
0x00_回顾之安装数据库
我们根据前三篇文章讲的,我们先来在本地机器练一下手:
# 题目# 使用 Docker 来运行 MongoDB 数据库
哈哈哈,这个题目是不是超级简单啊?
首先,我们通过命令 $ docker search mongo
来看一下有哪些 Image 可以用:
这里我们看到,第一条数据显示的是官方认证的,但是注意: docker image 在使用的时候,是有一个 tag
值的,如果不填写,默认使用 latest
,所以,如果想要寻找特定的版本,推荐去:
https://hub.docker.com/
直接搜索mongo
,然后点击第一条进去看:
那么我们这里就选择 3.6
版本的 MongoDB 吧。通过命令 $ docker pull mongo:3.6
来把 Image 拉下来:
接着,我们运行这个 Image :
$ docker run -p 27017:27017 -v $PWD/db:/data/db -d mongo:3.6
这里得简单说一下这个命令:
- `-p` 后面跟着是映射端口号,就是将 Image 里面的 `27017` 端口映射到本地的 `27017` 端口。
- `-v` 表示的是挂载 `volume` ,简单理解这个就是存储路径的一一对应映射。
- `-d` 表示的容器在后台运行。
运行结果如下:
看到已经启动成功了,并且 $ docker ps
里面看到已经有一个容器在运行。我们通过MongoDB可视化软件 robomogo
来连接一下本地的数据库:
可以看到,这个确实就是刚才我们通过 Docker 启动的数据库。
当然,复杂的配置,Docker 也是支持的,我们这里是指最简单的跑起来一个 MongoDB 数据库。如果更加详细的,复杂的配置,那就需要通过 Dockerfile 来启动数据库了,具体 Dockerfile 的写法,可以参考上一篇文章,或者
是不是感觉很神奇??你并没有通过上网搜索复杂的数据库安装过程,也不必担心删除数据库会删不干净(直接停止运行容器就行了),就这么简简单单的通过Docker完成了数据库的安装.
0x01_爬虫数据存入数据库
既然我们有了本地的 MongoDB
数据库,那么我们可以把之前的 3dmSpider 爬取的数据,给他放到数据库里面。
如何将 Scrapy
的数据放到数据库呢? 只需要在 pipelines.py
文件中编写逻辑,同时别忘了在 settings.py
文件里面把 ITEM_PIPELINES
打开。
# pipelines.pyclass DockerpyspiderPipeline(object): def open_spider(self, spider): if (spider.name == "SampleSpider"): self.client = pymongo.MongoClient(host="127.0.0.1", port=27017) self.db = self.client["TDMSpiderProject"] self.collection = self.db["3dmcollection"] def process_item(self, item, spider): if isinstance(item, DockerpyspiderItem): try: self.collection.insert(dict(item)) logging.info("items: " + item['title'] + " has INSERTED in db.") except Exception as e: logging.error("PIPLINE EXCEPTION: DockerpyspiderItem: " + str(e)) return item def close_spider(self, spider): if self.client is not None: self.client.close()
特别注意上面的 pymongo.MongoClient(host="127.0.0.1", port=27017)
,这里我们先记录一下,因为是要连接本地数据库,所以这里写的就是 127.0.0.1
。
那么这个时候,我们运行一下我们的爬虫:
看到 log 里面是打印的是 写入数据库成功 的日志,我们再去数据库里面看看:
完美! 数据库里面存储了我们刚才爬虫读取的数据。
看到这里,是不是觉得这波操作还算比较骚?数据库我们没有很复杂的安装过程,就能完美使用,是不是觉得 Docker 很牛逼。
0x02_那么问题来了
结论当然是:可以啊~ 那么,
0x03_怎么搞?用docker-compose
Compose
是 Docker
容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器,使用 Docker Compose
不再需要使用shell脚本来启动容器。docker-compose
默认的模板文件是 docker-compose.yml
。一般通过docker-compose up
命令来启动
0x04_安装 docker-compose
*如果你安装的是 Docker Toolbox
,那么 docker compose
就已经自带了。一般是 Mac 和 Windows。
可以通过命令$ docker-compose --version
来检查 docker-compose 的信息:
如果没有安装,可以通过以下途径安装。
1. github下载安装
https://github.com/docker/compose
这个是 Compose 的 GitHub 页面,可以通过命令:
$ sudo curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
这里可以通过 Tag
来选取特定的版本,这里我们下载的是 1.24.1
。
然后添加执行权限就可以:
$ sudo chmod +x /usr/local/bin/docker-compose
之后就可以通过 $ docker-compose --version
来检测版本信息了。
2. pip安装
直接简单粗暴:
$ pip install docker-compose
安装即可。安装完成,全部都可以通过命令 $ docker-compose --version
来查看是否安装成功。
$ docker-compose --versiondocker-compose version 1.23.2, build 1110ad01
0x05_稍作改动的爬虫Image
既然 Docker-compose 已经安装好了,那么我们现在想要实现的就是:
- 启动一个 Scrapy 的Docker Image。能够爬取数据,并且存储到数据库中。
- 启动一个 MongoDB,能够接受之前的 Scrapy 爬虫爬取的数据,并把他们保存起来。
针对上面的想法,我们上一篇文章创建的 swyftg/3dmspider:lastest
得改动一些,创建一个 swyftg/3dmspider:2.0.0
的 Image。
0x06_制作 Docker Image 2.0 版本
这里 Image 2.0 的代码,我都已经在 GitHub 上分享出来了,如果想看代码细节的同学,请移步GitHub的 dev2 分支:
https://github.com/SwyftG/DockerLearn/tree/dev2
第一步,修改代码:
这里注意,开篇第一节我说的:
特别注意上面的
pymongo.MongoClient(host="127.0.0.1", port=27017)
,这里我们先记录一下,因为是要连接本地数据库,所以这里写的就是127.0.0.1
。
我们这里把 pymongo.MongoClient(host="127.0.0.1", port=27017)
里面的 host="127.0.0.1"
这个本地地址,改成 host="mongodb"
,当然,这里的名字你可以随便起,只要记住就好。我们这里暂时改成叫 mongodb
。
接着我们要在 requirements.txt
文件里面添加新的依赖:
scrapypymongo
第二步,更新GitHub
这里我们需要把代码上传到 GitHub 上,但是要注意,这里我们的代码你可以单独拉一个分支出来,像我一样,创建了一个 dev2
的分支;也可以给你的代码打 Tags
。
*因为 DockerHub 里面创建 Image 不同版本是有两种途径,一种是通过分支(branch),另一种就是通过标签(Tag)。
这里你可以选择一种自己使用。我这里就是简单的使用了分支(branch)的形式。
至于如何创建分支,上传代码,这里就不说了。属于 Git 的常规操作,如有不懂的同学,参考:
https://git-scm.com/book/zh/v1/Git-分支-分支的新建与合并
第三步,修改DockerHub
打开 https://cloud.docker.com/repository/list
页面,去 DockerHub 里面创建你的 Image 2.0,也就是要把刚刚提交到 GitHub 的代码来关联到这里。
我们点进去,进入到我们的工程目录里面,然后选择 Builds
标签:
点击 Configure Automate Builds
按钮。
这里步骤就是:
- 第一个红框,点击
BUILD RULES
就是用来创建 Docker Tag的; - 第二个红框,配置刚才你在 GitHub 上提交的代码分支;
- 第三个红框,点击,然后 DockerHub 就会帮你编译 Image。
点击了之后,页面就会跳到之前的 builds
页面,系统会自动编译:
成功之后就是这个样子:
那么如何查看我们的 Image 有多少 Tags
呢?很简单,去 DockerHub
网站(https://hub.docker.com/
),最上边搜索你的Image名字就可以。比如,我的Image名字就是 3dmspider
, 搜索结果就是下面这个样子:
点进去之后,发现有个 Tags
点进去就能看到你的项目有哪些 Tags 了。
看到这里有三个 Tags
,分别是 latest
,1.0.0
和2.0.0
。我们刚才修改的代码其实是 2.0.0
的版本。
好了,到此位置,我们的 2.0.0 版本的 Docker Image
就制作完成了。它的作用就是将爬取的数据,存入了一个 MongoDB
里面,这个 MongoDB
的 host
是 “mongodb”
。
可以通过命令 $ docker pull swyftg/3dmspider:2.0.0
来吧 Image 下载到本地喽~
0x07_初试Docker compose
OK,我们现在所有准备工作基本都完成了,想要完成文章当初指定的目标:
既然数据库我们是通过 Docker Image 启动的,我们能不能把爬虫那部分也弄成通过 Docker 启动啊?
下一步就是编写我们的 docker-compose.yml
文件了。
我们先明确几点:
- 我们的项目里面,应该是有两个 Docker 容器运行;
- 两个 Docker 容器分别运行着两个不同的 Docker Image;
- 一个 Image 是 3dmspider,另一个 Image 是 MongoDB;
- 而且,3dmspider 的容器启动运行需要依赖 MongoDB 的容器先运行好。
- 这两个容器启动是通过一行命令启动。
找一个空地(文件夹),创建一个文件,叫 docker-compose.yml
。
里面编写这些东西:
version: '3'services: mongodb: container_name: dock-mongodb image: mongo:3.6 ports: - 27017:27017 volumes: - ./db:/data/db 3dmdpider: image: swyftg/3dmspider:2.0.0 container_name: dock-3dmspider command: ["python3", "RunSpider.py"] depends_on: - mongodb
这里简单说一下:
version
字段:这里写3
,有的地方写的是2
,这个根据具体请看来写。而且2
和3
也有区别;services
字段:在这个目录下面,就是表示的有多少 Docker 服务需要启动;mongodb
和3dmdpider
字段:这两个字段表示的是 Docker 服务的名字,自己定义。注意:这里的 `"mongdodb"` 就是我们之前反复提到的 `MongoDB` 的 `host`。container_name
字段:字面意思,不解释。image
字段:这个和你当初写的DockerFile
里面的IMAGE
关键字的效果是一样的。后面跟着是可用的image
的名字。ports
字段:用来映射 Docker 容器和本地的端口,这里就是 MongoDB 的常规端口。volumes
字段:用来挂在存储内容,将本机的存储文件路径和 MongoDB 里面的路径做映射。command
字段:是指启动了容器之后,要执行的命令。这里相当于$ python3 RunSpider.py
。depends_on
字段:这个字段很关键!!!如果你要启动多个容器,并且他们之间有先后顺序的时候,就要用到这个字段了。它的意思是,在mongodb
容器启动好了之后,才会启动3dmdpider
容器。如果不加这个字段,就会出现3dmdpider
启动运行了,但是数据库的容器还没有启动好,导致数据存储失败发生。build
字段:这个字段这里没有用到,它的作用是根据DockerFile
来创建Image
,后面跟着的是DockerFile
的工程目录。可以参考这个链接的提交内容:https://github.com/SwyftG/DockerLearn/commit/f97ac2dadd2d75a6f58e6381ebf743b143292ac2#diff-4e5e90c6228fd48698d074241c2ba760
保存 docker-compose.yml
文件,然后,我们通过一条很简单的命令 $ docker-comopse up
来启动我们的容器们:
看到两个 done
,说明容器已经启动了;
数据库启动完成,已经可以塞数据了。
看到本地的数据库已经将爬虫的数据存入了。
本地多了一个 db
文件夹,这个就是我们刚才写的 volumes
字段对应的文件。
看到这里,是不是,感觉非常是顺滑??非常的爽。只要通过一个命令就启动了多个容器。如果要停止所有启动的容器,很简单,到刚才 docker-compose.yml
文件的目录下面,通过命令 $ docker-compose down
就可以停止了。
OK,到此位置, docker-compose 的初窥就到此位置了,如果想要了解更多,可以参考:
https://github.com/docker/compose
0x08_練習します
Docker 都讲到这个地步了,真的就是为所欲为了啊。后面的内容会给大家说 Docker 更高级的用法。
这么好评的干货文章,大家帮忙点个右下角的好看呗,你这么帅,不点好看怎么过去啊。
喜欢的可以关注公号『皮爷撸码』,回复『代码』,其中DC001就是 Docker 系列的代码,大家可以学习一下。