一:摘要概述
前面的文章中詳細介紹了Docker的鏡像、容器、文件組件,但是使用Docker最關鍵的一步還是編寫Dockerfile文件,通過Dockerfile文件將應用項目構建爲鏡像使用。下面將詳細介紹如下幾個部分:
- 遠程連接Docker
- Dockerfile常用命令
- 編寫文件注意事項
- 應用鏡像構建實戰
二:遠程連接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中可以直接將鏡像發佈到遠程服務器,也可以在如下界面中配置參數,鏡像信息等