這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
本文的原文串連是: http://blog.csdn.net/freewebsys/article/details/53509676
未經博主允許不得轉載。
博主地址是:http://blog.csdn.net/freewebsys
1,開始學習構建docker鏡像
http://study.163.com/course/courseMain.htm?courseId=1273002
課程講的是使用centos構建。自己也一直使用centos,但是有個問題。
就是centos鏡像比較大,安裝的東西比較多。真正的linux其實用不了那麼多,尤其是在使用docker的時候,打包的次數越多,鏡像檔案堆積的越多呢。
所以選擇使用 alpine(阿爾卑斯,和那個糖名字一樣)。官方網站:
https://alpinelinux.org/
有ios的版本,大約81mb,但是在docker上面使用的版本是更精簡的才 4mb。但是這個是沒有bash的,需要安裝一個bash。
安裝了之後才 5mb。剩下的就是安裝各種軟體了。基礎的版本就是這樣小,而對於centos來說,一個鏡像就要600多mb。更別說裝東西之後了。
2,構建一個alpine 鏡像
目標,做2個鏡像,一個資料庫的,一個python的。
然後串連起來。能儲存,能查詢,就可以了。
充分利用docker的優勢,首先要構建一個基礎的python環境。
然後再在這個環境的基礎上開發程式。
否則的話每次從0構建太慢了。主要是因為網路慢。
mkdir alpine-python
vi alpine-python/Dockerfile
FROM docker.io/alpine:latestMAINTAINER demo <juest a demo>ENV TZ "Asia/Shanghai"RUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/main" > /etc/apk/repositoriesRUN apk add --update \ bash \ python \ python-dev \ py-pip \ mysql-dev \ build-base \ && pip install Flask \ && pip install MySQL-python \ && rm -rf /var/cache/apk/*
特別要注意下:
RUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/main" > /etc/apk/repositories
其中 bash 是方便進入鏡像裡面查看的。
這個是設定一個國內清華大學的網站。
因為直接拉官網的太慢了。有的時候就卡死了。
當然也可以直接建立一個內網的私服。那樣就更快了。
參考這個哥們的可以做個私服:
https://my.oschina.net/funwun/blog/710877
然後打包一個基礎的python 包:
docker build -t demo/alpine-python:1.0 .
如果沒有報錯就可以了。python環境依賴的東西比較多呢。
而且python在安裝的時候還需要gcc的編譯工具。
使用 docker images 查看編譯後的鏡像:
發現也已經 幾百兆了。似乎明白了為啥要開發一個golang了。
golang的檔案也就 幾兆吧。對於鏡像來說真的是太好了。
使用docker images 查看鏡像:
# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE<none> <none> ca29d11bdfb9 13 minutes ago 458.6 MBdocker.io/alpine latest baa5d63471ea 7 weeks ago 4.799 MB#如果發現沒有tag,直接是tag命令命名一個。使用image id。#docker tag ca29d11bdfb9 demo/alpine-python:1.0#再查看:# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEdemo/alpine-python 1.0 ca29d11bdfb9 14 minutes ago 458.6 MBdocker.io/alpine latest baa5d63471ea 7 weeks ago 4.799 MB#這下就有了。
3,構建http項目
再利用alpine-python鏡像做一個http服務
vi main.py
from flask import Flaskapp = Flask(__name__)@app.route("/")def hello(): return "Hello World!"if __name__ == "__main__": app.run(host='0.0.0.0', port=5000)
編寫Dockerfile
FROM demo/alpine-python:1.0MAINTAINER demo <juest a demo>WORKDIR /dataONBUILD COPY main.py /dataEXPOSE 5000CMD ["/env/bin/python", "/data/main.py"]
編譯:
docker build -t demo/py-http:1.0 .#查看鏡像:# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEdemo/py-http 1.0 41a2e1d1fd4d 18 seconds ago 458.6 MBdemo/alpine-python 1.0 ca29d11bdfb9 22 minutes ago 458.6 MBdocker.io/alpine latest baa5d63471ea 7 weeks ago 4.799 MB
4,運行http
docker run -d -p 5000:5000 --name py-http demo/py-http:1.0
直接運行就可以了。但是有個問題,訪問連接埠沒結果。
# curl localhost:5000curl: (56) Recv failure: Connection reset by peer
報錯是這樣的:
https://github.com/docker/docker/issues/2174
但是還沒有找到解決辦法。
已經解決,是python程式需要主動綁定。
app.run(host='0.0.0.0', port=5000)
這樣寫就可以了。
4,總結
本文的原文串連是: http://blog.csdn.net/freewebsys/article/details/53509676
未經博主允許不得轉載。
博主地址是:http://blog.csdn.net/freewebsys
總的來說docker還是非常的好用的,但是遇到一個問題。
使用python 和php的項目都需要安裝非常大的包。
造成了本來就很小的鏡像,alpine 5mb的變成了幾百mb。
大概明白了golang為適合雲端服務了。因為golang,最後編譯的檔案才幾mb。
再配合上alpine就太完美了。兩個加起來 幾十mb搞定。
每次升級備份都非常的方便。而java加上jdk,在加上jar包依賴。
就變得臃腫起來了。繼續研究。