十分钟入门Docker,带你成为Docker王者之篇四---Docker-compose

680 阅读5分钟

上一篇文章『十分钟入门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_那么问题来了

既然数据库我们是通过 Docker Image 启动的,我们能不能把爬虫那部分也弄成通过 Docker 启动啊?

结论当然是:可以啊~ 那么,

0x03_怎么搞?用docker-compose

ComposeDocker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器,使用 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 已经安装好了,那么我们现在想要实现的就是:

  1. 启动一个 Scrapy 的Docker Image。能够爬取数据,并且存储到数据库中。
  2. 启动一个 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,分别是 latest1.0.02.0.0。我们刚才修改的代码其实是 2.0.0 的版本。

好了,到此位置,我们的 2.0.0 版本的 Docker Image 就制作完成了。它的作用就是将爬取的数据,存入了一个 MongoDB 里面,这个 MongoDBhost“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,这个根据具体请看来写。而且 23 也有区别;
  • services 字段:在这个目录下面,就是表示的有多少 Docker 服务需要启动;
  • mongodb3dmdpider字段:这两个字段表示的是 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 系列的代码,大家可以学习一下。