基於dockerfile構建javaweb環境
阿新 • • 發佈:2018-12-26
前言
接上篇阿里雲ECS - 使用Docker搭建Java Web執行環境
上篇文章雖然成功搭建了java web執行環境,但操作起來比較繁瑣,只能算一次docker的初體驗,本篇文章會使用dockerfile模板化的方式快速構建javaweb環境
操作環境
- 伺服器:阿里雲ECS
- 作業系統:CentOS 7.4 64位
準備條件
- dockerfile指令(ps.會在下文簡單說明一下),可參考:Dockerfile指令詳解
- 宿主機內或pull的映象檔案中已包含java和tomcat的安裝包
- 關於映象檔案,可以去DaoCloud映象市場下載,也可以自己打包好映象檔案上傳到阿里雲映象倉庫中
操作步驟
1、 建立dockerfile檔案
# 說明該映象以哪個映象為基礎
# FROM <image> 或 FROM <image>:<tag>
FROM daocloud.io/library/centos:latest
# 構建者的基本資訊
# MAINTAINER author's name mailaddress
MAINTAINER wufeee
# 啟動容器時進入的工作目錄
# 用於設定Dockerfile中的RUN、CMD和ENTRYPOINT指令執行命令的工作目錄(預設為/目錄)
WORKDIR /mnt
# 修改容器時區為東八區
RUN rm -rf /etc/localtime && \
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 拷貝本地檔案到映象中
ADD ./jdk-8u171-linux-x64.tar.gz /mnt/
ADD ./apache-tomcat-8.5.31.tar.gz /mnt/
RUN mv jdk1.8.0_171 jdk8 && \
mv apache-tomcat-8.5.31 tomcat8
# 配置java與tomcat環境變數
ENV JAVA_HOME /mnt/jdk8
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH .:$JAVA_HOME/lib:$JRE_HOME/lib
ENV PATH $PATH:$JAVA_HOME/bin
ENV CATALINA_HOME /mnt/tomcat8
#開啟內部服務埠
EXPOSE 8080
#啟動tomcat伺服器
CMD ["/mnt/tomcat8/bin/catalina.sh","run"] && tail -f /mnt/tomcat8/bin/logs/catalina.out
2、執行dockerfile檔案構建映象
docker build -t wf/javaweb:0.1 .
引數說明:
docker build -t [name] .
- t:定義構建的映象的名稱
- .:指定Dockerfile檔案在當前目錄下
【延伸】將構建好的映象上傳到阿里雲映象倉庫中(前提應該是要有阿里雲帳號和雲伺服器)容器映象服務地址
- 建立名稱空間
- 建立映象倉庫(建立完映象倉庫後點擊管理會有上傳和下載映象的操作指南)
3、 啟動容器
docker run -d -p 8080:8080 a71f488a5055
引數說明:
- -d:表示以“守護模式”執行,此時 Tomcat 控制檯不會出現在輸出終端上
- -p:表示宿主機與容器的埠對映,此時將容器內部的 8080 埠對映為宿主機的 8080 埠,這樣就向外界暴露了 8080 埠,可通過 Docker 網橋來訪問容器內部的 8080 埠了
4、 關於dockerfile中指令的說明
主要是自己在建立dockerfile檔案時遇到的一些坑點的記錄
(1) ADD和COPY的區別
模板:ADD <src>... <dest>
例子:ADD ./jdk-8u171-linux-x64.tar.gz /mnt/
- 將檔案src拷貝到容器的檔案系統對應的路徑dest下
- src必須是在Dockerfile的相對路徑下,以例子說明,jdk和tomcat和dockerfile在一個目錄下
- dest只能是容器中的絕對路徑。如果路徑不存在則會自動級聯建立,根據你的需要是裡是否需要反斜槓/,習慣使用/結尾從而避免被當成檔案
拷貝後如果是壓縮檔案會自動解壓
模板:COPY …
例子:COPY ./jdk-8u171-linux-x64.tar.gz /mnt/預發功能與ADD相同
- 不支援src是遠端URL、自動解壓兩個功能
(2)RUN
- 執行run的時候若不想使用絕對路徑的方式,需在dockerfile檔案中指定啟動容器時進入的工作目錄
例子:WORKDIR /mnt
(3)在Docker daemon模式下,無論是使用ENTRYPOINT(與CMD類似,只是不能被重寫和覆蓋),還是CMD,最後的命令,一定要是當前程序需要一直執行的,才能夠防容器退出
例子:CMD ["/mnt/tomcat8/bin/catalina.sh","run"]
&& tail -f /mnt/tomcat8/bin/logs/catalina.out*