Docker從2013年發佈至今,一直是廣受矚目,因此咱們或多或少也應該瞭解一些Docker的技術原理,而學習一項技術有了興趣才能更好的讓你持續學習下去。若是讓你體會到Docker的神奇之處那麼興趣或許會大一點,接下來咱們就先從自定義一個本身的Docker容器鏡像來開啓學習Docker的第一步。html
在開始咱們的實踐以前,咱們固然得在機器上安裝Docker,請參考官方文檔python
安裝完Docker之後咱們就須要編寫咱們要部署的項目代碼了,咱們簡單的部署一個用Python編寫的Web應用,若是是以前部署到虛擬機中的話咱們得在虛擬機中安裝各類環境才能將此項目部署成功。而如今在Docker中咱們只須要一個文件就能將環境所有打包成一個鏡像而且運行。docker
from flask import Flask import socket import os app = Flask(__name__) @app.route('/') def hello(): html = "<h3>Hello {name}!</h3>" \ "<b>Hostname:</b> {hostname}<br/>" return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname()) if __name__ == "__main__": app.run(host='0.0.0.0', port=80)
這個程序咱們在本機啓動的話在瀏覽器中輸入 http://0.0.0.0:80/
便可訪問到後臺打印的信息。接下來咱們就將其製做成鏡像。flask
製做鏡像的關鍵一步就是製做Dockerfile文件,在Dockerfile中經過Docker提供的一些命令編寫一套執行流程來製做鏡像。windows
# 使用官方提供的 Python 做爲咱們鏡像的基礎環境 FROM python:2.7-slim # 將工做目錄切換爲 /Users/hupengfei/Downloads/docker/test WORKDIR /Users/hupengfei/Downloads/docker/test # 將當前目錄下的全部內容複製到 /Users/hupengfei/Downloads/docker/test 下 ADD . /Users/hupengfei/Downloads/docker/test # 使用 pip 命令安裝這個應用所須要的依賴 RUN pip install --trusted-host pypi.python.org -r requirements.txt # 容許外界訪問容器的 80 端口 EXPOSE 80 # 設置環境變量 ENV NAME World # 設置容器進程爲:python app.py,即:這個 Python 應用的啓動命令 CMD ["python", "app.py"]
下面介紹一些上面Dockerfile中用到的命令做用瀏覽器
此時咱們看到咱們的目錄中存放的文件爲app
hupengfei@localhost ~/Downloads/docker ls Dockerfile app.py requirements.txt test
此時在存放Dockerfile目錄下執行一下命令curl
docker build -t helloworld .
其中-t是爲此鏡像起一個名字,其中此命令會自動的加載本路徑下的Dockerfile文件中內容,按順序執行命令來建立鏡像。此時能夠經過如下命令查看已經建立的鏡像socket
hupengfei@localhost ~/Downloads/docker docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE helloworld latest c91cf8925eba 34 seconds ago 130MB
接下來經過dokcer run
命令進行啓動鏡像tcp
hupengfei@localhost ~/Downloads/docker docker run -p 4000:80 helloworld * Serving Flask app "app" (lazy loading) * Environment: production WARNING: Do not use the development server in a production environment. Use a production WSGI server instead. * Debug mode: off * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
其中4000:80
意思是將宿主機的4000端口映射到鏡像中的80端口上,此時咱們用docker ps
就能夠看到啓動的docker鏡像了
hupengfei@localhost ~ docker ps CONTAINER ID IMAGE COMMAND CREATED 1f1e5affd99e helloworld "python app.py" 23 seconds ago
此時訪問頁面也可以訪問到
hupengfei@localhost ~ curl http://localhost:4000 <h3>Hello World!</h3><b>Hostname:</b> 1f1e5affd99e<br/>%
若是咱們不指定綁定4000端口的話,那麼就會在宿主機上隨機分配一個端口與鏡像進行鏈接
hupengfei@localhost ~/Downloads/docker docker run -p :80 helloworld * Serving Flask app "app" (lazy loading) * Environment: production WARNING: Do not use the development server in a production environment. Use a production WSGI server instead. * Debug mode: off * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
此時咱們經過docker port id號
可以查詢到宿主機與鏡像對應鏈接的端口號
hupengfei@localhost ~ docker port 1a93958d31b1 80/tcp -> 0.0.0.0:32769
在Docker Hub上註冊帳號
登陸進去後在主頁點擊Create a Repository
填寫信息
在本機登陸本身的Docker Hub 帳號,命令是docker login
用docker tag
命令爲本身的鏡像取一個完整的名字包括版本號,v1爲版本號
docker tag helloworld 剛纔建立的帳戶名字/helloworld:v1
將剛纔所自定義的鏡像上傳上去,命令是docker push buxuewushu/helloworld:v1
,其中buxuewushu
是換成本身的帳號,後面是剛纔打的標籤名
此時你就能夠在Docker Hub中看到本身上傳的鏡像了
本文的例子參考自極客時間中張磊寫的深刻剖析Kubernetes,有興趣的能夠查看