Docker鏡像打包示例


一、war包(SpringMVC項目)鏡像部署
 
1、拉取tomcat鏡像
docker pull tomcat:8.5.30
 
2、上傳需要部署的war包(以hello.war為例)到自定義的工作目錄下
 
3、在上個步驟創建的工作目錄下創建Dockerfile文件。將war包和Dockerfile文件放在同一目錄下。Dockerfile文件內容如下:
from tomcat:8.5.30

 

ENV LANG C.UTF-8

 

ENV TZ=Asia/Shanghai

 

ENV JAVA_OPTS "-Djava.awt.headless=true"

 

RUN touch /usr/local/tomcat/bin/setenv.sh && chmod +x /usr/local/tomcat/bin/setenv.sh && echo "CLASSPATH=/xx/hello" >/usr/local/tomcat/bin/setenv.sh

 

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

 

RUN rm -rf /usr/local/tomcat/webapps/*

 

ADD hello.war  /usr/local/tomcat/webapps/

 

WORKDIR /usr/local/tomcat/bin/

 

CMD ["catalina.sh", "run"]
4、創建鏡像(注:-t 表示為該鏡像起名稱,另外,構建命令后面有個英文實心點,表示當前目錄。)
docker build -t hello .
 
5、通過docker images可以查看該鏡像是否已經創建成功了
docker images | grep hello
 
6、運行自己的鏡像,查看是否正常啟動(注: -d:表示在后台運行該鏡像,按ctrl+C不會終止該程序;-p:表示指定本機的訪問端口對應容器的端口)
docker run -d -p 30802:8080 hello
 
7、docker鏡像導出,tar鏡像包可以拷貝到其他機器docker環境中加載
docker save hello -o hello.tar
 
8、docker鏡像加載
docker load -i hello.tar
 
9、測試示例
http://ip:30802/hello
 
二、zip包(SpringBoot項目)鏡像部署
 
1、拉取tomcat鏡像
docker pull java:8
 
2、上傳需要部署的zip包(以hello.zip為例)到自定義的工作目錄下。
 
3、在上個步驟創建的工作目錄下創建Dockerfile文件。將zip包解壓,和Dockerfile文件放在同一目錄下。Dockerfile文件內容如下:
from java:8

 

ENV LANG C.UTF-8

 

ENV TZ=Asia/Shanghai

 

ENV JAVA_OPTS=" -Dspring.config.location=/hello/application.properties"

 

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

 

ADD hello.zip  .

 

RUN unzip hello.zip

 

RUN chmod +x /hello/bin/start.sh

 

RUN chmod +x /hello /bin/stop.sh

 

CMD cd /hello /bin/&&./start.sh
4、創建鏡像(注:-t 表示為該鏡像起名稱,另外,構建命令后面有個英文實心點,表示當前目錄。)
docker build -t hello .
 
5、通過docker images可以看到該鏡像已經創建成功了
docker images | grep hello
 
6、運行自己的鏡像(注: -d:表示在后台運行該鏡像,按ctrl+C不會終止該程序;-p:表示指定本機的端口對應容器中的端口。-it表示以交互模式運行容器並分配偽終端。uap-service項目內置了一個tomcat容器,在其application.properties配置文件中server.port=8080。若設置server.port=xxx,則命令相應位置為30803:xxx)(打開偽終端,進去容器)
docker run -p 30803:8080 hello
 
7、docker鏡像導出,tar鏡像包可以拷貝到其他機器docker環境中加載
docker save hello -o hello.tar
 
8、docker鏡像加載
docker load -i hello.tar
 
9、測試示例
 http://ip:30803/hello
 
三、鏡像部署常用操作
 
查看所有容器
docker ps -a
 
停止容器運行
docker stop {containerID}
 
刪除容器(-f強制刪除,正在運行的容器也刪除)
docker rm -f {containerID}
 
刪除鏡像(-f強制刪除,否則需先停止容器運行才能刪除鏡像)
docker rmi -f hello
 
鏡像打tag(可以用這種方法更新tag)
docker tag hello hello:1.0.0
查看指定鏡像
docker images |grep hello
 
查看指定進程
docker ps | grep hello
 
將鏡像push到鏡像倉庫
docker push xx.xx.xx.xx/hello
 
進入正在運行的容器執行指令(exec命令進入容器再退出后,容器不會停止;attach進入容器再退出后,容器停止)
docker exec -it 0e6d50eb1469(container ID) /bin/bash
docker attach 0e6d50eb1469(container ID)
退出容器
exit / ctrl + c
 
根據容器的狀態,刪除exited狀態的容器
sudo docker rm $(sudo docker ps -qf status=exited)
 
退出容器偽終端
按順序依次ctrl+p,ctrl+q(退出終端不關閉容器)
exit或ctrl+d(退出終端並關閉容器)
CMD
支持三種格式
CMD ["executable","param1","param2"] 使用 exec 執行,推薦方式;
CMD command param1 param2 在 /bin/sh 中執行,提供給需要交互的應用;
CMD ["param1","param2"] 提供給 ENTRYPOINT 的默認參數;
指定啟動容器時執行的命令,每個 Dockerfile 只能有一條 CMD 命令。如果指定了多條命令,只有最后一條會被執行。
如果用戶啟動容器時候指定了運行的命令,則會覆蓋掉 CMD 指定的命令。
ENTRYPOINT 
兩種格式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2(shell中執行)。
配置容器啟動后執行的命令,並且不可被 docker run 提供的參數覆蓋。每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最后一個起效。
 
在容器執行腳本時,注意。當前容器本身是主進程,start.sh的操作是守護進程,必須保證最后一個守護進程處於前台運行狀態,否則容器會在執行腳本完成會自動關閉容器,容器停止運行后,所有的腳本里面的進程也隨之終止。
之所以出現這種現象,究其原因,一個docker容器同時只能管理一個進程,這個進程退出后,容器也就退出了。這並不意味着一個容器里只能同時運行一個進程(那樣太浪費了),只是最后一個運行的進程不能退出。
修改start.sh,保持java命令前台運行,即可避免容器在執行完腳本后exited的情況。start.sh修改如下:
#! /bin/sh

 



APPNAME=com.xx.xx.rest.Application

 

java -Xms2048m -Xmx2048m -classpath $CLASSPATH $APPNAME >/dev/null 2>&1

start.sh總結總結:

(1)容器中運行多個守護進程時,前面的進程要用后台方式運行(或添加 &),否則后面的服務無法啟動。

(2)容器中最后一個守護進程一定要用前台方式運行,否則start.sh退出,容器退出,所有的服務就白啟動了。

我這兒整理了比較全面的JAVA相關的面試資料,


需要領取面試資料的同學,請加群:473984645

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM