日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Dockerfile文件介紹

作者:吉松松 更新時間: 2022-07-09 編程語言

Dockerfile

Dockerfile介紹

1、dockerfile是用來構建鏡像的文件

? 1.1編寫dockerfile文件

? 1.2 docker build 創建鏡像

? 1.3 docker run 運行鏡像

? 1.4 docker push 上傳鏡像

2、執行順序從上至下

3、#代表注釋

4、指令全部是大寫

FROM        #設置鏡像使用的基本鏡像
MAINTAINER  #鏡像作者
RUN         #編譯鏡像時運行的命令
EXPOSE      #鏡像暴露的端口
ADD         #復制指定文件到容器中,tar包會自動解壓  
COPY        #復制指定文件到容器中,tar包不會自動解壓
LABEL       #鏡像的標簽
VOLUME      #容器的掛載卷
WORKDIR     #鏡像的工作目錄,即一進入容器時的顯示目錄,不寫默認進入根目錄,如果目錄不存在,WORKDIR會新建目錄
CMD         #容器啟動的時候需要運行的命令,當存在多個CMD,只有最后一個CMD會執行,docker run添加參數時替換命令
ENTRYPOINT  #容器啟動的時候需要運行的命令,當存在多個ENTRYPOINT,只有最后一個ENTRYPOINT會執行,docker run添加參數時追加命令           
ENV         #設置容器的環境變量,以鍵值對的形式存在,無法在Dockerfile文件中引用
ARG         #build時存在,可在Dockerfile文件中引用,無法在容器中引用

CMD與ENTRYPOINT的區別

CMD指令(替換)
#編寫CMD測試dockerfile文件
$ cat dockerfile-cmd-test 
FROM centos:7.8.2003
CMD echo "aaa"             

#docker build鏡像
$ docker build -f dockerfile-cmd-test -t cmd-test .

#運行鏡像,會默認執行Dockerfile文件中CMD的命令
$ docker run -it cmd-test
aaa

#docker run后跟命令,ls -al會把echo "aaa"給替換掉
$ docker run -it cmd-test ls -al
total 12
drwxr-xr-x.   1 root root     6 Aug 11 05:54 .
drwxr-xr-x.   1 root root     6 Aug 11 05:54 ..
-rwxr-xr-x.   1 root root     0 Aug 11 05:54 .dockerenv
-rw-r--r--.   1 root root 12114 May  4 17:11 anaconda-post.log
lrwxrwxrwx.   1 root root     7 May  4 17:09 bin -> usr/bin
drwxr-xr-x.   5 root root   360 Aug 11 05:54 dev
drwxr-xr-x.   1 root root    66 Aug 11 05:54 etc
drwxr-xr-x.   2 root root     6 Apr 11  2018 home
lrwxrwxrwx.   1 root root     7 May  4 17:09 lib -> usr/lib
lrwxrwxrwx.   1 root root     9 May  4 17:09 lib64 -> usr/lib64
drwxr-xr-x.   2 root root     6 Apr 11  2018 media
drwxr-xr-x.   2 root root     6 Apr 11  2018 mnt
drwxr-xr-x.   2 root root     6 Apr 11  2018 opt
dr-xr-xr-x. 129 root root     0 Aug 11 05:54 proc
dr-xr-x---.   2 root root   114 May  4 17:11 root
drwxr-xr-x.  11 root root   148 May  4 17:11 run
lrwxrwxrwx.   1 root root     8 May  4 17:09 sbin -> usr/sbin
drwxr-xr-x.   2 root root     6 Apr 11  2018 srv
dr-xr-xr-x.  13 root root     0 Aug  6 08:21 sys
drwxrwxrwt.   7 root root   132 May  4 17:11 tmp
drwxr-xr-x.  13 root root   155 May  4 17:09 usr
drwxr-xr-x.  18 root root   238 May  4 17:10 var

ENTRYPOINT指令(Dockerfile中命令一定會被執行)
$ cat dockerfile-entrypoint-test 
FROM centos:7.8.2003
ENTRYPOINT echo "aaa" 

#docker build鏡像
$ docker build -f dockerfile-entrypoint-test -t entrypoint-test .

#運行鏡像,會默認執行Dockerfile文件中entrypoint的命令
$ docker run -it entrypoint-test
aaa

#docker run后跟命令,依然會輸出aaa。
#原因是shell模式下,任何cmd和run的參數都無法傳遞到entrypoint中,所以entrypoint推薦使用JSON格式
$ docker run -it entrypoint-test ls -l
aaa
#只有當entrypoint使用JSON格式時,才可傳遞參數
$ cat Dockerfile
FROM centos:7
ENTRYPOINT ["/bin/echo","aaa"]
$ docker build -t test:v1 .
$ docker run test:v1  ls -l
aaa ls -l
CMD與ENTRYPOINT同時存在
#當CMD與ENTRYPOINT同時存在Dockerfile,并且都是可執行的命令時,只會輸出最后的ENTRYPOINT.
#原因之前提過shell模式下,任何cmd和run的參數都無法傳遞到entrypoint中。
$ cat Dockerfile 
FROM centos:7
ENTRYPOINT echo "aaa"
CMD echo "bbb"
ENTRYPOINT echo "ccc"
CMD echo "ddd"
CMD echo "eee"

$ docker build -t test:v1 .
$ docker run test:v1
ccc

#當CMD與ENTRYPOINT同時存在Dockerfile
#但是CMD不是可執行的命令,如果想將CMD的參數傳遞給ENTRYPOINY,兩個參數的值需要寫成JSON格式
$ cat dockerfile-entrypoint-test 
FROM centos:7.8.2003
ENTRYPOINT ["/bin/echo","hello"]
CMD ["world"]
#docker build鏡像
$ docker build -f dockerfile-entrypoint-test -t entrypoint-test .

#運行鏡像,會執行ENTRYPOINT的hello 在再執行CMD中的world
$ docker run -it entrypoint-test
hello world

#test會將CMD中的參數替換掉
$ docker run -it entrypoint-test test
hello test
總結
1、如果各自單獨存在,只會執行最后一個CMD或者ENTRYPOINT。
2、如果同時存在Dockerfile,且都是可執行的命令(即shell模式下),只會執行Dockerfile中最后的ENTRYPOINT,docker run時傳遞的參數也無效.
  原因是shell模式下,任何cmd和run的參數都無法傳遞到entrypoint中。
3、如果同時存在Dockerfile,但是CMD與ENTRYPOINT為JSON形式,CMD會作為參數傳遞給ENTRYPOINT。

編寫centos鏡像

$ cat mydockerfile 
FROM centos:7.8.2003
MAINTAINER jss<1255109811@qq.com>

RUN yum -y install net-tools
RUN yum -y install vim

ARG SET_MYPATH=/usr/local 
ENV MYPATH $SET_MYPATH       #容器中會存在MYPATH的變量,可直接引用.也可以直接寫成ENV MYPATH /usr/local
WORKDIR $MYPATH

EXPOSE 80

CMD echo $MYPATH
CMD echo "----end-----"
CMD /bin/bash  #docker run的時候只會執行/bin/bash,所以docker run命令中可不寫/bin/bash也會執行的原因就在這

#-f參數 dockerfile文件名(如果文件名為Dockerfile,可以不加-f參數,會默認讀取該文件) 
#-t 鏡像名稱版本
#最后有.代表當前目錄,也可以寫遠程路徑。

有時候我們會發現Dockerfile文件中的引用的文件很少,但是docker build時向Docker daemon中提交的大小有幾個G。
原因:docker build . 命令會將Dockerfile所在層級目錄下的所有文件打包提交給Docker daemon。
例如:Dockerfile文件在/opt目錄下,同時opt目錄下還存在其他無用的2G文件,docker build時它會將這無用的文件同樣提交給Docker daemon,
所以Dockerfile文件所在的層級下最好不要放無用文件。

$ docker build -f  mydockerfile  -t mycentos:2.0 .
Sending build context to Docker daemon  2.048G
Step 1/3 : FROM centos:7.8.2003
..........
Successfully built 6d50b9d08626
Successfully tagged mycentos:2.0
#表示鏡像構建成功
$ docker images    
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
mycentos              2.0                 6d50b9d08626        5 minutes ago       433MB
$ docker run -it mycentos:2.0
$ pwd                 #WORKDIR 定義的工作目錄
/usr/local
$ echo $MYPATH        #ENV定義的變量
/usr/local
$ ifconfig            #RUN執行的命令,所以ifconfig與vim命令都可以使用了
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11: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

編寫Tomcat鏡像

編寫Dockerfile文件
$ ll
總用量 200688
-rw-r--r--. 1 root root  10398269 811 16:15 apache-tomcat-8.5.57.tar.gz
-rw-r--r--. 1 root root       562 811 16:56 Dockerfile
-rw-r--r--. 1 root root 195094741 719 2019 jdk-8u221-linux-x64.tar.gz
-rw-r--r--. 1 root root        22 811 15:24 README.txt

$ cat Dockerfile #已Dockerfile命名文件,build鏡像時,不需要-f參數
FROM centos:7.8.2003
MAINTAINER JSS<1255109811@qq.com>

COPY README.txt /opt/sudytech/       #README.txt需要與Dockerfile文件同級目錄

ADD  apache-tomcat-8.5.57.tar.gz /opt/sudytech/   #壓縮包需要與Dockerfile文件同級目錄
ADD  jdk-8u221-linux-x64.tar.gz /opt/sudytech/       


RUN  yum -y install vim
RUN  yum -y install net-tools


EXPOSE 8080

WORKDIR /opt/sudytech/

ENV  JAVA_HOME /opt/sudytech/jdk1.8.0_221
ENV  CLASSPATH $CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
ENV  PATH $JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin

CMD  /opt/sudytech/apache-tomcat-8.5.57/bin/startup.sh && tail -f /opt/sudytech/apache-tomcat-8.5.57/logs/catalina.out
構建鏡像
$ docker build -t mytomcat .
$ docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
mytomcat              latest              a727ea78aa9f        6 seconds ago       855MB
運行鏡像并外掛文件
$ docker run -d -p 8080:8080 --name tomcat -v /home/tomcattest/webapps/test:/opt/sudytech/apache-tomcat-8.5.57/webapps/test -v /home/tomcattest/logs:/opt/sudytech/apache-tomcat-8.5.57/logs mytomcat
$ pwd
/home/tomcattest/webapps/test
$ ll
總用量 4
-rw-r--r--. 1 root root 319 811 16:44 index.jsp
drwxr-xr-x. 2 root root  21 811 16:50 WEB-INF
$ cd WEB-INF/
$ ll
總用量 4
-rw-r--r--. 1 root root 279 811 16:48 web.xml

$ cat web.xml 
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
 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">
</web-app>

$ cat index.jsp 
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
    <head>
           <title>第一個 JSP 程序</title>
    </head>
    <body>
        Hello World<br>
           <%
                  System.out.println("Hello World!");
           %>
    </body>
</html>
瀏覽器訪問測試

原文鏈接:https://blog.csdn.net/m0_37642477/article/details/125381335

欄目分類
最近更新