自定義Docker容器映象並將其上傳到DockerHub中

image
自定義Docker容器映象並將其上傳到DockerHub中
Docker從2013年釋出至今,一直是廣受矚目,所以我們或多或少也應該瞭解一些Docker的技術原理,而學習一項技術有了興趣才能更好的讓你持續學習下去。如果讓你體會到Docker的神奇之處那麼興趣或許會大一點,接下來我們就先從自定義一個自己的Docker容器映象來開啟學習Docker的第一步。
自定義Docker容器映象
在開始我們的實踐之前,我們當然得在機器上安裝Docker,請參考官方文件
安裝完Docker以後我們就需要編寫我們要部署的專案程式碼了,我們簡單的部署一個用Python編寫的Web應用,如果是之前部署到虛擬機器中的話我們得在虛擬機器中安裝各種環境才能將此專案部署成功。而現在在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/
即可訪問到後臺列印的資訊。接下來我們就將其製作成映象。
製作映象的關鍵一步就是製作Dockerfile檔案,在Dockerfile中通過Docker提供的一些命令編寫一套執行流程來製作映象。
# 使用官方提供的 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中用到的命令作用
- FROM:用於指定其後構建新映象所使用的基礎映象。FROM 指令必是 Dockerfile 檔案中的首條命令,啟動構建流程後,Docker 將會基於該映象構建新映象,FROM 後的命令也會基於這個基礎映象。
- WORKDIR:用於在容器內設定一個工作目錄。
- ADD:更高階的複製命令,將原路徑檔案賦值到目標路徑中
- RUN:在容器中執行Shell命令,requirements.txt中放著所要下載依賴的名字Flask
- EXPOSE:為構建的映象設定監聽埠,使容器在執行時監聽。
- ENV:設定環境變數而已,無論是後面的其它指令,如 RUN,還是執行時的應用,都可以直接使用這裡定義的環境變數。
- CMD:用於指定在容器啟動時所要執行的命令。
此時我們看到我們的目錄中存放的檔案為
hupengfei@localhost ~/Downloads/docker ls Dockerfileapp.pyrequirements.txt test
此時在存放Dockerfile目錄下執行一下命令
docker build -t helloworld .
其中-t是為此映象起一個名字,其中此命令會自動的載入本路徑下的Dockerfile檔案中內容,按順序執行命令來建立映象。此時可以通過以下命令檢視已經建立的映象
hupengfei@localhost ~/Downloads/docker docker image ls REPOSITORYTAGIMAGE IDCREATEDSIZE helloworldlatestc91cf8925eba34 seconds ago130MB
接下來通過 dokcer run
命令進行啟動映象
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 IDIMAGECOMMANDCREATED 1f1e5affd99ehelloworld"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
上傳映象到DockerHub中
-
在 Docker Hub 上註冊賬號
-
登入進去後在主頁點選Create a Repository
image
-
填寫資訊
image
-
在本機登入自己的Docker Hub 賬號,命令是
docker login
image
-
用
docker tag
命令為自己的映象取一個完整的名字包括版本號,v1為版本號docker tag helloworld 剛才建立的賬戶名字/helloworld:v1
-
將剛才所自定義的映象上傳上去,命令是
docker push buxuewushu/helloworld:v1
,其中buxuewushu
是換成自己的賬號,後面是剛才打的標籤名image
-
此時你就可以在 Docker Hub 中看到自己上傳的映象了
image
參考文章
本文的例子參考自極客時間中張磊寫的深入剖析Kubernetes,有興趣的可以檢視

image