docker構建

在Docker容器中,咱們能夠隨意的增刪軟件,不用的時候直接刪除鏡像容器,這是至關方便的。可是,若是有其餘人想要試用你的軟件,怎麼辦呢?或者你從新換了一臺電腦,須要執行Docker pull而後 install嗎?
答案確定是不用,由於Docker具體快速部署的特色,接下來咱們學習如何構建Docker鏡像。php

docker commit

最直觀的思路應該是把咱們建立的容器保存下來,能夠經過docker commit命令,格式以下:html

docker commit -a "author" -m "message" <exiting container> <hub-user>/<repo-name>:<tag>

該命令很像咱們經常使用的git commit,其中exiting container 爲容器名稱或者ID,hub-user爲登陸docker-hub的用戶名,repo-name爲鏡像名稱,tag爲鏡像的標籤。python

鏡像構建成功後就能夠進行分享了。
你可使用 docker save <image> | gzip > filename 將image保存爲文件,而後拷貝給其餘人,再經過docker load -i filename 導入使用。
以上操做和AI模型的操做很相似,先訓練模型,訓練好以後在save模型,再經過loadd導入模型,因此在計算機的不少領域,思想都是相似的。mysql

這種方式略顯麻煩,你能夠經過docker push將鏡像上傳到Docker hub或者本身的私有鏡像倉庫中,以後就能夠隨時經過docker pull拉取使用了。
另外,咱們能夠經過docker history來查看鏡像的構建歷史,例如:
image.pngnginx

在這裏咱們能夠發現,在軟件內部增刪軟件、文件等操做在這裏都沒法體現,所以咱們的鏡像事實上成了一個黑盒,沒有文檔就不知道其具體有什麼功能,即便你添加了文檔,通過一次次更改文檔極可能也沒有同步了,很是不方便別人或者本身之後使用。事實上,docker 提供了更方便強大的方式構建鏡像,即 Dockerfile。git

另外,在commit方式在特定場景下也有其用途,好比程序崩潰、被入侵後保護現場。sql

Dockerfile

Dockerfile 是一個文本文件,其內包含了一條條的指令,描述咱們的鏡像該如何構建,就像咱們程序的源碼。在這以前,補充一個知識,就是咱們的 docker 鏡像文件事實上是分層的。你應該注意到拉取 ubuntu 的時候,它 pull 了不少次。而分層的操做也方便不一樣鏡像間共享相同的層,這顯著的節省了客戶機的存儲空間以及下載時間。
Dockerfile每條指令的內容就是描述該層如何構建的。接下來咱們定製一個nginx鏡像。
任意新建一個文件夾,新建一個文本文件,名爲Dockerfile,內容以下:docker

FROM nginx
RUN echo "<h1> hello docker </h1>" > /usr/share/nginx/html/index.html

而後執行docker build命令構建鏡像:
docker build -t <name>:<tag> pathshell

image.png

能夠發現新的鏡像分爲兩層,注意命令後面有一個.,表示當前文件夾。
而後經過docker run啓動容器:
image.png
這時訪問 http://127.0.0.1:8080 應該就能看到咱們的頁面了。注意以前的鏡像可能已經綁定了本機 8080 端口,你須要中止它或者換一個端口。還有 -d 參數表示後臺運行,注意 -d 並不影響容器的運行時間,只是將其放到了後臺,換句話說,若是你的容器自己沒有運行不退出的進程,即便加了 -d 容器依然會自動退出。
固然咱們也能夠經過docker ps指令查看容器進程:
image.pngdjango

接下來介紹經常使用的dockerfile命令:

  • FROM

FROM 爲指定基礎鏡像,像以前咱們基於官方 nginx 進行定製,這樣能夠省略大量的重複工做。DockerHub 上有大量的鏡像,ubuntu、mysql、php、python 等等,必定要選擇合適的做爲基礎鏡像,好比開發 django 就選用 python 或者 django 鏡像,而不要去用 php 鏡像。

  • RUN

RUN 命令即用來在容器中執行命令的,至關於你以前手動在 docker 裏面執行命令。

其格式也很簡單,RUN <command> 便可,command 能夠是容器內能執行的任何命令。

這裏說下本人的經驗,RUN 命令不必定能成功執行,你沒必要一遍遍更改而後 build 實驗,能夠直接 run 一個基礎鏡像,而後去執行命令,等成功了再寫入 Dockerfile,會方便不少。

另外,以前說過,每條命令會構建一層,因此不要寫太多層 RUN,也不要只有一層,單獨的功能模塊組合到一層,更利於快速構建以及複用。好比下面這個例子:
FROM php:7.1.22-fpm

# Install PHP and composer dependencies
RUN apt-get update \
    && apt-get install -qq git curl libmcrypt-dev libjpeg-dev libpng-dev libfreetype6-dev libbz2-dev \
    && RUN apt-get clean

# Install needed extensions
RUN docker-php-ext-install pdo pdo_mysql mcrypt zip gd
  • COPY

COPY <源路徑> <目標路徑>
你能夠將須要的文件拷貝到鏡像內,注意這裏源路徑是相對路徑,即相對上文構建命令裏的最後一個參數所指定的目錄(上文例子爲.),不能隨意引用其它文件。另外,儘可能不要在構建目錄裏放入無關文件,由於 docker 會將目錄下全部文件打包發送給服務進程.

  • CMD

CMD 命令爲容器啓動時的默認命令,由於容器其實本質是一個進程(後面會細講)。好比 ubuntu 鏡像默認 CMD 命令爲 /bin/bash,所以事實上咱們只要執行 docker run -it ubuntu 就能夠獲得一個交互式 shell。若是咱們傳入其它命令,好比 執行 docker run ubuntu uname,容器就會執行咱們指定的命令。

以上就是最經常使用的 Dockerfile 命令,建議你們本身嘗試構建一個,會有更深的體會。另外還有不少命令以及細節,能夠參考這篇教程,寫的特別好,強烈推薦。

相關文章
相關標籤/搜索