上一篇文章『十分鐘入門Docker,帶你成爲Docker王者之篇二』給你們講了一下 Docker 中管理容器和鏡像的經常使用命令,那麼今天咱們就來講一下,如何讓你寫的本地代碼成爲Image,編寫DockerFile,而且分享給別人使用。超乾貨的哦~python
這篇文章的目錄:git
這裏呢,咱們就來很簡單很簡單的擼一個 Scrapy 爬蟲代碼,其實任何代碼均可以, Hello World 也是能夠的,只不過那樣太簡單了,因此咱們這邊稍微弄一個不簡單的。爬取 https://www.3dmgame.com/
的新聞條目信息。github
這裏關於Scrapy的爬蟲怎麼寫,我這裏就不作太多詳細介紹了。docker
有一點,我這裏必須先提早說一下:路徑的問題! 數據庫
有一點,我這裏必須先提早說一下:路徑的問題! bash
有一點,我這裏必須先提早說一下:路徑的問題! 服務器
爲何要說路徑的問題,是由於Scrapy運行爬蟲的時候,爬蟲的路徑和Scarpy命令是相關聯在一塊兒的。若是你的路徑不對,就會出現如下報錯:網絡
# 錯誤一Scrapy 1.x.x - no activie projectUnknow command: Crawl複製代碼
或者是:app
# 錯誤二No module named xxxx複製代碼
這兩種。咱們分別來講明都發生了什麼。dom
錯誤一的主要問題就是,你在移動你爬蟲源代碼的時候,你的爬蟲引用出現了錯誤。這個錯誤是因爲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。
參考地址: https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
若是要編寫Dockerfile,首先第一步就是建立一個文件,叫Dockerfile
,注意:沒有任何文件後綴。Dockerfile
的位置,就在那個路徑圖裏面標出來了:
接下來,咱們來簡單分析一下咱們的 Dockerfile
裏面應該操做些什麼:
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
版原本編譯。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
這裏來找。
這個時候,咱們既然已經編寫了 Dockerfile
,那麼咱們就趕忙來 $ docker build
一下吧。
首先,進入到你的項目目錄裏面,而後,經過命令:
$ docker build -t mybuild .複製代碼
來編譯咱們的Image。這裏我來簡單說一下這個命令是怎麼個回事兒:
-t mybuild
這倆是一塊兒的, -t
後面跟着的是你 Image 的名字。.
這個則是表明編譯工做在當前目錄裏尋找 Dockerfile
來進行編譯。固然,你也能夠指定路徑。我這麼弄徹底是爲了簡單。若是,你的編譯出錯了,像我這樣:
梳理一下你的網絡,而後重啓一下 Docker 服務就行了。重啓完,咱們接着編譯:
你們看,這裏就成功建立了咱們的 Image,名字就叫 mybuild
,和 -t
後面的值是同樣的。那麼咱們經過命令來看一下:
$ docker run mybuild複製代碼
結果以下:
OK,能夠看到 3dm 的新聞信息已經打印出來了,很完美。接下來咱們須要把這個 Image 放到 DockerHub 上讓你們使用了。
想要把你的代碼放到 Dockerhub 上,那麼第一步就須要把你的代碼得放到 GitHub 上。
https://github.com/
至於這裏怎麼把你的代碼放到 GitHub 上,皮爺這裏就很少說了,由於這個很簡單並且很基礎,不會的同窗能夠百度查一下,皮爺這裏就直接給你們看現成的吧,這一篇文章的代碼皮爺放到了dev分支下面,記住,分支名稱
很關鍵:
既然放好代碼了,咱們接下來就就要去 DockerHub 申請帳號了。
https://hub.docker.com/signup
成功註冊以後,咱們登陸。登陸 完成以後,咱們點擊最上面導航欄裏面的 Repositorys
,而後點擊 Create Repository
:
咱們就來到了建立界面:
這裏有幾點要簡單說明一下:
咱們點擊 GitHub 來看一下:
這裏有幾點注意的地方:
SwyftG/DockerLearn
;Dev
分支!最後,咱們點擊 Create&Build
按鈕,就建立成功了。
若是想看 Build 信息,就在 Build 裏面看。若是你的代碼作了修改,而後也在 GitHub 上更新了代碼,你想從新 Build 一下你的 Docker Image,那麼你在 Build 裏面也能夠設置選項,來從新 Build 你的 Image。
既然咱們已經把代碼放到了 DockerHub 上,咱們就來看看咱們的 Image 是否可以找獲得吧:
很完美,能夠找到~~~
此時,你的代碼已經編譯成功, 而且放到了 Docker Hub 上,那麼咱們就來讓其餘小夥伴玩耍吧。
$ docker run seyftg/3dmspider# 或者把 Image 下載下來$ docker pull swyftg/3dmspider複製代碼
無論怎樣,咱們均可以看到,$ docker images
裏面有了咱們的 swyftg/3dmspider
Image。
無論你是在本地運行,仍是在小夥伴的電腦上運行,仍是在你的雲服務器上運行,如今這個樣子的運行方式,是否是超級輕鬆方便?就如同咱們開局所說的,Docker 的 Image 就是一個模具,你拿着這個模具能夠在任何機器上面運行。酷炫不酷炫?方便不方便?哈哈哈哈
好了,咱們今天咱們主要說了如何讓本地代碼製做成 Docker Image,而後如何放到 DockerHub 上,再分享給別人的過程。
那麼皮爺有個疑問,就是:若是我想啓動一個 Scrapy 的 Spider Image,而後又想啓動一個 MongoDB 數據庫的Image,我要怎麼作呢??
這麼好評的乾貨文章,你們幫忙點個右下角的好看唄,你這麼帥,不點好看怎麼過去啊。
喜歡的能夠關注公號『皮爺擼碼』,回覆『代碼』,其中DC001就是 Docker 系列的代碼,你們能夠學習一下。你這麼帥氣,還不關注一下啊???