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。