上一篇文章『十分鐘入門Docker,帶你成爲Docker王者之篇三』給你們講了一下 如何將本地代碼搞到DockerHub上作成Image,分享給比人,那麼今天咱們就來講一下,編寫docker-compose,一次性同時啓動多個Docker Image。超乾貨的哦~python
咱們根據前三篇文章講的,咱們先來在本地機器練一下手: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
運行結果以下:
看到已經啓動成功了,而且 $ docker ps
裏面看到已經有一個容器在運行。咱們經過MongoDB可視化軟件 robomogo
來鏈接一下本地的數據庫:
能夠看到,這個確實就是剛纔咱們經過 Docker 啓動的數據庫。
固然,複雜的配置,Docker 也是支持的,咱們這裏是指最簡單的跑起來一個 MongoDB 數據庫。若是更加詳細的,複雜的配置,那就須要經過 Dockerfile 來啓動數據庫了,具體 Dockerfile 的寫法,能夠參考上一篇文章,或者
是否是感受很神奇??你並無經過上網搜索複雜的數據庫安裝過程,也沒必要擔憂刪除數據庫會刪不乾淨(直接中止運行容器就好了),就這麼簡簡單單的經過Docker完成了數據庫的安裝.
既然咱們有了本地的 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 很牛逼。
結論固然是:能夠啊~ 那麼,
Compose
是 Docker
容器進行編排的工具,定義和運行多容器的應用,能夠一條命令啓動多個容器,使用 Docker Compose
再也不須要使用shell腳原本啓動容器。docker-compose
默認的模板文件是 docker-compose.yml
。通常經過docker-compose up
命令來啓動
*若是你安裝的是 Docker Toolbox
,那麼 docker compose
就已經自帶了。通常是 Mac 和 Windows。
能夠經過命令$ docker-compose --version
來檢查 docker-compose 的信息:
若是沒有安裝,能夠經過如下途徑安裝。
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
來檢測版本信息了。
直接簡單粗暴:
$ pip install docker-compose複製代碼
安裝便可。安裝完成,所有均可以經過命令 $ docker-compose --version
來查看是否安裝成功。
$ docker-compose --versiondocker-compose version 1.23.2, build 1110ad01複製代碼
既然 Docker-compose 已經安裝好了,那麼咱們如今想要實現的就是:
針對上面的想法,咱們上一篇文章建立的 swyftg/3dmspider:lastest
得改動一些,建立一個 swyftg/3dmspider:2.0.0
的 Image。
這裏 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 上,可是要注意,這裏咱們的代碼你能夠單獨拉一個分支出來,像我同樣,建立了一個 dev2
的分支;也能夠給你的代碼打 Tags
。
*由於 DockerHub 裏面建立 Image 不一樣版本是有兩種途徑,一種是經過分支(branch),另外一種就是經過標籤(Tag)。
這裏你能夠選擇一種本身使用。我這裏就是簡單的使用了分支(branch)的形式。
至於如何建立分支,上傳代碼,這裏就不說了。屬於 Git 的常規操做,若有不懂的同窗,參考:
https://git-scm.com/book/zh/v1/Git-分支-分支的新建與合併複製代碼
打開 https://cloud.docker.com/repository/list
頁面,去 DockerHub 裏面建立你的 Image 2.0,也就是要把剛剛提交到 GitHub 的代碼來關聯到這裏。
咱們點進去,進入到咱們的工程目錄裏面,而後選擇 Builds
標籤:
點擊 Configure Automate Builds
按鈕。
這裏步驟就是:
BUILD RULES
就是用來建立 Docker Tag的;點擊了以後,頁面就會跳到以前的 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 下載到本地嘍~
OK,咱們如今全部準備工做基本都完成了,想要完成文章當初指定的目標:
既然數據庫咱們是經過 Docker Image 啓動的,咱們能不能把爬蟲那部分也弄成經過 Docker 啓動啊?
下一步就是編寫咱們的 docker-compose.yml
文件了。
咱們先明確幾點:
找一個空地(文件夾),建立一個文件,叫 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複製代碼
Docker 都講到這個地步了,真的就是隨心所欲了啊。後面的內容會給你們說 Docker 更高級的用法。
這麼好評的乾貨文章,你們幫忙點個右下角的好看唄,你這麼帥,不點好看怎麼過去啊。
喜歡的能夠關注公號『皮爺擼碼』,回覆『代碼』,其中DC001就是 Docker 系列的代碼,你們能夠學習一下。