Dockerfile是用來建構Docker映像的文字文件,是由一條條建構鏡像所需的指令和參數所構成的腳本。
1:每個保留字指令都必須為大寫字母
且後面要跟隨至少一個參數
2:指令按照從上到下,順序執行
3:#表示註解
4:每個指令都會建立一個新的映像層並對映像進行提交
(1)docker從基礎映像執行一個容器
(2)執行一條指令並對容器作出修改
(3)執行類似docker commit的操作提交一個新的映像層
(4 )docker再基於剛提交的映像運行一個新容器
(5)執行dockerfile中的下一指令直到所有指令都執行完成
從應用軟體的角度來看,Dockerfile、Docker映像與Docker容器分別代表軟體的三個不同階段,
Dockerfile是軟體的原料
Docker鏡像是軟體的交付品
#Docker容器則可以認為是軟體映像的運行態,也即依照映像運行的容器實例
Dockerfile面向開發,Docker映像成為交付標準,Docker容器則涉及部署與維,三者缺一不可,合力充當Docker體系的基石。
1 Dockerfile,需要定義一個Dockerfile,Dockerfile定義了流程所需的一切。 Dockerfile涉及的內容包括執行程式碼或檔案、環境變數、依賴套件、執行階段環境、動態連結庫、作業系統的發行版、服務行程和核心行程(當應用程式需要和系統服務和核心行程打交道,這時需要考慮如何設計namespace的權限控制)等等;
2 Docker映像,在用Dockerfile定義一個檔案之後,docker build時會產生一個Docker映像,當執行Docker映像時會真正開始提供服務;
3 Docker容器,容器是直接提供服務的。
基本建置步驟:(1)編寫Dockerfile檔案(2)docker build指令建構映像(3)docker run依映像運行容器實例
基礎鏡像,目前新鏡像是基於哪個鏡像的,指定一個已經存在的鏡像作為模板,第一個命令必須是FROM
# 命令格式 FROM [--platform=<platform>] <image> [AS <name>] FROM [--platform=<platform>] <image>[:<tag>] [AS <name>] FROM [--platform=<platform>] <image>[@<digest>] [AS <name>] # 实例: FROM centos:7.0
鏡像維護者的姓名和郵件地址
# 命令格式 MAINTAINER <name>
該指令已經廢棄了。建議使用LABEL,它可以設定您需要的任何元資料。
# 命令格式 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."
容器建置時需要執行的指令,RUN是在docker build時執行
(1)shell格式(常用)
# <命令行命令> 等同于,在终端操作的shell命令 RUN <命令行命令>
(2)exec格式
# 录入:RUN ["./test.php", "dev", "offline"] 等价于RUN ./test.php dev offline RUN ["可执行文件", "param1", "param2"]
目前容器對外暴露出的連接埠
EXPOSE 80 EXPOSE 80/tcp EXPOSE 80/udp
#指定在建立容器後,終端預設登陸的進來工作目錄,一個落腳點
WORKDIR /path/to/workdir
指定該映像以什麼樣的使用者去執行,如果都不指定,預設是root
# 命令格式 USER <user>[:<group>] USER <UID>[:<GID>] # 实例 USER cxf
用於在建構鏡像過程中設定環境變數
# 命令格式 ENV <key>=<value> ... # 实例 ENV MY_PATH /usr/mytest #这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;也可以在其它指令中直接使用这些环境变量, #比如:WORKDIR $MY_PATH
將宿主機目錄下的檔案拷貝進鏡像且會自動處理URL和解壓tar壓縮包
ADD a.tar.gz /mydir/
#類似ADD,拷貝檔案和目錄到鏡像中。
將從建置上下文目錄中<來源路徑> 的檔案/目錄複製到新的一層的映像內的<目標路徑> 位置
COPY src dest COPY ["src", "dest"] <src源路径>:源文件或者源目录 <dest目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
容器資料卷,用於資料保存和持久化工作
指定容器啟動後的要乾的事情
注意! Dockerfile 中可以有多個 CMD 指令,但只有最後一個生效,CMD 會被 docker run 之後的參數取代
CMD ["executable","param1","param2"] CMD ["param1","param2"] CMD command param1 param2 # 覆盖默认的CMD,不会启动tomcat docker exec -it comcat /bin/bash
CMD是在docker run 時執行。 RUN是在 docker build時運行。
也是用來指定一個容器啟動時要執行的指令。
類似於CMD 指令,但是ENTRYPOINT不會被docker run後面的指令覆寫
,而且這些指令列參數會被當作參數送給ENTRYPOINT 指令指定的程式
# 命令格式 ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2
ENTRYPOINT可以和CMD一起用,一般是變參才會使用CMD ,這裡的CMD 等於是在給ENTRYPOINT 傳參。
當指定了ENTRYPOINT後,CMD的含義就發生了變化,不再是直接運行其命令而是將CMD的內容作為參數傳遞給ENTRYPOINT指令,他兩個組合會變成:
FROM ubuntu ENTRYPOINT ["top", "-b"] # 定参 CMD ["-c"] # 变参 # 最终执行top -c,而如果使用命令行指定 -H,会替换CMD的-c
在執行docker run的時候可以指定ENTRYPOINT 運行所需的參數。如果 Dockerfile 中如果存在多個 ENTRYPOINT 指令,僅最後一個生效。
# 注意大写字母D vi Dockerfile
# 指定基础镜像,需要保证本地有这个镜像 FROM centos # 指定作者邮箱 MAINTAINER cxf # 工作目录 ENV MYPATH /usr/local WORKDIR $MYPATH # 准备工作 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命令查看网络IP RUN yum -y install net-tools #安装java8及lib库 RUN yum -y install glibc.i686 RUN mkdir /usr/local/java #ADD 是相对路径jar,把jdk-8u351-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置 ADD jdk-8u351-linux-x64.tar.gz /usr/local/java/ #配置java环境变量 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
注意!本目录下只有一个Dockerfile并且包含jdk安装包
# 构建新镜像命令格式 。注意,上面TAG后面有个空格,有个点 docker build -t 新镜像名字:TAG . # 构建我们的镜像,等一会就会构建成功 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
docker run -it 4dbff0755585 /bin/bash #我们发现,新的镜像携带着vim、ifconfig和java环境了!
仓库名、标签都是
(1)创建Dockerfile
FROM centos CMD echo 'action is success'
(2)构建
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
虚悬镜像已经失去存在价值,可以删除
编写一个测试Controller,以供测试。
@RestController @RequestMapping public class TestController { @GetMapping("/test") public String test(){ return "启动成功 ===================test"; } }
我们使用maven package命令手动打包并上传到服务器上。
[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自动构建。
# 基础镜像使用java FROM centosjava8:1.0 # 作者 MAINTAINER cxf # VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp VOLUME /tmp # 将jar包添加到容器中并更名为cxf_docker.jar ADD demo-0.0.1-SNAPSHOT.jar /cxf_docker.jar # 运行jar包 RUN bash -c 'touch /cxf_docker.jar' ENTRYPOINT ["java","-jar","/cxf_docker.jar"] #暴露6001端口作为微服务 EXPOSE 8088
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
docker run -d -p 8088:8088 7124eca083ad
访问服务器我们的接口,发现测试成功!
以上是怎麼使用dockerfile部署springboot項目的詳細內容。更多資訊請關注PHP中文網其他相關文章!