目錄
- 一、dockerfile概述
- 1、dockerfile基礎(chǔ)
- 2、Docker執(zhí)行Dockerfile的大致流程
- 3、鏡像、容器、dockerfile的關(guān)系
- 二、dockerfile常用保留字
- 1、FROM
- 2、MAINTAINER與LABEL
- 3、RUN
- 4、EXPOSE
- 5、WORKDIR
- 6、USER
- 7、ENV
- 8、ADD
- 9、COPY
- 10、VOLUME
- 11、CMD
- 12、ENTRYPOINT
- 三、使用dockerfile構(gòu)建一個自帶jdk的centos
- 1、下載jdk并上傳至linux
- 2、編寫Dockerfile
- 3、構(gòu)建Dockerfile
- 4、運(yùn)行一下試試
- 四、虛懸鏡像
- 1、制造一個虛懸鏡像
- 五、docker運(yùn)行springboot項(xiàng)目
- 1、準(zhǔn)備一個springboot項(xiàng)目
- 2、手動構(gòu)建jar包
- 3、編寫Dockerfile
- 4、構(gòu)建鏡像
- 5、運(yùn)行容器
- 6、訪問測試
一、dockerfile概述
Dockerfile是用來構(gòu)建Docker鏡像的文本文件,是由一條條構(gòu)建鏡像所需的指令和參數(shù)構(gòu)成的腳本。
官網(wǎng):https://docs.docker.com/engine/reference/builder/
1、dockerfile基礎(chǔ)
1:每條保留字指令都必須為大寫字母
且后面要跟隨至少一個參數(shù)
2:指令按照從上到下,順序執(zhí)行
3:#表示注釋
4:每條指令都會創(chuàng)建一個新的鏡像層并對鏡像進(jìn)行提交
2、Docker執(zhí)行Dockerfile的大致流程
(1)docker從基礎(chǔ)鏡像運(yùn)行一個容器
(2)執(zhí)行一條指令并對容器作出修改
(3)執(zhí)行類似docker commit的操作提交一個新的鏡像層
(4)docker再基于剛提交的鏡像運(yùn)行一個新容器
(5)執(zhí)行dockerfile中的下一條指令直到所有指令都執(zhí)行完成
3、鏡像、容器、dockerfile的關(guān)系
從應(yīng)用軟件的角度來看,Dockerfile、Docker鏡像與Docker容器分別代表軟件的三個不同階段,
- Dockerfile是軟件的原材料
- Docker鏡像是軟件的交付品
- Docker容器則可以認(rèn)為是軟件鏡像的運(yùn)行態(tài),也即依照鏡像運(yùn)行的容器實(shí)例
Dockerfile面向開發(fā),Docker鏡像成為交付標(biāo)準(zhǔn),Docker容器則涉及部署與運(yùn)維,三者缺一不可,合力充當(dāng)Docker體系的基石。
1 Dockerfile,需要定義一個Dockerfile,Dockerfile定義了進(jìn)程需要的一切東西。Dockerfile涉及的內(nèi)容包括執(zhí)行代碼或者是文件、環(huán)境變量、依賴包、運(yùn)行時環(huán)境、動態(tài)鏈接庫、操作系統(tǒng)的發(fā)行版、服務(wù)進(jìn)程和內(nèi)核進(jìn)程(當(dāng)應(yīng)用進(jìn)程需要和系統(tǒng)服務(wù)和內(nèi)核進(jìn)程打交道,這時需要考慮如何設(shè)計namespace的權(quán)限控制)等等;
2 Docker鏡像,在用Dockerfile定義一個文件之后,docker build時會產(chǎn)生一個Docker鏡像,當(dāng)運(yùn)行 Docker鏡像時會真正開始提供服務(wù);
3 Docker容器,容器是直接提供服務(wù)的。
基本構(gòu)建步驟:(1)編寫Dockerfile文件(2)docker build命令構(gòu)建鏡像(3)docker run依鏡像運(yùn)行容器實(shí)例
二、dockerfile常用保留字
1、FROM
基礎(chǔ)鏡像,當(dāng)前新鏡像是基于哪個鏡像的,指定一個已經(jīng)存在的鏡像作為模板,第一條命令必須是FROM
# 命令格式 FROM [--platform=<platform>] <image> [AS <name>] FROM [--platform=<platform>] <image>[:<tag>] [AS <name>] FROM [--platform=<platform>] <image>[@<digest>] [AS <name>] # 實(shí)例: FROM centos:7.0
2、MAINTAINER與LABEL
鏡像維護(hù)者的姓名和郵箱地址
# 命令格式 MAINTAINER <name>
該命令已經(jīng)廢棄了。推薦使用LABEL,它可以設(shè)置您需要的任何元數(shù)據(jù)。
# 命令格式 LABEL <key>=<value> <key>=<value> <key>=<value> ... LABEL "com.example.vendor"="ACME Incorporated" LABEL com.example.label-with-value="foo" LABEL version="1.0" LABEL description="This text illustrates \ that label-values can span multiple lines."
3、RUN
容器構(gòu)建時需要運(yùn)行的命令,RUN是在 docker build時運(yùn)行
(1)shell格式(常用)
# <命令行命令> 等同于,在終端操作的shell命令 RUN <命令行命令>
(2)exec格式
# 錄入:RUN ["./test.php", "dev", "offline"] 等價于RUN ./test.php dev offline RUN ["可執(zhí)行文件", "param1", "param2"]
4、EXPOSE
當(dāng)前容器對外暴露出的端口
EXPOSE 80 EXPOSE 80/tcp EXPOSE 80/udp
5、WORKDIR
指定在創(chuàng)建容器后,終端默認(rèn)登陸的進(jìn)來工作目錄,一個落腳點(diǎn)
WORKDIR /path/to/workdir
6、USER
指定該鏡像以什么樣的用戶去執(zhí)行,如果都不指定,默認(rèn)是root
# 命令格式 USER <user>[:<group>] USER <UID>[:<GID>] # 實(shí)例 USER cxf
7、ENV
用來在構(gòu)建鏡像過程中設(shè)置環(huán)境變量
# 命令格式 ENV <key>=<value> ... # 實(shí)例 ENV MY_PATH /usr/mytest #這個環(huán)境變量可以在后續(xù)的任何RUN指令中使用,這就如同在命令前面指定了環(huán)境變量前綴一樣;也可以在其它指令中直接使用這些環(huán)境變量, #比如:WORKDIR $MY_PATH
8、ADD
將宿主機(jī)目錄下的文件拷貝進(jìn)鏡像且會自動處理URL和解壓tar壓縮包
ADD a.tar.gz /mydir/
9、COPY
類似ADD,拷貝文件和目錄到鏡像中。
將從構(gòu)建上下文目錄中 <源路徑> 的文件/目錄復(fù)制到新的一層的鏡像內(nèi)的 <目標(biāo)路徑> 位置
COPY src dest COPY ["src", "dest"] <src源路徑>:源文件或者源目錄 <dest目標(biāo)路徑>:容器內(nèi)的指定路徑,該路徑不用事先建好,路徑不存在的話,會自動創(chuàng)建。
10、VOLUME
容器數(shù)據(jù)卷,用于數(shù)據(jù)保存和持久化工作
11、CMD
指定容器啟動后的要干的事情
注意!Dockerfile 中可以有多個 CMD 指令,但只有最后一個生效,CMD 會被 docker run 之后的參數(shù)替換
CMD ["executable","param1","param2"] CMD ["param1","param2"] CMD command param1 param2 # 覆蓋默認(rèn)的CMD,不會啟動tomcat docker exec -it comcat /bin/bash
CMD是在docker run 時運(yùn)行。RUN是在 docker build時運(yùn)行。
12、ENTRYPOINT
也是用來指定一個容器啟動時要運(yùn)行的命令。
類似于 CMD 指令,但是ENTRYPOINT不會被docker run后面的命令覆蓋
,而且這些命令行參數(shù)會被當(dāng)作參數(shù)送給 ENTRYPOINT 指令指定的程序
# 命令格式 ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2
ENTRYPOINT可以和CMD一起用,一般是變參才會使用 CMD ,這里的 CMD 等于是在給 ENTRYPOINT 傳參。
當(dāng)指定了ENTRYPOINT后,CMD的含義就發(fā)生了變化,不再是直接運(yùn)行其命令而是將CMD的內(nèi)容作為參數(shù)傳遞給ENTRYPOINT指令,他兩個組合會變成:<ENTRYPOINT> “<CMD>”
FROM ubuntu ENTRYPOINT ["top", "-b"] # 定參 CMD ["-c"] # 變參 # 最終執(zhí)行top -c,而如果使用命令行指定 -H,會替換CMD的-c
在執(zhí)行docker run的時候可以指定 ENTRYPOINT 運(yùn)行所需的參數(shù)。如果 Dockerfile 中如果存在多個 ENTRYPOINT 指令,僅最后一個生效。
三、使用dockerfile構(gòu)建一個自帶jdk的centos
1、下載jdk并上傳至linux
java8下載地址:https://www.oracle.com/java/technologies/downloads/#java8
2、編寫Dockerfile
# 注意大寫字母D vi Dockerfile
# 指定基礎(chǔ)鏡像,需要保證本地有這個鏡像 FROM centos # 指定作者郵箱 MAINTAINER cxf # 工作目錄 ENV MYPATH /usr/local WORKDIR $MYPATH # 準(zhǔn)備工作 RUN cd /etc/yum.repos.d/ RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-* RUN yum makecache RUN cd /usr/local #安裝vim編輯器 RUN yum -y install vim #安裝ifconfig命令查看網(wǎng)絡(luò)IP RUN yum -y install net-tools #安裝java8及l(fā)ib庫 RUN yum -y install glibc.i686 RUN mkdir /usr/local/java #ADD 是相對路徑j(luò)ar,把jdk-8u351-linux-x64.tar.gz添加到容器中,安裝包必須要和Dockerfile文件在同一位置 ADD jdk-8u351-linux-x64.tar.gz /usr/local/java/ #配置java環(huán)境變量 ENV JAVA_HOME /usr/local/java/jdk1.8.0_351 ENV JRE_HOME $JAVA_HOME/jre ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH ENV PATH $JAVA_HOME/bin:$PATH EXPOSE 80 CMD echo $MYPATH CMD echo "success--------------ok" CMD /bin/bash
3、構(gòu)建Dockerfile
注意!本目錄下只有一個Dockerfile并且包含jdk安裝包
# 構(gòu)建新鏡像命令格式 。注意,上面TAG后面有個空格,有個點(diǎn) docker build -t 新鏡像名字:TAG . # 構(gòu)建我們的鏡像,等一會就會構(gòu)建成功 docker build -t centosjava8:1.0 . [root@localhost myfile]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centosjava8 1.0 4dbff0755585 34 seconds ago 747MB centos latest 5d0da3dc9764 19 months ago 231MB
4、運(yùn)行一下試試
docker run -it 4dbff0755585 /bin/bash #我們發(fā)現(xiàn),新的鏡像攜帶著vim、ifconfig和java環(huán)境了!
四、虛懸鏡像
倉庫名、標(biāo)簽都是<none>的鏡像,俗稱dangling image
1、制造一個虛懸鏡像
(1)創(chuàng)建Dockerfile
FROM centos CMD echo 'action is success'
(2)構(gòu)建
docker build .
(3)查看
[root@localhost xu]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centosjava8 1.0 4dbff0755585 31 minutes ago 747MB <none> <none> 9818ccf3738e 19 months ago 231MB centos latest 5d0da3dc9764 19 months ago 231MB # 查看所有虛懸鏡像 [root@localhost xu]# docker image ls -f dangling=true REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 9818ccf3738e 19 months ago 231MB
(4)刪除
# 刪除虛懸鏡像 docker image prune
虛懸鏡像已經(jīng)失去存在價值,可以刪除
五、docker運(yùn)行springboot項(xiàng)目
1、準(zhǔn)備一個springboot項(xiàng)目
編寫一個測試Controller,以供測試。
@RestController @RequestMapping public class TestController { @GetMapping("/test") public String test(){ return "啟動成功 ===================test"; } }
2、手動構(gòu)建jar包
我們使用maven package命令手動打包并上傳到服務(wù)器上。
[root@localhost ~]# cd mydocker/ [root@localhost mydocker]# ll total 17084 -rw-r--r--. 1 root root 17491177 Apr 9 14:18 demo-0.0.1-SNAPSHOT.jar
注!通常來說這一步可以使用jenkins自動構(gòu)建。
3、編寫Dockerfile
# 基礎(chǔ)鏡像使用java FROM centosjava8:1.0 # 作者 MAINTAINER cxf # VOLUME 指定臨時文件目錄為/tmp,在主機(jī)/var/lib/docker目錄下創(chuàng)建了一個臨時文件并鏈接到容器的/tmp VOLUME /tmp # 將jar包添加到容器中并更名為cxf_docker.jar ADD demo-0.0.1-SNAPSHOT.jar /cxf_docker.jar # 運(yùn)行jar包 RUN bash -c 'touch /cxf_docker.jar' ENTRYPOINT ["java","-jar","/cxf_docker.jar"] #暴露6001端口作為微服務(wù) EXPOSE 8088
4、構(gòu)建鏡像
docker build -t mydemo:1.0 . [root@localhost mydocker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mydemo 1.0 7124eca083ad 26 seconds ago 764MB centosjava8 1.0 4dbff0755585 7 hours ago 747MB
5、運(yùn)行容器
docker run -d -p 8088:8088 7124eca083ad
6、訪問測試
訪問服務(wù)器我們的接口,發(fā)現(xiàn)測試成功!