1. 程式人生 > 其它 >Docker進階(二)Dockerfile——映象構建

Docker進階(二)Dockerfile——映象構建

Dockerfile的組成

構建docker映象的檔案,命令+引數+指令碼 步驟
  1. 編寫一個dockerfile檔案
  2. docker build 構建成一個映象
  3. docker run執行映象
  4. docker push釋出映象至DockerHub或阿里雲映象倉庫
官方做法:在dockerHub中隨意點選一個映象的版本,就會跳轉至github的DockerFile目錄,如cengtos7顯示如下:
FROM scratch 
 
 
ADD centos-7-x86_64-docker.tar.xz /
 
LABEL \
 
org.label-schema.schema-version="
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指令) 實際工作中,docker映象甚至是交付的標準,專案做好之後必須打包成docker映象來交付: 原則:
  • 指令是大寫字母
  • 執行順序從上至下,每個指令都會建立提交一個新的映象層
Dockerfile:構建檔案,定義了一切的步驟,原始碼 DockerImages:通過Dockerfile構建生成的映象,最終釋出和執行的產品 Docker容器:映象執行起來提供伺服器

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>