Dockerfile簡介
Dcokerfile是一個文本格式的配置文件,由一系列命令和參數(shù)構(gòu)建的腳本,用戶可通過這個快速構(gòu)建自定義的鏡像
? 官方倉庫dockerhub和一些鏡像倉庫已經(jīng)提供大量的鏡像,但有些時候不能滿足我們的需求,例如安裝一些安裝比較少的第三方軟件,或自定義的項目,這個時候只能先用公共倉庫鏡像,啟動容器,然后在容器中按照我們的需求安裝軟件,修改配置等等操作,之后提交鏡像等等。。。
? 這種方式顯得比較臃腫,Dockerfile為自動化創(chuàng)建部署鏡像提供了解決方案。
Dockerfile基本結(jié)構(gòu)
基礎(chǔ)鏡像信息:以哪個鏡像作為基礎(chǔ)進(jìn)行制作,用法是FROM 基礎(chǔ)鏡像名稱
維護(hù)者信息:指定維護(hù)者信息,用法是MANITAINER 名字/郵箱
鏡像操作命令:對基礎(chǔ)鏡像要進(jìn)行的改造命令,比如安裝新的軟件,進(jìn)行特殊配置等,使用run命令
容器啟動執(zhí)行命令:當(dāng)基于該鏡像的容器啟動時需要執(zhí)行哪些命令,常見的是CMD、ENTRYPOINT命令
幾個重要參數(shù)
ENTRYPOINT,表示鏡像在初始化時需要執(zhí)行的命令,不可被重寫覆蓋
ENTRYPOINT/CMD都只能在文件中存在一次,并且最后一個生效 多個存在,只有最后一個生效,其它無效!
CMD,表示鏡像運行默認(rèn)參數(shù),可被重寫覆蓋
copy與add的區(qū)別
copy:能夠?qū)?gòu)建命令所在的主機(jī)本地的文件或目錄,復(fù)制到鏡像文件系統(tǒng)
add:不僅能將構(gòu)建命令所在的主機(jī)和目錄,還能將遠(yuǎn)程url對應(yīng)的文件或目錄作為資源復(fù)制到鏡像文件系統(tǒng)。如果是壓縮文件如tar還會幫忙解壓
若需要初始化多個命令,彼此可使用&&隔開
很形象的一張圖
來自簡書app
#創(chuàng)建dockerfile文件
touch dockerfile
#與mkdir的區(qū)別 touch能更新文件時間戳,如果不存在可新建文件(file),mkdir則只是新建目錄(folder)
#如果filename存在,使用touch指令可更改這個文件或目錄的日期時間,包括存取時間和更改時間
#如果filename不存在,touch指令會在當(dāng)前目錄下新建一個filename空白文件
需注意的地方
在Docker daemon(守護(hù)進(jìn)程)模式下,無論你是使用ENTRYPOINT,還是CMD,最后的命令,一定要是當(dāng)前進(jìn)程需要一直運行的,才能夠防容器退出,例如
#以下兩種方式運行幾秒鐘之后,容器就會退出
ENTRYPOINT service tomcat8 start
CMD service tomcat8 start
#以下方式容器不會自動退出
ENTRYPOINT service tomcat8 start && tail -f /var/lib/tomcat8/logs/catalina.out
CMD service tomcat8 start && tail -f /var/lib/tomcat8/logs/catalina.out
如創(chuàng)建包含jdk的ubuntu基礎(chǔ)鏡像不從本地獲取 而在容器內(nèi)apt-get安裝,例如
FROM ubuntu:14.04
MAINTAINER mhy "641084049@qq.com"
RUN apt-get update
RUN apt-get install -y -q openjdk-7-jdk
WORKDIR /
ENV JAVA_HOME /usr/lib/jvm/java-7-openjdk-amd64
CMD ["/bin/bash"]
定制簡單的dockerfile并運行完整例子
(這邊我用已有的會比較快點,實際應(yīng)用環(huán)境在容器內(nèi)下載,從宿主機(jī)copy或add都有可能用到)
#基礎(chǔ)鏡像
FROM ubuntu:latest
#維護(hù)者信息
MAINTAINER Garwer
#將壓縮好的jdk1.8.0_171 命名為jdk8 并配置環(huán)境 (tomcat同理)
COPY jdk1.8.0_171 /usr/local/jdk8/
COPY apache-tomcat-9.0.7 /usr/local/tomcat9/
ENV JAVA_HOME /usr/local/jdk8
ENV PATH $JAVA_HOME/bin:$PATH
ENV CATALINA_BASE /usr/local/tomcat9
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
ENTRYPOINT /usr/local/tomcat9/bin/startup.sh&&tail -F /usr/local/tomcat9/logs/catalina.out
文件結(jié)構(gòu)
構(gòu)建并運行
#在Dockerfile目錄下構(gòu)建鏡像 并自定義 鏡像名:標(biāo)簽 需注意后面有個.
docker build -t="ubuntu_web:v1" .
#啟動鏡像
docker run -d -t -i -p 8080:8080 ubuntu_web:v1
進(jìn)入容器并測試本地運行
遠(yuǎn)程訪問公網(wǎng)ip測試
2.定制dockerfile,使用springboot項目,導(dǎo)成jar包在ubuntu容器內(nèi)運行的鏡像
#springboot內(nèi)嵌tomcat,例如在本地運行java -jar xxx
java -jar docker.jar
#后臺運行 后面加& 這種方式缺點是窗口關(guān)閉程序中止
java -jar docker.jar &
#不掛斷運行命令 退出或終端關(guān)閉仍然運行 缺點:當(dāng)用 nohup 命令執(zhí)行作業(yè)時,缺省情況下該作業(yè)的所有輸出被重定向到nohup.out的文件中,除非另外指定了輸出文件
nohup java -jar docker.jar &
#指定輸出文件運行jar 輸出內(nèi)容不打印到屏幕上 將輸出pid 日志文件在自定義新生成的out.log查看
nohup java -jar docker.jar >out.log &
#根據(jù)不同的啟動方式CTRL+c或者殺進(jìn)程來關(guān)閉服務(wù)
運行springboot項目導(dǎo)出的jar包
現(xiàn)在將jar包遠(yuǎn)程到裝有docker的宿主機(jī)上,再導(dǎo)入到容器中,測試運行,編寫dockerfile定制鏡像,測試運行
大致步驟
1.將jar包傳到服務(wù)器上,新建一個目錄
2.跟前一個dockerfile大致相同 不過路徑要做相應(yīng)調(diào)整,編寫dockerfile
3.構(gòu)建鏡像并運行
#構(gòu)建鏡像
docker build -t="ubuntu_springboot:v1" .
#啟動鏡像
docker run -d -t -i -p 8080:8080 ubuntu_springboot:v1
#相比于上個dockerfile 因為jar包自帶tomcat省掉了tomcat的配置
FROM ubuntu:latest
MAINTAINER Garwer
COPY jdk1.8.0_171 /usr/local/jdk8/
ENV JAVA_HOME /usr/local/jdk8
ENV PATH $JAVA_HOME/bin:$PATH
#ENV CATALINA_BASE /usr/local/tomcat9
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
ADD docker.jar app.jar
EXPOSE 8080
#運行這個jar -jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
成功運行并通過公網(wǎng)訪問