Docker學習重點(7)~DockerFile
一、DockerFile
DockerFile是用來構建docker映象的檔案,可以理解為命令引數指令碼!
1、構建步驟:
- 編寫一個dockerfile檔案
- docker build 構建成為一個映象
- docker run 執行映象
- docker push 釋出映象(DockerHub、阿里雲映象倉庫 私有/共有)
2、官方DockerFile示例
- 看一下官方的DockerFile
-
可以看到官方映象都是基礎包,很多功能沒有,我們通常會自己搭建自己的映象!
-
官方既然可以製作映象,我們亦可以
二、DockerFile構建過程
1、DockerFile基礎知識
- 每個指令都必須是大寫字母
- 按照從上到下順序執行
- #表示註釋
- 每一個指令都會建立體檢一個新的映象層,並提交
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 地址:https://hub.docker.com/
① 在官網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
如果本文對你有幫助的話記得給一樂點個贊哦,感謝!