Docker(四) -- Dockerfile文件編寫

一:摘要概述

前面的文章中詳細介紹了Docker的鏡像、容器、文件組件,但是使用Docker最關鍵的一步還是編寫Dockerfile文件,通過Dockerfile文件將應用項目構建爲鏡像使用。下面將詳細介紹如下幾個部分:

  1. 遠程連接Docker
  2. Dockerfile常用命令
  3. 編寫文件注意事項
  4. 應用鏡像構建實戰

二:遠程連接Docker

Docker安裝的文章中介紹過Docker Engine包括了Server與Client兩部分,自然在IDE工具中也能通過安裝插件模擬客戶端使用遠程的服務端。接下來將通過IDEA安裝Docker插件的方式介紹如何連接遠程客戶端

2.1 發佈遠程端口

Docker默認不會開放遠程連接端口,需要自行修改配置文件後重啓Docker服務發佈

// 修改/etc/systemd/system/docker.service
// 將ExecStart選項修改爲如下內容:
ExecStart=/usr/bin/dockerd -H unix://var/run/docker.sock -H tcp://0.0.0.0:2375
// 加載後臺配置重啓Docker應用
systemctl daemon-reload
systemctl restart docker.service

在這裏插入圖片描述

2.2 IDEA下載插件

IDEA下載插件的方式不再贅述,直接輸入docker搜索下載下圖所示插件重啓IDEA應用即可。因爲本人使用的是IDEA2019正版,已經默認安裝好了相關插件就不演示相關過程
在這裏插入圖片描述

2.3 遠程連接

IDEA下面就會顯示一個Docker的圖標,點擊圖標然後在控制檯點擊編輯按鈕,進入這個頁面就是編輯連接遠程Docker服務。填好相關的IP端口即可,會提示連接成功亦或是失敗。當然檢查檢查自己的防火牆最好
在這裏插入圖片描述

三:Dockerfile常用命令

Dockerfile文件就是系列命令組成,通過Docker解析執行相關操作。常用的命令不會超過十個,但是卻滿足日常百分之九十以上的需求

3.1 FROM
  • 位置:位於Dockerfile文件除註釋外第一行
  • 作用:引入基礎鏡像,比如Java經常會引入Java鏡像作爲基礎構建Java環境
3.2 ARG / ENV
  • 位置:任意位置,只要在使用前聲明即可
  • 作用:控制動態參數
  • 應用:$引用,但是最好使用${}標明界限
  • 注意:ARG只能在構建鏡像時傳入,ENV不僅在構建鏡像時可以傳入,並且可以在運行容器時傳入覆蓋
3.3 MAINTAINER
  • 位置:任意位置
  • 作用:標註運維人員、聯繫方式等信息,鏡像使用docker inspect可以看到
3.4 RUN
  • 位置:任意位置
  • 作用:執行shell命令,比如創建目錄mkdir等
  • 注意:多個RUN命令可以在後面使用;\連接爲一個RUN命令
3.5 ADD / COPY
  • 位置:任意位置
  • 作用:複製文件
  • 注意1:如果複製/home目錄下的文件那麼只會複製目錄下文件,不會複製/home外層目錄
  • 注意2:ADD會將tar包自動解壓縮,但是COPY命令不會
  • 注意3:COPY可以拷貝遠程網絡資源,但是ADD不可以
3.6 EXPOSE
  • 位置:任意位置
  • 作用:容器暴露的端口
3.7 VOLUME
  • 位置:任意位置
  • 作用:掛載數據卷
3.8 USER
  • 位置:任意位置
  • 作用:聲明容器運行使用的用戶角色
3.9 WORKDIR
  • 位置:任意位置
  • 作用:聲明使用docker exec命令進入容器後的工作目錄
3.10 CMD / ENTRYPOINT
  • 位置:任意位置
  • 作用:容器啓動時將會執行的命令
  • 注意:CMD與ENTRYPOINT同時存在時CMD將會作爲ENTRYPOINT的參數

四:注意事項

個人在編寫Dockerfile文件的過程中遇到一些不大不小的坑,在這裏記錄

4.1 絕對路徑

前面就講過鏡像層的概念,Dockerfile製作鏡像時執行每個RUN命令都是創建一個臨時容器,然後進入容器中執行shell,然後再commit修改打包新鏡像層。所以千萬別使用相對路徑

4.2 Tomcat啓動

使用Tomcat容器運行WEB應用時千萬別使用startup.sh腳本,請使用catalina.sh運行run。這樣才能使得Docker容器內應用持續運行,具體原因可以參考Docker運行原理

五:實戰演練

下面是本人在製作一個應用項目過程中編寫的Dockerfile文件,可以結合前面的常用命令作用理解。當然github上有許多Dockerfile示例文件,這玩意兒只有親自動手操作你纔會熟悉使用:

# 引入Java8基礎鏡像
FROM java:8

# apps下日期_SVN版本變量
ARG  DATE_SVN
# Tomcat對外暴露端口
ARG TOMCAT_PORT
# Tomcat版本
ARG TOMCAT_VERSION
#應用版本
ARG APPLICATION_VERSION

# 標註維護人員、聯繫方式
MAINTAINER zsl 17301141124

# 鏡像最後維護更新時間
ENV REFRESHED_AT 2019-11-28

# 創建系列文件夾
RUN cd /home;\
    mkdir shortUrlM;\
    groupadd tomcat;\
    useradd tomcat_dlj -m -g tomcat;\
    chown -R tomcat_dlj:tomcat shortUrlM;\
    su tomcat_dlj;\
    cd /home/tomcat_dlj;\
    mkdir apps;\
    mkdir logs;\
    mkdir tomcat;\
    cd /home/tomcat_dlj/apps;\
    mkdir app_${TOMCAT_PORT}_beijing_dlj;\
    cd /home/tomcat_dlj/apps/app_${TOMCAT_PORT}_beijing_dlj;\
    mkdir $DATE_SVN;\
    cd $DATE_SVN;\
    mkdir dlj;\
    cd /home/tomcat_dlj/logs;\
    mkdir log_${TOMCAT_PORT}_beijing_dlj;

# 拷貝Tomcat文件
RUN cd /home/tomcat_dlj/tomcat/
ADD tomcat_8.5.47_15101_dlj.tar /home/tomcat_dlj/tomcat/
RUN mv /home/tomcat_dlj/tomcat/tomcat_8.5.47_15101_dlj /home/tomcat_dlj/tomcat/tomcat_${TOMCAT_VERSION}_${TOMCAT_PORT}_dlj

# 拷貝應用文件
RUN cd /home/tomcat_dlj/apps/app_${TOMCAT_PORT}_beijing_dlj/$DATE_SVN/dlj;\
    mkdir $APPLICATION_VERSION;
ADD target/dlj  /home/tomcat_dlj/apps/app_${TOMCAT_PORT}_beijing_dlj/$DATE_SVN/dlj/$APPLICATION_VERSION/

# 暴露端口
EXPOSE 15147
EXPOSE 15447
EXPOSE 15547

# 啓動應用
USER tomcat_dlj
WORKDIR /home/tomcat_dlj
CMD ["/home/tomcat_dlj/tomcat/tomcat_8.5.47_15147_dlj/bin/catalina.sh","run"]

五:鏡像製作

IDEA中可以直接將鏡像發佈到遠程服務器,也可以在如下界面中配置參數,鏡像信息等
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章