1. 程式人生 > 其它 >Docker學習重點(7)~DockerFile

Docker學習重點(7)~DockerFile


一、DockerFile

DockerFile是用來構建docker映象的檔案,可以理解為命令引數指令碼!

1、構建步驟:

  1. 編寫一個dockerfile檔案
  2. docker build 構建成為一個映象
  3. docker run 執行映象
  4. docker push 釋出映象(DockerHub、阿里雲映象倉庫 私有/共有)

2、官方DockerFile示例

  • 看一下官方的DockerFile
  • 可以看到官方映象都是基礎包,很多功能沒有,我們通常會自己搭建自己的映象!

  • 官方既然可以製作映象,我們亦可以



二、DockerFile構建過程

1、DockerFile基礎知識

  1. 每個指令都必須是大寫字母
  2. 按照從上到下順序執行
  3. #表示註釋
  4. 每一個指令都會建立體檢一個新的映象層,並提交

2、Dockerfile、Dockerimages、Docker容器:

  • DockerFile:構建檔案,定義了一切的步驟,原始碼
  • Dockerlmage:通過 DockerFile 構建生成的映象,最終釋出和執行的產品!
  • Docker容器:容器就是映象執行起來提供伺服器



三、DockerFile命令

  • **FROM # 基礎映象 **

  • MAINTAINER # 映象是誰寫的 姓名+郵箱

  • RUN # 映象構建時需要執行的命令

  • ADD # 新增,比如新增一個tomcat壓縮包

  • WORKDIR # 映象的工作目錄

  • VOLUME # 掛載的目錄

  • EXPOSE # 指定暴露埠,跟 -p 一個道理

  • CMD # 指定這個容器啟動的時候要執行的命令,只有最後一個會生效,而且可被替代

  • ENTRYPOINT # 指定這個容器啟動的時候要執行的命令,可以追加命令

  • ONBUILD # 當構建一個被繼承Dockerfile 這個時候執行ONBUILD指定,觸發指令

  • COPY # 將檔案拷貝到映象中

  • ENV # 構建的時候設定環境變數



四、實戰構建自己的centos

Docker Hub中99%的映象都是從FROM scratch開始的


1、建立自己的centos映象的Dockerfile檔案:

  • Dockerfile 檔案的內容:
# 建立一個自己的centos
# 進入home目錄
cd /home
# 建立一個目錄,之後的東西都儲存到這裡
mkdir dockerfile
# 進入這個目錄
cd dockerfile/
# 建立一個dockerfile,名字叫mydockerfile
vim mydockerfile-centos
# 下面給官方centos加上自定義的內容
FROM centos
MAINTAINER padaxing<[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 檔案建立映象

docker build -f dockerfile-centos -t mycentos:0.1 .

3、docker run 啟動容器:

docker run -it mycentos:0.1 # 版本號必須寫,不然他會去找最新的
  • 這時可以看到這些功能都有了:
    • pwd
    • vim
    • ifconfig

4、docker history:檢視docker構建歷史

  • 可以看到當前這個映象是怎麼一步一步構建起來的



五、CMD與ENTRYPOINT

  • 測試cmd
FROM centos
CMD ["ls","-a"] # 啟動centos展示目錄
  • 測試ENTRYPOINT
  • run的時候可以直接加命令:

Docker中許多命令都十分相似,我們需要了解他們的區別,最好的方式就是這樣對比測試



六、實戰Tomcat映象--自定義tomcat環境映象

1、準備映象檔案 tomcat壓縮包,jdk 壓縮包

2、編寫Dockerfile檔案

■ 如果構建檔名為Dockerfile(官方命名),則構建映象時不需要寫構建檔案位置

  • 命名為Dockerfile,build 會自動尋找這個檔案,就不需要-f指定了!
  • Dockerfile 內容:
FROM centos:7
MAINTAINER shan<[email protected]>

ADD jdk-8u301-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.62.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local/
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_301
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.62
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.62
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/lib

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.62/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.62/bin/logs/catalina.out

3、構建映象:

docker build -t diytomcat .

☺ Dockerfile中 RUN yum -y install vim失敗Cannot prepare internal mirrorlist: No URLs in mirrorlist

  • 注意,指明版本,指明centos的版本,FROM centos:7

  • 檢視本地映象是否有構建成功的映象:
docker images

4、啟動映象:執行映象,同時掛載專案目錄和日誌目錄:

docker run -d -p 9090:8080 --name shantomcat -v /home/shan/build/tomcat/test:/usr/local/apache-tomcat-9.0.62/webapps/test -v /home/shan/build/tomcat/tomcatlogs:/usr/local/apache-tomcat-9.0.62/logs diytomcat

5、訪問測試

☺ 報錯:自定義的tomcat映象無法訪問curl: (56) Recv failure: Connection reset by peer

● 列印docker日誌檢視報錯原因:

命令:docker logs docker的id

  • 日誌資訊:

    Tomcat started.
    /usr/local/apache-tomcat-9.0.62/bin/catalina.sh: line 504: /usr/local/jdk1.8.0_301/bin/java: cannot execute binary file

  • 更換jdk,我用錯jdk的型別,應該使用的是jdk-8u301-linux-x64.tar.gz,而我使用的是jdk-8u301-linux-aarch64.tar.gz


6、釋出專案(由於做了卷掛載,我們直接在本地編寫專案就可以進行釋出)

  • 在咱掛載的宿主目錄,test目錄下,新建一個hello.jsp 和 WEB-INF(然後再該目錄下建立web.xml)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
	version="4.0" metadata-complete="false">

</web-app>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
老師好
<%
System.out.println("-----my test web logs");
%>
</body>
</html>
  • 進行訪問測試

☺ 發現:專案部署成功,可以直接訪問ok!

我們以後開發的步驟:需要掌握Dokcerfile的編寫!我們之後的一切都是使用docker映象來發布執行!



七、釋出自己的映象---釋出到Docker Hub 或者 阿里雲

1、釋出到 Docker Hub:

① 在官網Docker Hub 上註冊賬號

② cmd上登入確定這個賬號 docker login

③ 在伺服器上提交自己的映象 docker push

[root@iZwz9535z41cmgcpkm7i81Z test]# docker login --help

Usage:  docker login [OPTIONS] [SERVER]

Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.

Options:
  -p, --password string   Password
      --password-stdin    Take the password from stdin
  -u, --username string   Username
  
  
[root@iZwz9535z41cmgcpkm7i81Z tomcat]# docker login -u yilele
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded  

(1)提交映象 docker push


(2)docker push失敗:denied: requested access to the resource is denied

# push 自己的映象到伺服器上!自己釋出的映象儘量帶上版本號
docker push yilele/diytomcat:1.0
  • 又失敗:

解決:增加一個 tag

  • docker tag 映象id 你的賬戶名/映象倉庫名:tag名
# 失敗
docker push yilele/diytomcat:1.0
# docker tag 映象id(或者是映象名稱) 你的賬戶名/映象倉庫名:tag名
docker tag diytomcat yilele/diytomcat:1.0
docker push yilele/diytomcat:1.0



2、釋出到阿里雲映象

① 登入阿里雲

② 開啟容器映象服務

③ 建立名稱空間

④ 建立容器映象

⑤ 瀏覽一下阿里雲提示的基本資訊

  • 看到公網地址,可以訪問當前倉庫

⑥ 開始推送工作:

(1)登入上阿里雲賬號

(2)增加一個tag(咱在提交到docker hub 就做過啦)

(3)docker push


  • 想要建立名稱空間:先進入個人例項
  • 建立名稱空間:
  • 建立容器映象:
  • 瀏覽一下阿里雲提示的基本資訊:
  • docker push 到阿里雲倉庫發生錯誤:
  • 解決:按照阿里雲提示的基本資訊操作,重新增加一個 tag



☺ 參考來源:
狂神的B站視訊《【狂神說Java】Docker最新超詳細版教程通俗易懂》 https://www.bilibili.com/video/BV1og4y1q7M4



如果本文對你有幫助的話記得給一樂點個贊哦,感謝!