天天看點

容器 - Web服務示例(6)

1. 提前說明

到目前為止,已經介紹了如何啟動一個簡單的容器,并與之進行互動。同時也知道了如何停止、重新開機以及删除一個容器。接下來将展示一個Linux Web服務示例。

筆者将介紹通過docker command 以及 Dockerfile方式部署Linux Web服務。

Linux中主流的web服務有nginx、tomcat、apache、weblogic。因為筆者負責的java項目,這裡web服務以tomcat為示例。

在該示例中,會使用到tomcat鏡像。這個鏡像會在"8888"端口啟動一個相當簡單為Web服務。

這一節隻部署web服務,不會講解容器共享資料卷存儲、容器網絡等要點,後續在做相關說明。

2. 通過docker command方式部署

        ● -p

            Docker實體機的端口映射到容器内,端口資訊按照 "host-port:container-port"格式顯示,這一點很重要

            将Docker實體機的"8888"端口映射到容器内的"8080"(tomcat預設)端口。這意味着當有流量通路主機的"8888"端口的時候,流量會直接映射到容器内的"8080"端口

        當host不指名時,預設使用"0.0.0.0"所有位址

        擷取請求本機http://$ip:8888的http狀态碼

        http狀态碼404一般是2種情況

    ● 請求的位址不存在(tomcat預設項目路徑為webapps/ROOT)

    ● 請求的位址沒有權限通路

        發現"webapps"下沒有任何項目路徑

        建立Web首頁,注意目錄、檔案權限

        http狀态碼為200且首頁位址正常通路

        筆者做過一個嘗試,将"tomcat-v1.0"容器導出為鏡像,再基于此鏡像建立2個容器"tomcat-v1.1"、"tomcat-v1.2",啟動時抛出"無法找到java環境"導緻啟動失敗。

        "export" 和 "import" 導出的是一個容器當時的快照, 不是鏡像本身, 也就是說沒有鏡像分層(依賴鏡像)。快照檔案将丢棄所有的曆史記錄和中繼資料資訊,例如工作目錄(workdir)、啟動指令(entrypoint)、曆史送出資訊(commit)等都會丢失。是以啟動時會抛出"Neither the JAVA_HOME nor the JRE_HOME environment variable is defined"

        對此筆者有個疑問,"import"的作用是什麼?nginx、apache的Web服務是否會受此限制,後續試驗一下。

        相比于"save"、"load",最大的差別于以下四點:

            ● docker save 儲存的是鏡像(image),docker export 儲存的是容器(container)

            ● docker load 用來載入鏡像包,docker import 用來載入容器包,但兩者都會恢複為鏡像

            ● docker load 不能對載入的鏡像重命名,而 docker import 可以為鏡像指定新名稱

            ● docker load 儲存鏡像完整記錄,包含分層鏡像,是以檔案體積會比docker export的更大一些

3. 通過dockerfile方式部署   

        Dockerfile 是一個用來建構鏡像的文本檔案,文本内容包含了一條條建構鏡像所需的指令和說明。

        這裡僅講解如何運作 Dockerfile 檔案來定制一個鏡像,具體 Dockerfile 檔案内指令詳解,将在下一節中介紹,這裡你隻要知道建構的流程即可。

        ● FROM

            下載下傳目标鏡像,每個Dockerfile檔案一行都是FORM指令,目前應用的剩餘内容會作為新增鏡像層添加到基礎鏡像層之上        

        ● MAINTAINER

            作者資訊,作為鏡像的中繼資料資訊,不建構鏡像

        ● WORKDIR

            為Dockerfile中尚未執行的指令設定工作目錄,該目錄與鏡像相關,并且會作為中繼資料記錄到鏡像配置中,但不會建立新的鏡像層,筆者了解類似于家目錄

        ● RUN

            執行shell command,進入容器後執行的指令

        ● COPY

            拷貝檔案,host_file_path:container_file_path,将應用相關檔案從建構上下文複制到了目前鏡像中

            筆者測試時 "host_file_path"檔案必須與dockerfile檔案在同一目錄

        ● EXPOSE

            指定容器内監聽的tcp端口,作為中繼資料被儲存下來,不會産生新的鏡像層

        ● CMD

            為啟動的容器指定預設要運作的程式,程式運作結束,容器也就結束。CMD 指令指定的程式可被 docker run 指令行參數中指定要運作的程式所覆寫。如果 Dockerfile 中如果存在多個 CMD 指令,僅最後一個生效

        ● 鏡像分層圖可以了解如下

        其他參數可參考

            https://www.runoob.com/docker/docker-dockerfile.html   

        ● -f

            指明Dockerfile檔案路徑,可以是絕對路徑或者是目标目錄

        ● -t

            制定鏡像生成的标簽,格式為<REPOSITORY>:<TAG>

        ● .

            注意末尾的".",這個非常重要,一定要在目錄最後包含這個"."。指令最後的"."表示Dockerfile在進行建構的時候,使用目前目錄作為建構上下文