自定義Docker容器鏡像並將其上傳到DockerHub中

自定義Docker容器鏡像並將其上傳到DockerHub中

Docker從2013年發佈至今,一直是廣受矚目,因此咱們或多或少也應該瞭解一些Docker的技術原理,而學習一項技術有了興趣才能更好的讓你持續學習下去。若是讓你體會到Docker的神奇之處那麼興趣或許會大一點,接下來咱們就先從自定義一個本身的Docker容器鏡像來開啓學習Docker的第一步。html

自定義Docker容器鏡像

在開始咱們的實踐以前,咱們固然得在機器上安裝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中用到的命令做用瀏覽器

  • FROM:用於指定其後構建新鏡像所使用的基礎鏡像。FROM 指令必是 Dockerfile 文件中的首條命令,啓動構建流程後,Docker 將會基於該鏡像構建新鏡像,FROM 後的命令也會基於這個基礎鏡像。
  • WORKDIR:用於在容器內設置一個工做目錄。
  • ADD:更高級的複製命令,將原路徑文件賦值到目標路徑中
  • RUN:在容器中執行Shell命令,requirements.txt中放着所要下載依賴的名字Flask
  • EXPOSE:爲構建的鏡像設置監聽端口,使容器在運行時監聽。
  • ENV:設置環境變量而已,不管是後面的其它指令,如 RUN,仍是運行時的應用,均可以直接使用這裏定義的環境變量。
  • CMD:用於指定在容器啓動時所要執行的命令。

此時咱們看到咱們的目錄中存放的文件爲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

上傳鏡像到DockerHub中

  1. Docker Hub上註冊帳號

  2. 登陸進去後在主頁點擊Create a Repository

  3. 填寫信息

  4. 在本機登陸本身的Docker Hub 帳號,命令是docker login

  5. docker tag命令爲本身的鏡像取一個完整的名字包括版本號,v1爲版本號

    docker tag helloworld 剛纔建立的帳戶名字/helloworld:v1
  6. 將剛纔所自定義的鏡像上傳上去,命令是docker push buxuewushu/helloworld:v1,其中buxuewushu是換成本身的帳號,後面是剛纔打的標籤名

  7. 此時你就能夠在Docker Hub中看到本身上傳的鏡像了

參考文章

本文的例子參考自極客時間中張磊寫的深刻剖析Kubernetes,有興趣的能夠查看

相關文章
相關標籤/搜索