Docker 學習之 DockerFile

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 小結

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章