使用 docker 統(tǒng)一開發(fā)、測試、發(fā)布環(huán)境。* 示例項(xiàng)目地址。
docker 的在線和離線安裝
-
在線安裝
-
離線安裝
官網(wǎng)下載對(duì)應(yīng)平臺(tái)的安裝包。
-
核心概念
- 鏡像,類似于虛擬機(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集中存放鏡像文件的地方。
-
基本使用(對(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
- 鏡像拉取:
-
數(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- 容器中的 /test_py 目錄會(huì)被持久化在 /var/lib/docker/volumes/VolumesName (可以使用docker volume inspect 命令查看)中。
- 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ù)卷命令
-
網(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)境。
-
使用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í)行
-
初始項(xiàng)目目錄結(jié)構(gòu)
屏幕快照 2017-09-07 下午5.45.52.png docker-compose up scrapyd啟動(dòng)容器。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)目根目錄一致的。scrapy startproject myproject創(chuàng)建爬蟲項(xiàng)目,此命令是在容器中執(zhí)行的,注意觀察命令行提示符。scrapy genspider gjfgw http://www.ndrc.gov.cn創(chuàng)建爬蟲接下來就是快樂的寫爬蟲了scrapy。
-

