python 爬蟲在 docker 中的應(yīng)用實(shí)戰(zhàn)


使用 docker 統(tǒng)一開發(fā)、測試、發(fā)布環(huán)境。* 示例項(xiàng)目地址。

docker 的在線和離線安裝

  1. 在線安裝

  2. 離線安裝

    官網(wǎng)下載對(duì)應(yīng)平臺(tái)的安裝包。

  3. 核心概念

    • 鏡像,類似于虛擬機(jī)/操作系統(tǒng)鏡像,可以理解為面向Docker引擎的只讀模版。是創(chuàng)建docker容器的基礎(chǔ),可以看作面向?qū)ο笾械念悺?/li>
    • 容器,通過鏡像創(chuàng)建的一個(gè)實(shí)例,類似于一個(gè)輕量級(jí)的沙箱,或者說是一個(gè)已經(jīng)啟動(dòng)的操作系統(tǒng)。Docker使用容器來運(yùn)行和隔離應(yīng)用。可以看作面向?qū)ο笾械膶?duì)象。
    • 倉庫,可以看作代碼庫(如果是java,可以看作是maven或者gradle的倉庫)。是Docker集中存放鏡像文件的地方。
  4. 基本使用(對(duì)比git),mac和windows都有相應(yīng)的圖形界面。

    • 鏡像拉取: docker pull imagename:tag
    • 從鏡像運(yùn)行容器(鏡像不存在時(shí)會(huì)自動(dòng)pull,任務(wù)結(jié)束后容器就會(huì)自動(dòng)停止): docker run --rm -v /var/code:/root/code -p 8080:80 --name=example imagename:tag
    • --rm-d 不能同時(shí)使用
    • 交互式運(yùn)行容器中的指定程序(容器要處于運(yùn)行狀態(tài)): docker exec -it example bash
    • 啟動(dòng)和停止容器: docker start/stop example
    • 從容器中復(fù)制文件或目錄: docker copy
  5. 數(shù)據(jù)卷(Data Volumes)管理

    數(shù)據(jù)卷的使用,類似Linux下對(duì)目錄或文件進(jìn)行mount操作。

    • 創(chuàng)建默認(rèn)數(shù)據(jù)卷

      # 只能是rw模式,會(huì)分配一個(gè)默認(rèn)的VolumesName(hash值),容器被刪除時(shí)會(huì)自動(dòng)刪除數(shù)據(jù)卷
      docker run -v /test_py --name=test_python --rm -it python:2.7.12 bash
      
      1. 容器中的 /test_py 目錄會(huì)被持久化在 /var/lib/docker/volumes/VolumesName (可以使用docker volume inspect 命令查看)中。
      2. Mac下無法直接查看 /var/lib/docker 到,需要在這個(gè)模式下 screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty 查看,具體可以查看這里。
    • 給數(shù)據(jù)卷掛載宿主主機(jī)的目錄或文件

      # 容器被刪除時(shí)不會(huì)刪除數(shù)據(jù)卷
      docker run -v ~/project/pythonProject/test_py:/code:rw --name=test_python --rm -it python:2.7.12 bash
      docker run -v ~/project/pythonProject/test_py/helloworld.py:/code/helloworld.py:ro --name=test_python --rm -it python:2.7.12 bash
      
  • 命名數(shù)據(jù)卷的使用,使用這個(gè)數(shù)據(jù)卷的容器被刪除時(shí)不會(huì)刪除數(shù)據(jù)卷

    數(shù)據(jù)卷命令
  1. 網(wǎng)絡(luò)管理

    默認(rèn)情況下,在容器外部是無法通過網(wǎng)絡(luò)來訪問容器內(nèi)的網(wǎng)絡(luò)應(yīng)用和服務(wù)的。通過 -p 參數(shù)來指定端口映射。

    docker run -p ip:hostport:containerport imagename
    

    實(shí)例

    # ip一般省略為127.0.0.1, 訪問宿主主機(jī)的8080端口相當(dāng)于訪問容器的80端口
    docker run -p 8080:80 imagename
    

實(shí)戰(zhàn)--搭建基于docker的scrapy開發(fā)和發(fā)布環(huán)境。

  • 示例項(xiàng)目地址

  • 使用Dockerfile構(gòu)建一個(gè)python scrapy爬蟲的鏡像,可以直接通過docker build -t scrapyd-dev:1.0.0 .命令構(gòu)建鏡像,最終會(huì)使用docker-compose來實(shí)現(xiàn)。

    # Dockerfile
    # Author: weineel
    FROM python:2.7.13
    
    MAINTAINER weineel LiJF_wn@163.com
    
    WORKDIR /var/code
    
    # COPY/ADD(可以是一個(gè)壓縮包,會(huì)自動(dòng)解壓)
    COPY ./etc/pip.conf /root/.pip/pip.conf
    COPY ./etc/scrapyd.conf /etc/scrapyd/scrapyd.conf
    
    RUN pip install --no-cache-dir scrapy scrapyd
    
    # 定義編譯指令
    # 在編譯時(shí)通過 docker build --build-arg _TZ=Asia/Shanghai,_TC=weiguo -t test_python:1.0.0 . 方式指定,
    # 可以用在run等指令中,做分支判斷
    ARG _TZ=Asia/Shanghai
    ARG _TC
    # 在啟動(dòng)容器是 -e 指定環(huán)境變量,會(huì)覆蓋編譯時(shí)賦的值。
    ENV TZ $_TZ
    ENV TC $_TC
    
    VOLUME /var/code
    
    EXPOSE 6800
    
    # ENTRYPOINT ["/bin/bash"]
    # ENTRYPOINT 和 CMD的區(qū)別
    # 相當(dāng)于開機(jī)啟動(dòng)項(xiàng),container在啟動(dòng)時(shí)執(zhí)行
    CMD ["scrapyd", "--pidfile="]
    
    
  • 使用docker-compose管理docker

    # docker-compose.yml
    version: '3.1'
    
    services:
    
      scrapyd:
        build:
          context: ./scrapyd
          dockerfile: ${ScrapydDockerfileName}
        ports:
          - "6800:6800"
        volumes:
          - ./scrapyd_data:/var/lib/scrapyd
          - ../:/var/code
        # depends_on:
        #   - splash
        # links:
        #   - splash
        restart: always
    
      splash:
        image: scrapinghub/splash
        ports:
          - "8050:8050"
            
    
  • 構(gòu)建步驟, 以下命令在項(xiàng)目根目錄中的docker目錄下執(zhí)行

    1. 初始項(xiàng)目目錄結(jié)構(gòu)

      屏幕快照 2017-09-07 下午5.45.52.png
    2. docker-compose up scrapyd 啟動(dòng)容器。

    3. docker-compose exec scrapyd bash 進(jìn)入容器(相當(dāng)于遠(yuǎn)程登錄的服務(wù)器),容器中安裝了scrapy包,可以執(zhí)行scrapy的命令行工具等,因?yàn)榘秧?xiàng)目根目錄掛在到了容器的/var/code 所以在容器中的/var/code目錄下的內(nèi)容和項(xiàng)目根目錄一致的。

    4. scrapy startproject myproject 創(chuàng)建爬蟲項(xiàng)目,此命令是在容器中執(zhí)行的,注意觀察命令行提示符。

    5. scrapy genspider gjfgw http://www.ndrc.gov.cn 創(chuàng)建爬蟲

    6. 接下來就是快樂的寫爬蟲了scrapy。

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容