Docker的基本使用(部署python項目)

今天開始利用docker來部署項目,固然,首先,須要安裝好Docker,這個在個人上篇寫了。css

1、準備項目

我寫的是一個爬取某ppt網站的代碼,就一個ppt1.py是爬蟲,而後,ppts是存放下載的ppt的html

 

2、準備requirement.txt文件

這個是須要哪些python庫支持,寫好python

 

 

3、準備Dockerfile文件

須要一個名爲Dockerfile的文件,沒有後綴,這個建立docker鏡像的配置文件linux

FROM python:3.6
ENV PATH /usr/local/bin:$PATH
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD python ppt1.py
View Code

 

FROM:須要什麼環境nginx

ENV:修改path,即增長/usr/local/bin這個環境變量docker

ADD:將本地代碼放到虛擬容器中,它有兩個參數,第一個是 . ,表明本地當前路徑;第二個參數是/code,表明虛擬容器中的路徑,即將本地項目的全部內容放到虛擬容器的/code目錄下,以便在虛擬容器中運行代碼windows

WORKDIR:指定工做目錄,也就是剛纔的/code,在虛擬容器中的目錄bash

RUN:執行某些環境準備工做,docker容器中只有python3環境,還須要python的庫,這裏安裝那些庫服務器

CMD:運行項目的命令行命令app

詳細瞭解能夠去查看官方文檔

 

4、開始建立鏡像

 docker build -t pptdemo:latest .

這樣應該就沒錯了,最後報了個警告,有時間去了解了解...

$ docker build -t pptdemo:latest .
Sending build context to Docker daemon  23.55kB
Step 1/6 : FROM python:3.6
 ---> 55fb8aca33df
Step 2/6 : ENV PATH /usr/local/bin:$PATH
 ---> Using cache
 ---> 97e82715b8ee
Step 3/6 : ADD . /code
 ---> 9d2d253015ee
Step 4/6 : WORKDIR /code
Removing intermediate container 25ccdad420a0
 ---> ec462b723417
Step 5/6 : RUN pip install -r requirements.txt
 ---> Running in 83e607d0bc06
Collecting requests (from -r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/7d/e3/20f3d364d6c8e5d2353c72a67778eb189176f08e873c9900e10c0287b84b/requests-2.21.0-py2.py3-none-any.whl (57kB)
Collecting pyquery (from -r requirements.txt (line 2))
  Downloading https://files.pythonhosted.org/packages/09/c7/ce8c9c37ab8ff8337faad3335c088d60bed4a35a4bed33a64f0e64fbcf29/pyquery-1.4.0-py2.py3-none-any.whl
Collecting idna<2.9,>=2.5 (from requests->-r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/14/2c/cd551d81dbe15200be1cf41cd03869a46fe7226e7450af7a6545bfc474c9/idna-2.8-py2.py3-none-any.whl (58kB)
Collecting chardet<3.1.0,>=3.0.2 (from requests->-r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl (133kB)
Collecting certifi>=2017.4.17 (from requests->-r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/9f/e0/accfc1b56b57e9750eba272e24c4dddeac86852c2bebd1236674d7887e8a/certifi-2018.11.29-py2.py3-none-any.whl (154kB)
Collecting urllib3<1.25,>=1.21.1 (from requests->-r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/62/00/ee1d7de624db8ba7090d1226aebefab96a2c71cd5cfa7629d6ad3f61b79e/urllib3-1.24.1-py2.py3-none-any.whl (118kB)
Collecting lxml>=2.1 (from pyquery->-r requirements.txt (line 2))
  Downloading https://files.pythonhosted.org/packages/5d/d4/e81be10be160a6323cf5f29f1eabc9693080cb16780a2e19c96091ee37ee/lxml-4.3.0-cp36-cp36m-manylinux1_x86_64.whl (5.7MB)
Collecting cssselect>0.7.9 (from pyquery->-r requirements.txt (line 2))
  Downloading https://files.pythonhosted.org/packages/7b/44/25b7283e50585f0b4156960691d951b05d061abf4a714078393e51929b30/cssselect-1.0.3-py2.py3-none-any.whl
Installing collected packages: idna, chardet, certifi, urllib3, requests, lxml, cssselect, pyquery
Successfully installed certifi-2018.11.29 chardet-3.0.4 cssselect-1.0.3 idna-2.8 lxml-4.3.0 pyquery-1.4.0 requests-2.21.0 urllib3-1.24.1
Removing intermediate container 83e607d0bc06
 ---> 22244632da67
Step 6/6 : CMD python ppt1.py
 ---> Running in c5ff77a9f680
Removing intermediate container c5ff77a9f680
 ---> 07cfec786f1a
Successfully built 07cfec786f1a
Successfully tagged pptdemo:latest
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.
View Code

 

繼續輸入代碼查看是否建立成功

 我擦,怎麼有這麼多,由於我前面其實出bug了,改了好久,哈哈這麼多鏡像我去,忽略<none>的。

 

5、運行

docker run pptdemo

我成功了!

 

順便一提,若是咱們須要暴露接口,好比搭了一個網站,須要暴露端口,由於暴露的是容器的端口,須要訪問宿主機能訪問到,因此須要作端口映射

能夠參考:http://www.javashuo.com/article/p-hsbdidly-bu.html

docker run -d -p 8080:80 nginx

好比這樣,就將宿主機的8080端口映射到容器的80端口,訪問localhost:8080就能夠了

注意,windows下不一樣,由於docker須要Linux環境,其實在windows上開了一個虛擬機

docker-machine ip default

能夠顯示出ip爲多少,這樣,須要利用這個ip才能訪問容器,通常是,192.168.99.100,那麼192.168.99.100:8080便可訪問到接口,否則就是你配錯了

進入docker容器:

docker exec -i -t  pptdemo /bin/bash

查看docker容器運行日誌:

docker logs pptdemo

 

 

6、關於部署

1.push到dockerhub,而後在裝好docker的服務器上pull下來鏡像,run便可(統一託管,缺點是慢,和不太穩定)

2.複製源代碼到服務器,在裝好docker的服務器上從新執行 build,run(上傳體積小,缺點是build費時間)

3.將image導出,複製到裝好docker的服務器,載入image,run便可(方便多機器部署,上傳體積大)

3種方法各有優劣,看狀況選擇。

 

1.push到dockerhub 

優勢在於,推送到dockerhub,只要有網便可方便推拉,缺點是,推送特別慢,並且要反覆推,我正在查有沒方法換源之類。。。

1.在dockerhub註冊賬號

2.新建一個庫,個人叫:pptdemo

3.命令行登陸

docker login -u happycodes

4.tag打標籤

docker tag pptdemo:latest happycodes/pptdemo:latest

5.push

docker push happycodes/pptdemo

 

二、複製源碼到服務器

這個比較簡單,就相似於再構建一遍,缺點是又要下依賴,又要從新構建,比較慢

 

三、導出image,拷貝image,載入image

比較合適的方法,構建一遍,複製多遍,便可

#將鏡像存儲
docker save nginx:latest > ./nginx.tar
docker save xxxxx(image id) > ./nginx.tar

#導入鏡像文件
docker load --input ./nginx.tar

#經過符號的方式來導入
docker load < ./nginx.tar

 

 

7、可選、刪除多餘的容器和鏡像

容器不停,不能刪對應的image

關於容器:

$ docker ps // 查看全部正在運行容器
$ docker stop containerId // containerId 是容器的ID

$ docker ps -a // 查看全部容器
$ docker ps -a -q // 查看全部容器ID

$ docker stop $(docker ps -a -q) //  stop中止全部容器
$ docker  rm $(docker ps -a -q) //   remove刪除全部容器

 

關於images

docker images  // 查看當前有些什麼images
docker rmi <image id>  // 刪除指定id的image
docker rmi $(docker images -q)  // 要刪除所有image的話
View Code

 

 

8、使用docker-compose部署

簡單說說docker-compose,他是python寫的,爲了解決docker部署的繁雜配置和多容器部署的配置問題,例如須要作容器端口和宿主機端口映射,配置容器ip等。

pip install docker-compose 便可

使用很簡單,編寫 docker-compose.yml 文件便可,例如個人代理池,須要配置映射端口

官方文檔

相關文章
相關標籤/搜索