一個實戰讓你搞懂Dockerfile
在認識Dockerfile的基礎功能之後,即一個用基礎鏡像來構建新鏡像的文本文件,就需要在實際工作中使用其靈活便利的操作來提升我們的工作效率了,這裡演示在Tomcat里運行一個程式的過程,以此來感受Docker帶給我們的便利。
編寫Dockerfile
這裡我們直接編寫Dockerfile文件,首先要準備Jdk和Tomcat安裝包
tomcat://dlcdn.apache.org/tomcat/tomcat-9/v9.0.62/bin/apache-tomcat-9.0.62.tar.gz
記住創建一個空白的目錄,然後這個目錄只存放我們需要的文件
[root@hadoop101 ~]# cd /home/docker_test/docker_files/mytomcat
[root@hadoop101 mytomcat]# ll
total 155832
-r-------- 1 root root 11560971 Apr 21 23:49 apache-tomcat-9.0.62.tar.gz
-rw-r--r-- 1 root root 1099 Apr 22 00:29 Dockerfile
-r-------- 1 root root 148003999 Apr 21 23:47 jdk-8u331-linux-x64.tar.gz
-rw-r--r-- 1 root root 0 Apr 22 00:20 readme.txt
[root@hadoop101 mytomcat]#
這裡我們把jdk和tomcat安裝包放在這個目錄下,然後加一個說明文檔。
下面是Dockerfile文件具體內容:
FROM centos
MAINTAINER zhangbaohpu
COPY readme.txt /usr/local/readme.txt
#這裡會自動解壓
ADD jdk-8u331-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.62.tar.gz /usr/local/
ENV mypath /usr/local
WORKDIR $mypath
#將原有的yum配置備份下
RUN tar cvf /etc/yum.repos.d.tar /etc/yum.repos.d
#修改yum源配置,
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo //mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
#刪除掉多於的repo文件
RUN rm -rf /etc/yum.repos.d/CentOS-Linux-*
#使yum配置更新
RUN yum clean all
RUN yum makecache
#下載需要的工具類
RUN yum -y install vim
#設置環境變數
ENV JAVA_HOME /usr/local/jdk1.8.0_331
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.62
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.62
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#對外暴露埠
EXPOSE 8080
#容器啟動之後再啟動tomcat,並打開日誌
CMD /usr/local/apache-tomcat-9.0.62/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.62/logs/catalina.out
註:最新默認的Centos版本是8,自帶的yum源已經失效,所以在這裡我們順便修改下yum源,然後再下載其他工具。
構建鏡像
Dockerfile文件編寫完成之後,就可以構建自己的鏡像了,切記在Dockerfile所在目錄下執行。
[root@hadoop101 mytomcat]# docker build -t mytomcat .
#具體構建過程太長就不再展示了,只要最後有兩個Successfully就表示構建完成。
[root@hadoop101 mytomcat]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytomcat latest b9cee7d729a7 10 minutes ago 697MB
運行鏡像
有了我們自己自定義的鏡像之後,就可以運行一個鏡像實例,然後部署我們實際的應用程式
[root@hadoop101 mytomcat]# docker run -d -p 9090:8080 --name baotomcat -v /home/zhangbao/build/tomcat/test:/usr/local/apache-tomcat-9.0.62/webapps/test -v /home/zhangbao/build/tomcat/logs:/usr/local/apache-tomcat-9.0.62/logs mytomcat
訪問 //192.168.88.71:9090/ 就可以看到熟悉的頁面了
命令解釋:
-p 9090:8080 將容器內埠映射到宿主機埠
–name baotomcat 容器名稱
-v /home/zhangbao/build/tomcat/test:/usr/local/apache-tomcat-9.0.62/webapps/test 將程式test根目錄掛載到宿主機的指定目錄下,前面為宿主機目錄
-v /home/zhangbao/build/tomcat/logs:/usr/local/apache-tomcat-9.0.62/logs 掛載日誌目錄
最後一個是指定運行的鏡像
部署項目
下面我們可以在宿主機發布程式了,因為部署程式test已經掛載到宿主機上了
[root@hadoop101 mytomcat]# cd /home/zhangbao/build/tomcat/
[root@hadoop101 tomcat]# ll
total 0
drwxr-xr-x 2 root root 197 Apr 22 22:26 logs
drwxr-xr-x 2 root root 6 Apr 22 22:26 test
[root@hadoop101 tomcat]# cd test
[root@hadoop101 test]# ll
總用量 4
-rw-r--r-- 1 root root 266 4月 22 23:46 index.jsp
drwxr-xr-x 2 root root 21 4月 22 23:52 WEB-INF
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="//java.sun.com/xml/ns/javaee"
xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="//java.sun.com/xml/ns/javaee
//java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
</web-app>
然後訪問 //192.168.88.71:9090/test/ 可以看到Hello wold!