DockerFile 介紹
dockerfile 是用來構建 docker 鏡像的文件!命令參數腳本!
構建步驟:
1、編寫一個 dockerflie 文件
2、docker build 構建成爲一個鏡像
3、docker run 運行鏡像
4、docker push 發佈鏡像(DockerHub、阿里雲鏡像倉庫)
查看一下官方是怎麼做到的!
很多官方鏡像都是基礎包,很多功能沒有,我們通常會自己搭建自己的鏡像!
官方既然可以製作鏡像,那我們也是可以的!
DockerFile 構建過程
基礎知識
1、每個保留關鍵字(指令)都必須是大寫字母
2、指令從上到下順序執行
3、# 表示註釋
4、每個指令都會創建一個新的鏡像層,並提交!
dockerfile 是面向開發的,我們以後要發佈項目,作鏡像,就需要編寫 dockerfile 文件,這個文件十分簡單!
Docker 鏡像逐漸成爲企業交付的標準,必須要掌握!
步驟:開發,部署,運維。。。缺一不可!
DockerFile:構建文件,定義了一切步驟,源代碼
DockerImages:通過 DockerFile 構建生成的鏡像,最終發佈和運行的產品!
Docker 容器:容器就是鏡像運行起來提供的服務器
DockerFile 的指令
FROM # 基礎鏡像,一切從這裏開始構建
MAINTAINER # 鏡像是誰寫的,姓名 + 郵箱
RUN # 鏡像構建的時候需要運行的命令
ADD # 步驟:tomcat 鏡像,這個 tomcat 壓縮包!添加內容
WROKDIR # 鏡像的工作目錄
VOLUME # 掛載的目錄
EXPOSE # 暴露端口,等同於啓動時的 —p
CMD # 指定這個容器啓動的時候需要運行的命令,只有最後一個會生效,而且會被替代
ENTRYPOINT # 指定這個容器啓動的時候需要運行的命令,可以追加命令
ONBUILD # 當構建一個被繼承 DockerFile 這個時候就會運行 ONBUILD 的指令。觸發指令!
COPY # 類似 ADD ,將我們的文件拷貝到鏡像中
ENV # 構建的時候設置環境變量
實戰:Centos 鏡像
Docker Hub 中 99% 的鏡像都是從這個基礎鏡像過來的 FROM scratch ,然後配置需要的軟件和配置來進行構建
創建一個自己的 centos
# 1、編寫 DockerFile 的文件
[root@zhujixiang dockerfile]# cat mydockerfile-centos
FROM centosq
MAINTAINER zhujixiang<[email protected]>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash
# 2、通過這個文件構建鏡像
# 命令 docker build -f dockerfile文件路徑 -t 鏡像名:[tag] .
Successfully built 5805b43e8e4f
Successfully tagged mycentos:0.1
# 3、測試運行
對比:
之前的原生 centos
我們增加之後的鏡像
我們可以列出本地鏡像的變更歷史
所以說平時拿到一個鏡像就可以研究一下它是怎麼做的了!
CMD 和 ENTRYPOINT 的區別
CMD # 指定這個容器啓動的時候需要運行的命令,只有最後一個會生效,而且會被替代
ENTRYPOINT # 指定這個容器啓動的時候需要運行的命令,可以追加命令
- 測試 CMD
# 1、編寫 dockerfile 文件
[root@zhujixiang dockerfile]# vim dockerfile-cmd-test
[root@zhujixiang dockerfile]# cat dockerfile-cmd-test
FROM centos
CMD ["ls","-a"]
# 2、構建鏡像
[root@zhujixiang dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest .
# 3、run 運行,發現我們的 ls-a 命令生效了
[root@zhujixiang dockerfile]# docker run 03d33d6fd9c5
.
..
.dockerenv
bin
dev
etc
# 想追加一個命令 -l 期望:ls -al
[root@zhujixiang dockerfile]# docker run 03d33d6fd9c5 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.
# 使用CMD的情況下,-l 替換了 CMD ["ls","-a"] 命令,-l 不是命令,所以報錯
- 測試 ENTRYPOINT
[root@zhujixiang dockerfile]# vim dockerfile-cmd-entrypoint
[root@zhujixiang dockerfile]# cat dockerfile-cmd-entrypoint
FROM centos
ENTRYPOINT ["ls","-a"]
[root@zhujixiang dockerfile]# docker build -f dockerfile-cmd-entrypoint -t entrypoint-test .
Successfully built 835aa6cdf338
Successfully tagged entrypoint-test:latest
[root@zhujixiang dockerfile]# docker run 835aa6cdf338
.
..
.dockerenv
bin
dev
etc
# 我們的追加命令,是直接追加在 ENTRYPOINT 後面的
[root@zhujixiang dockerfile]# docker run 835aa6cdf338 -l
total 0
drwxr-xr-x 1 root root 6 Jun 11 07:57 .
drwxr-xr-x 1 root root 6 Jun 11 07:57 ..
-rwxr-xr-x 1 root root 0 Jun 11 07:57 .dockerenv
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
DockerFile 中有很多命令都十分相似,我們需要了解它們的區別,最好的方法就是對比他們的測試結果!
實戰:Tomcat 鏡像
1、準備鏡像文件 tomcat 壓縮包,jdk 的壓縮包!
2、編寫 dockerfile 文件,官方命令 Dockerfile
,build 會自動尋找這個文件,就不需要 -f 指定了!
FROM centos
MAINTAINER zhujixiang<[email protected]>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u11-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.20.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JVAV_HOME/lib/dt.jar:$JVAV_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.20
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.20
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINT_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.20/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.20/bin/logs/catalina.out
3、構建鏡像
# docker build -t diytomcat .
4、啓動鏡像
docker run -d -p 9090:8080 --name zhujixiangtomcat -v /home/zhujixiang/build/tomcat/test:/usr/local/apache-tomcat-9.0.20/webapps/test -v /home/zhujixiang/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.20/logs diytomcat
5、訪問測試
curl localhost:9090
或者外網直接訪問
6、發佈項目(由於做了卷掛載,我們直接在本地編寫項目就可以發佈了!)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
</web-app>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>henllo,zhujixiang</title>
</head>
<body>
Hello World!<br/>
</body>
</html>
項目發佈成功,可以直接訪問!
我們以後的開發步驟:需要掌握 DockerFile 的編寫!我們之後的一切都是使用 docker 鏡像來發布運行!
Docker 小結