上篇文章我們給大家介紹了Dockerfile中的常用指令,本文我們通過具體的案例來說明這些指令。
1.Base鏡像
Docker Hub中99%的鏡像都是通過在base鏡像中安裝和配置需要的軟件構建出來的,如下
scratch
相對於java中的Object
2.自定義鏡像mycentos
我們從官方pull下來的centos
鏡像是mini版的,所以不帶有vim
這些基礎命令,那我們就來自定義一個鏡像,功能比官方下載的強大點,同時運用下各個指令。
2.1 編寫
首先我們來編寫對應的Dockerfile文件。內容如下
FROM centos
MAINTAINER bobo<[email protected]>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
2.2 構建
然後將腳本構建成對應的鏡像文件。
docker build -f dockerfile名稱 -t 新建的鏡像名:TAG .
查看鏡像
2.3 運行
運行鏡像文件。
docker run -it 新鏡像名稱:TAG
運行容器後,落腳點是 /usr/local
因爲我們配置了WORKDIR
2.4 鏡像歷史
查看一個鏡像文件的變更歷史可以使用如下命令:
docker history 鏡像名
在本例中我們用到了 FROM
MAINTAINER
RUN
EXPOSE
ENV
WORKDIR
命令
3.CMD/ENTRYPOINT案例
接下來我們通過案例來看看CMD
和ENTRYPOINT
兩個命令的區別,這兩個命令的作用都是指定一個容器啓動時要運行的命令
3.1 CMD
Dockerfile中可以有多個CMD指令,但只有最後一個生效,CMD會被docker run之後的參數替換掉,我們通過tomcat的案例來介紹。
正常情況如下
docker run -it -p 8888:8080 tomcat
但是當我們在 執行命令後添加參數的話,如下
原因是我們先看Tomact對應的 Dockerfile文件
然而我們的run命令 把Dockerfile中的最後的CMD命令覆蓋了~~
3.2 ENTRYPOINT
有別於CMD
命令,ENTRYPOINT
命令是在 docker run
之後的參數會被當做參數傳遞給 ENTRYPOINT,之後形成新的組合命令。我們通過curl
指令來介紹這個案例。
Dockerfile文件如下:
FROM centos
RUN yum install -y curl
ENTRYPOINT [ "curl", "-s", "http://www.baidu.com" ]
構建
正常run
加-i
參數 查看響應報文頭
通過這個例子 可以看到ENTRYPOINT
不會覆蓋,而是組合成了一個新的命令。
4.自定義Tomcat9
最後我們通過自定義一個tomcat
鏡像來介紹下ADD
和COPY
這兩個命令的區別。
4.1 創建個tomcat目錄
4.2 添加一個文件
在當前目錄下創建一個 hello.txt
文件,作用是COPY
到容器中
4.3 拷貝相關軟件
準備對應的jdk
和tomcat
的壓縮文件。
4.4 創建Dockerfile文件
創建對應的Dockerfile文件,如下:
FROM centos
MAINTAINER bobo<[email protected]>
#把宿主機當前上下文的hello.txt拷貝到容器/usr/local/路徑下
COPY hello.txt /usr/local/helloincontainer.txt
#把java與tomcat添加到容器中
ADD jdk-8u201-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.0.47.tar.gz /usr/local/
#安裝vim編輯器
RUN yum -y install vim
#設置工作訪問時候的WORKDIR路徑,登錄落腳點
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java與tomcat環境變量
ENV JAVA_HOME /usr/local/jdk1.8.0_201
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.0.47
ENV CATALINA_BASE /usr/local/apache-tomcat-8.0.47
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器運行時監聽的端口
EXPOSE 8080
#啓動時運行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-8.0.47/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-8.0.47/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-8.0.47/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.0.47/bin/logs/catalina.out
4.5 構建
docker build -f dockerfile -t bobotomcat .
構建成功。
4.6 run
構建成功後,我們就可以運行了,命令如下:
docker run -d -p 9080:8080 --name mytomcat -v /mydocker/tomcat/test:/usr/local/apache-tomcat-8.0.47/webapps/test -v /mydocker/tomcat/tomcatlogs/:/usr/local/apache-tomcat-8.0.47/logs --privileged=true bobotomcat
注意:我們在啓動的時候指定了相關的 數據卷
4.7 驗證
4.8 部署web項目
既然我們已經部署好了我們自己的tomcat容器,而且也設置了對應的數據卷,那麼我們來實際部署一個web案例來看看
4.8.1 web.xml文件
我們在test目錄下創建WEB-INF
目錄,然後創建web.xml
文件,
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>test</display-name>
</web-app>
4.8.2 index.jsp文件
然後創建一個簡單的jsp文件即可
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
-----------welcome------------
<%="i am in docker tomcat self "%>
<br>
<br>
<% System.out.println("=============docker tomcat self");%>
</body>
</html>
4.8.3 重啓容器訪問即可
訪問成功~說明搭建OK!