Dockerfile

  1. Dockerfile Param
  2. Download Java & Tomcat
    1. Java
    2. Tomcat
  3. Make Tomcat-Image
  4. 小結

Dockerfile 主要是來描述Image內部構造的文件,使用一個基本的Image然後再疊加上客製化的設定,最後就可以透過Build指令來建立一個屬於你的Image了,下面以架設Tomcat為範例

Dockerfile Param

Param Desc
FROM 每一個Dockerfile都會基於一個Image上再添加個人所需的套件 ex: MySQLImage = CentOS + MySQL + Java
MAINTAINER 作者或維護者
ENV Linux的環境變數 ex: export CATALINA_HOME=/usr/local….
ADD 複製文件且自動解壓縮
COPY 複製Host端的檔案
EXPOSE 預設容器暴露的Port
WORKDIR 以上執行完後切換的工作路徑
RUN 執行Linux命令,多半為安裝軟體,建議RUN指令越少越好,避免虛擬圖層過多影響效能,這個操作最後會永久保存於容器之中
CMD 執行docker run之後執行的命令
ENTRYPOINT 容器啟動後執行的命令

Download Java & Tomcat

建立一個臨時資料夾供後續處理

$ mkdir docker-temp && cd docker-temp

Java

$ wget --no-check-certificate -c --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/11.0.2+9/f51449fcd52f4d52b93a989c5c56ed3c/jdk-11.0.2_linux-x64_bin.tar.gz

Tomcat

增加權限規則以及使用者

$ wget http://apache.stu.edu.tw/tomcat/tomcat-9/v9.0.17/src/apache-tomcat-8.5.40.tar.gz

$ tar -zxvf apache-tomcat-8.5.40.tar.gz
$ vim apache-tomcat-8.5.40/conf/tomcat_users.xml
<!-- tomcat_users.xml -->
<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
              version="1.0">

    <role rolename="manager-gui"/>
    <role rolename="manager-script"/>
    <role rolename="manager-jmx"/>
    <role rolename="manager-status"/>
    <role rolename="admin-gui"/>
    <user username="tomcat" password="1qaz2wsx" roles="admin-gui,manager-gui,manager-script,manager-jmx,manager-status"/>
    <user username="admin" password="1qaz2wsx" roles="admin-gui,manager-gui,manager-script,manager-jmx,manager-status"/>

</tomcat-users>

接下來要做的處理是Tomcat於Manager和HostManager兩個頁面都有做訪問IP的權限管控,所以要去修改這兩個頁面的設定檔

$ vim /apache-tomcat-8.5.40/webapps/manager/META-INF/context.xml
<!-- context.xml -->
<Context antiResourceLocking="false" privileged="true" >

<!-- 原先只能允許LocalHost訪問,可以選擇增加可訪問IP或者註解掉 -->
<!--
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->
  <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
$ vim /apache-tomcat-8.5.40/webapps/manager/META-INF/context.xml
<!-- context.xml -->
<Context antiResourceLocking="false" privileged="true" >

<!-- 原先只能允許LocalHost訪問,可以選擇增加可訪問IP或者註解掉 -->
<!--
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->
  <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>

重新壓縮成tar.gz

$ tar -czvf apache-tomcat-8.5.40.tar.gz apache-tomcat-8.5.40/

Make Tomcat-Image

製作CentOS環境的TomcatImage

FROM centos:latest

MAINTAINER Alan <t0239184ps@gmail.com>

ADD jdk-11.0.2_linux-x64_bin.tar.gz /
ADD apache-tomcat-8.5.40.tar.gz /

RUN yum install vim -y \
&& rm -rf jdk-11.0.2_linux-x64_bin.tar.gz apache-tomcat-8.5.40.tar.gz \
&& chmod 777 /apache-tomcat-8.5.40/bin/*.sh

ENV JAVA_HOME=/jdk-11.0.2
ENV PATH=$PATH:$JAVA_HOME/bin
ENV CATALINA_HOME=/apache-tomcat-8.5.40
ENV CATALINA_BASE=/apache-tomcat-8.5.40
ENV CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:
ENV PATH=$PATH:$CATALINA_HOME/bin
CMD ["/apache-tomcat-8.5.40/bin/catalina.sh","run"]

關於RUN這個指令,如果能一口氣完成就一口氣,如果使用了三個RUN那麼Docker就會建立三個虛擬圖層,那這樣就會大大的影響效能

$ docker build -t tomcat1 . --no-cache

查看是否有建立成功

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat1             latest              845f6210b40b        14 hours ago        656MB

啟動Tomcat

$ docker run -p 8080:8080 --name tomcat-1 -d --rm -v ~/docker-data/tomcat:/apache-tomcat-8.5.40/webapps tomcat1

小結

Dockerfile主要是在描述Image的,下一篇來講描述Container的Docker-compose。