Docker進階(二)Dockerfile——映象構建
阿新 • • 發佈:2021-12-12
Dockerfile的組成
構建docker映象的檔案,命令+引數+指令碼 步驟- 編寫一個dockerfile檔案
- docker build 構建成一個映象
- docker run執行映象
- docker push釋出映象至DockerHub或阿里雲映象倉庫
FROM scratch ADD centos-7-x86_64-docker.tar.xz / LABEL \ org.label-schema.schema-version="官方的映象一般是基礎包,只要能跑起來即可,很多功能是沒有的,所以一般都是自己搭建映象(使用docker指令) 實際工作中,docker映象甚至是交付的標準,專案做好之後必須打包成docker映象來交付: 原則:1.0" \ org.label-schema.name="CentOS Base Image" \ org.label-schema.vendor="CentOS" \ org.label-schema.license="GPLv2" \ org.label-schema.build-date="20201113" \ org.opencontainers.image.title="CentOS Base Image" \ org.opencontainers.image.vendor="CentOS" \ org.opencontainers.image.licenses="GPL-2.0-only" \ org.opencontainers.image.created="2020-11-13 00:00:00+00:00" CMD ["/bin/bash"]
- 指令是大寫字母
- 執行順序從上至下,每個指令都會建立提交一個新的映象層
Docker指令
FROM #基礎映象,一切從這裡開始構建 MAINTAINER #映象的署名和聯絡方式 RUN #映象構建時需要執行的命令 ADD #新增內容,原始檔可以是相對路徑,可以是url,特可以是tar.gz檔案(會自動解壓) WORKDIR #映象的工作目錄 VOLUME #掛載的目錄 EXPOSE #保留埠配置,開啟後外部無需使用-p CMD #指定這個容器啟動的時候要執行的命令,只有最後一個會生效,可被替代 ENTRYPOINT #指定這個容器啟動的時候要執行的命令,可以追加命令 ONBUILD #當構建一個被繼承 DockerFile 這個時候就會執行ONBUILD的指令 ,觸發指令 COPY #類似ADD,將檔案拷貝至映象中,格式:COPY 源目標 目的目標。多個命令使用&&拼接 ENV #構建的時候設定環境變數備註:CMD與ENTRYPOINT的區別 當一個映象使用CMD指定容器啟動後執行的命令時,只有最後一個會真實生效,並且當從外部啟動時新增了額外的命令時,CMD的命令會被替代。如:構建映象時使用了CMD ['ls', '-a'],啟動容器後會自動列印當前目錄列表,但如果啟動時額外加了引數 -l,這時的-l並不會和ls -a合併成新命令,而是替代ls -a作為新命令。但-l並非完整命令,所以當容器啟動時就會報錯
當一個映象使用ENTRYPOINT指定容器啟動後執行的命令時,在外部啟動容器時可以追加命令,拿上面的例子說,如果構建時使用ENTRYPOINT ['ls', '-a'],外部啟動時額外加了-l,則這裡的-l會和映象自帶的ls -a合併成完整命令ls -al
配置帶vim 和ifconfig的CentOS
手動配置映象,一般從scratch開始(dockerhub中99%的映象從這個基礎映象過來的)。手動配置之前,可以用docker history命令檢視其他映象的構建步驟:
編輯Dockerfie檔案
[root@VM-0-7-centos dockerfile]# vim centos-yz #這裡的centos-yz如果寫成Dockerfile,則編譯時無需-f尋找編譯檔案,會自動尋找 FROM centos MAINTAINER zhouyinlin<1909423593@qq.com> ENV MYPATH /root/ WORKDIR $MYPATH #構建時執行的命令 RUN yum -y install vim RUN yum -y install net-tools #開啟埠 EXPOSE 80 CMD $PATH CMD echo "------------------end-------------------" CMD /bin/bash [root@VM-0-7-centos dockerfile]# docker build -f centos-yz -t centos-yz:1.0 . #開始構建構建後進入新的CentOS,發現vim和ifconfig都有了
[root@VM-0-7-centos dockerfile]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos-yz 1.0 a2f9e606e2c5 15 seconds ago 322MB [root@VM-0-7-centos dockerfile]# docker run -it centos-yz:1.0 [root@4103126b11ae ~]# vim [root@4103126b11ae ~]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.18.0.2 netmask 255.255.0.0 broadcast 172.18.255.255 ether 02:42:ac:12:00:02 txqueuelen 0 (Ethernet) RX packets 8 bytes 656 (656.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@4103126b11ae ~]#
配置自帶Tomcat的映象,且允許從外部部署專案
編輯Dockerfile檔案
FROM centos MAINTAINER ZHOUYINGLIN<1909423593@QQ.COM> COPY readme.txt /usr/local/readme.txt #閱讀文件 #將壓縮包和jdk新增到映象 ADD apache-tomcat-9.0.22.tar.gz /usr/local ADD jdk-8u151-linux-x64.tar.gz /usr/local RUN yum -y install vim #配置工作目錄和路徑 ENV MYPATH /usr/local WORKDIR $MYPATH #配置相關的環境變數 ENV JAVA_HOME /usr/local/jdk1.8.0_151 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin #開放埠 EXPOSE 8080 #映象執行時,就啟動tomcat,並寫入日誌 CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/logs/catalina.out
構建映象並啟動容器
docker build -tdiytomcat . #這裡由於dockerfile名叫:Dockerfile,因此無需再加-f 但注意後面的點,表示是當前目錄的 #開放宿主機的9090埠對映至容器的8080埠,掛載兩個目錄:1.專案目錄 2.日誌存放目錄
#宿主機的tomcat/project對映到webapps下的test目錄,test專案下所有檔案都可以從外部部署進去 docker run -d -p 9090:8080 --name newtomcat -v /root/dockerfile/tomcat/project:/usr/local/apache-tomcat-9.0.22/webapps/test -v /root/dockerfile/tomcat/logs:/usr/local/apache-tomcat-9.0.22/logs diytomcat
目前為止,就可以正常的在宿主機或者外部網路訪問到tomcat的主頁啦。專案就弄一個簡單的網頁就好了,再以IP:port/專案名就可以訪問專案主頁了
新建專案
在宿主機的project下新建WEB-INF等目錄、檔案,層級如下: project WEB-INFO web.xml index.jsp
檔案描述
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="true"> </web-app>index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>new tomcat</title> </head> <body> 恭喜,web專案已經搭建完成。 </body> </html>