通過Dockerfile構建鏡像以及上傳鏡像到Docker Hub

Dockerfile構建鏡像:

  1. Dockerfile的創建

Dockerfile的每一句命令都會生成一層鏡像。比如說下面的四條命令,會生成四層鏡像。
Dockerfile參考文檔:https://docs.docker.com/engine/reference/builder/

直接建一個名字爲Dockerfile的文件.寫入下面的命令:
FROM python:3.6.1-alpine
RUN pip install flask
CMD [“python”,“app.py”]
COPY app.py /app.py

FROM python:3.6.1-alpine:
Dockerfile的起點。 每個Dockerfile通常以FROM行開頭,這是在其之上構建層的起始映像(也就是鏡像的第一層)。 在這種情況下,您選擇的是python:3.6.1-alpine基本層,因爲它已經具有運行應用程序所需的Python和pip版本。alpine版本意味着它使用alpine發行版,該發行版比Linux的替代版本小得多。 較小的映像意味着它將更快地下載(部署),並且由於其受攻擊面較小,因此也更加安全。

RUN pip install flask:
RUN命令執行爲應用程序設置映像所需的命令,例如安裝軟件包,編輯文件或更改文件權限。 在這種情況下,您將安裝Flask。 RUN命令在build image的時候執行,會生成一層新的鏡像,加在FROM生成的基礎鏡像的上面。

CMD [“python”,“app.py”]
容器在啓動的時候,會運行CMD指定的命令。(注意,CMD指定的命令不會在構建鏡像的時候執行,但是會生成一層鏡像)
There can be only one CMD per Dockerfile. If you specify more than one CMD, then the last CMD will take effect.

COPY app.py /app.py
這行代碼將本地目錄(運行docker image build的時候所在的目錄)中的app.py文件複製到映像的新層。 該指令是Dockerfile中的最後一行。 頻繁更改的層(例如將源代碼複製到映像中)應放置在Dockerfile文件底部附近,以充分利用Docker層緩存。 這樣可以避免重建可能會緩存的image層。 例如,如果FROM指令發生更改,它將使該image的所有後續層的緩存均無效。

  1. 通過Dockerfile build一個鏡像
    docker image build -t python-hello-world . ==> docker build -t python-hello-world .
    -t:指定生成的鏡像的名字
    用法: docker build [OPTIONS] PATH | URL | - ==>後面必須帶有一個PATH參數或者URL參數,指定docker file所在的位置

  2. docker images ==> docker image ls
    查看鏡像列表(查看有多少鏡像)

  3. 運行鏡像
    docker run -p 5001:5000 -d python-hello-world
    -p解釋: The -p flag maps a port running inside the container to your host. In this case, you’re mapping the Python app running on port 5000 inside the container to port 5001 on your host. Note that if port 5001 is already being used by another application on your host, you might need to replace 5001 with another value, such as 5002.
    -d: 後臺運行容器

  4. 查看容器的logs
    使用docker ps查看正在運行的容器的id
    docker logs [container id] ==> 指定id查看對應的容器的log

  5. Dockerfile用於爲應用程序創建可複製的build。 常見的工作流程是讓您的CI/CD自動化運行docker映像構建,這是其構建過程的一部分。生成映像後,會將它們發送到central registry(存儲鏡像的地方),所有需要運行該應用程序的環境(例如測試環境)都可以訪問它們。

上傳鏡像到Docker Hub:

  1. 登錄docker hub的賬號 ==> docker login

  2. tag自己的鏡像
    Docker Hub的命名約定是使用[dockerhub用戶名]/[鏡像名稱]標記image。
    命令:
    docker tag python-hello-world [dockerhub username]/python-hello-world

  3. 上傳鏡像
    docker push [dockerhub用戶名]/python-hello-world

  4. 鏡像被上傳到docker hub之後,其他的人可以通過git pull拉取你的鏡像使用。
    Docker映像包含在映像中運行應用程序所需的所有依賴項。運行應用程序的時候也不需要擔心環境的差異,不需要配置。直接就能起來一個應用。很方便。

當應用更新之後,需要重新build image。

  1. 更新你的應用程序。

  2. 重新build image
    命令:
    docker image build -t [dockerhub用戶名]/python-hello-world .
    重新build的時候,會利用已經build好的layer的緩存,而不會重新build。

  3. 重新上傳
    docker push [dockerhub用戶名]/python-hello-world
    在上傳到docker hub的時候,沒有被更新的layer也是不會被上傳上去的,這樣可以節省很多的時間。

  4. 當更改了鏡像的某一層layer的時候,重新build的時候,在這層layer之上的layer都會被重新build。
    Dockerfile中的每一行都會構建一個新層,該層建立在從之前的行創建的層上。所以Dockerfile中的指定的命令的順序很重要。 在創建Dockerfile的時候,要注意優化,將經常需要改動的層放在最上面。

總結:

  1. 使用Dockerfile爲應用程序創建可複製的build,並將應用程序與Docker集成到CI / CD中。可以通過central registry使Docker映像可用於所有環境。 Docker Hub是registry的一個示例,但是可以在自己控制的服務器上部署自己的注registry。
  2. Docker映像包含在映像中運行應用程序所需的所有依賴項。這很有用,因爲當依靠部署在每個環境上的依賴項安裝時,不再需要處理版本差異。
  3. Docker使用聯合文件系統和“copy-on-write”來重用映像層。這樣可以減少存儲圖像的空間,並顯着提高啓動容器的性能。layer層由Docker構建和推送系統緩存。無需重新build已經存在的layer層。
  4. Dockerfile中的每一行都會創建一個新層,由於層緩存的原因,更改頻率更高的行(例如,將源代碼添加到映像)應在文件底部附近列出。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章