網站首頁 編程語言 正文
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 8月 11 16:15 apache-tomcat-8.5.57.tar.gz
-rw-r--r--. 1 root root 562 8月 11 16:56 Dockerfile
-rw-r--r--. 1 root root 195094741 7月 19 2019 jdk-8u221-linux-x64.tar.gz
-rw-r--r--. 1 root root 22 8月 11 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 8月 11 16:44 index.jsp
drwxr-xr-x. 2 root root 21 8月 11 16:50 WEB-INF
$ cd WEB-INF/
$ ll
總用量 4
-rw-r--r--. 1 root root 279 8月 11 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
- 上一篇:Docker網絡介紹
- 下一篇:kubernetes之資源限制
相關推薦
- 2022-07-14 一文教會你用redux實現computed計算屬性_React
- 2022-08-12 Android學習之BottomSheetDialog組件的使用_Android
- 2023-01-18 GO實現跳躍表的示例詳解_Golang
- 2022-09-18 go?mock?server的簡易實現示例_Golang
- 2022-12-14 Rocksdb?Memtable數據結構源碼解析_Android
- 2023-02-03 Python3.10?Generator生成器Coroutine原生協程詳解_python
- 2022-09-05 C語言如何實現頭插法建立單鏈表_C 語言
- 2022-09-06 golang根據生日計算星座和屬相實例_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支