Dockerfile: 是一個用來構建映象的文字檔案,文字內容包含了一條條構建映象所需的指令和說明。
應用: 將部署過程中涉及到的所有步驟全部寫入到 Dockerfile 中,到時只需要執行 Dockerfile 就可以自動完成相應的操作
快速入門編輯Dockerfile在當前目錄下建立 Dockerfile 並進行編輯
vim Dockerfile
操作:啟動 ubuntu 映象,在啟動起來後去更新 ubuntu 容器下的軟體資源 內容如下
# From: 啟動執行一個映象資源From ubuntu# Run: 在啟動起來的容器中執行指令RUN apt-get update
執行Dockerfile構建映象命令
docker build -t [映象名]:[版本號] [Dockerfile所在目錄]
指定在當前目錄下去查詢 Dockerfile 檔案,並將 Dockerfile 自動化處理後的(更新了軟體資源)容器打成名為 lxf 的映象資源
docker build -t lxf .
執行效果:
待執行完成後,當前擁有的映象資源就多出了 lxf 這一個,可以看到 lxf 這個映象的大小是要比 ubuntu 的映象要大一點的
基礎指令詳解FROM格式:
FROM <image>FROM <image>:<tag>
說明:
FROM 是 Dockerfile 裡的第一條而且只能是除了首行註釋之外的第一條指令RUN格式:
# shell模式RUN <command># exec模式RUN ["executable", "param1", "param2"]
說明:
表示當前映象構建時候執行的命令註釋:
# shell 模式:類似於 /bin/bash -c command RUN echo hello # exec 模式:類似於 RUN ["/bin/bash", "-c", "command"] RUN ["echo", "hello"]
執行多條指令
一條條指令寫RUN echo helloRUN echo world
將指令用 && 連線起來
RUN echo hello && echo world
MAINTAINER
格式:
MAINTAINER <name>
說明:
指定該 Dockerfile 檔案的維護者資訊EXPOSE設定容器對外開放的埠
格式:
EXPOSE <port> [<port>...]
解釋:
設定 Docker 容器對外暴露的埠號, Docker 為了安全,不會自動對外開啟埠,如果需要外部提供訪問,還需要啟動容器時增加 -p 或者 -P 引數對容器的埠進行分配。ENTRYPOINT設定容器在啟動後去執行一個命令
格式:
# exec 模式ENTRYPOINT ["executable", "param1","param2"]# shell模式ENTRYPOINT command param1 param2
解釋:
每個 Dockerfile 中只能有一個 ENTRYPOINT ,當指定多個時,只有最後一個起效。EXPOSE 和 ENTRYPOINT 結合使用的例子,可以全文看完後再回到這裡看該例子
# 使用django映象資源From django# 切換目錄WORKDIR /home# 建立一個名為lxf的django專案RUN django-admin startproject lxf# 切換目錄WORKDIR /home/lxf# 對外開放8000埠EXPOSE 8000# 容器啟動後,將django服務開啟,並指定埠號為8000ENTRYPOINT python3 manage.py runserver 0.0.0.0:8000
執行構建映象命令
docker build -t lxf .
現在我們將構建好的 lxf 容器執行起來,並隨機分配埠
docker run -dit -P lxf
可以看到, Docker 為我們隨機分配了 55001 埠對映到容器的 8000 埠,並且可以正常訪問到容器的 django 服務
檔案指令詳解ADD格式:
ADD <src>... <dest>ADD ["<src>",... "<dest>"]
說明:
將指定的 <src> 檔案複製到容器檔案系統中的 <dest>src 指的是宿主機,dest 指的是容器如果原始檔是個壓縮檔案,則 Docker 會自動幫解壓到指定的容器中(無論目標是檔案還是目錄,都會當成目錄處理)。如:將宿主機下的 ./data 目錄下的所有檔案(夾),全部複製到容器的 /home 目錄下
From ubuntuADD ./data /home
注:目錄本身即 data 目錄並不會複製到容器中,只複製 data 目錄下的檔案(夾),如果想連同 data 資料夾也複製過去,可以修改為如下指令
From ubuntuADD ./data /home/data
COPY
格式:
COPY <src>... <dest>COPY ["<src>",... "<dest>"]
解釋:
單純複製檔案場景, Docker 推薦使用 COPY如果原始檔是個壓縮檔案, Docker 會直接將壓縮檔案複製進容器內,不會像 ADD 那樣先解壓再複製注: COPY 與 ADD 基本上是一樣的,只是面對原始檔是壓縮檔案時處理方式不同而已, ADD 會先解壓再將解壓後的內容複製到容器, COPY 不會進行解壓,而是直接將壓縮包複製過去
環境指令詳解ENV設定環境變數
格式:
ENV <key> <value>ENV <key>=<value> ...
解釋:
設定環境變數,可以在 RUN 之前使用,然後 RUN 命令時呼叫,容器啟動時這些環境變數都會被指定如:設定了環境變數 name ,並賦值為 lxf ,使用 RUN 命令列印 name 變數的值,可以成功打印出來
ENV name=lxfRUN echo $name # 會打印出lxf
並且,當進入容器後也可以正常打印出該變數的值
root@5721971f92e4:/# echo $namelxf
WORKDIR
切換目錄
格式:
WORKDIR /path/to/workdir
解釋:
切換目錄,為後續的 RUN 、 CMD 、 ENTRYPOINT 指令配置工作目錄。相當於 cd 命令,可以使用多個 WORKDIR 指令進行多次切換,後續命令如果引數是相對路徑,則會基於之前命令指定的路徑如果我們指定切換到一個不存在的目錄, Docker 會幫我們自動建立相應的目錄舉例:
WORKDIR /aWORKDIR bWORKDIR cRUN pwd
最終路徑為 /a/b/c
如果我們想要容器被執行起來時,自動進入到 /home ,可以按如下指令設定
From ubuntu WORKDIR /home
執行 Dockerfile 構建映象完成後執行起來,此時容器便會自動進入到 /home 目錄
對比一下之前沒有設定使用過 WORKDIR ,執行起來的容器,會預設進入到根目錄