十分鐘入門Docker,帶你成爲Docker王者之篇四---Docker-compose

上一篇文章『十分鐘入門Docker,帶你成爲Docker王者之篇』給你們講了一下 如何將本地代碼搞到DockerHub上作成Image,分享給比人,那麼今天咱們就來講一下,編寫docker-compose,一次性同時啓動多個Docker Image。超乾貨的哦~python

0x00_回顧之安裝數據庫

咱們根據前三篇文章講的,咱們先來在本地機器練一下手:git

# 題目# 使用 Docker 來運行 MongoDB 數據庫複製代碼

哈哈哈,這個題目是否是超級簡單啊?github

首先,咱們經過命令 $ docker search mongo 來看一下有哪些 Image 能夠用:mongodb

這裏咱們看到,第一條數據顯示的是官方認證的,可是注意: docker image 在使用的時候,是有一個 tag 值的,若是不填寫,默認使用 latest,因此,若是想要尋找特定的版本,推薦去:docker

https://hub.docker.com/shell

直接搜索mongo,而後點擊第一條進去看:數據庫

那麼咱們這裏就選擇 3.6 版本的 MongoDB 吧。經過命令 $ docker pull mongo:3.6 來把 Image 拉下來:bash

接着,咱們運行這個 Image : app

$ docker run -p 27017:27017 -v $PWD/db:/data/db -d mongo:3.6複製代碼

這裏得簡單說一下這個命令:curl

  • `-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 系列的代碼,你們能夠學習一下。

相關文章
相關標籤/搜索