Docker——dockerfile
阿新 • • 發佈:2020-09-15
-
dockerFile介紹
dockerFile是用來構建docker映象的檔案!命令引數指令碼!
步驟:
- 編寫dockerFile檔案
- docker build構建成為一個映象
- docker run執行映象
- docker push釋出映象(DockerHub,阿里雲映象倉庫)
檢視官方製作的dockerFile
-
在hub.docker上搜索centos
-
選擇某個版本的centos,隨後跳轉到github上
-
FROM scratch #最底層 ADD centos-8-x86_64.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="20200809" CMD ["/bin/bash"]
dockerFile與dockerImages,docker容器的關係:
- dockerFile用於構建生成映象,也就是最終釋出和執行的產品
- docker容器是docker映象實際執行的一個個獨立的服務
基礎知識:
- 每個保留關鍵字(指令)都必須是大寫字母
- 執行從上到下順序執行
-
表示註釋
- 每一個指令都會建立提交一個新的映象層
-
dockerFIle指令
FROM # 基礎映象 MAINTAINER # 維護者資訊(姓名+郵箱) RUN # 映象構建時的命令 ADD # 需要新增的其它環境,如:tomcat壓縮包,會自動解壓 WORKDIR # 映象的工作目錄(如一開始就進入的目錄) VOLUME # 需要掛載的目錄 EXPOSE # 暴露埠(可以替代-p) CMD # 指定容器啟動的時候要執行的命令,只有最後一個會生效,可被替代(即從外部呼叫docker run指令且攜帶引數時,引數會替代dockerFile中的指令) ENTRYPOINT # 指定容器啟動的時候要執行的命令,可以追加命令(與上面的不同,不會被替代,而是追加) ONBUILD # 當構建一個被繼承DockerFile的時候,會執行ONBUILD的指令 COPY # 類似ADD,當我們檔案拷貝到映象中 ENV # 構建的時候設定環境變數
測試:
#1,編寫dockerFile檔案 FROM centos #基於centos構建 MAINTAINER arno<[email protected]> ENV MYPATH /user/local #設定環境變數 WORKDIR $PATH #設定工作目錄 RUN yum -y install vim #RUN命令應該是在映象構建的時候執行的,添加了一些新功能 RUN yum -y install net-tools EXPOSE 80 #暴露的埠 CMD echo $MYPATH CMD echo "---end---" CMD /bin/bash #2.構建映象 [root@iZwz908j8pbqd86doyrez5Z test]# docker build -f mydockerfile -t newcentos . #3.檢視映象 [root@iZwz908j8pbqd86doyrez5Z test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE newcentos latest ded9efb6e766 3 minutes ago 295MB #4.執行映象 [root@iZwz908j8pbqd86doyrez5Z test]# docker run -P -d -it newcentos [root@iZwz908j8pbqd86doyrez5Z test]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4ce4eebf72f9 newcentos "/bin/sh -c /bin/bash" 7 seconds ago Up 7 seconds 0.0.0.0:32773->80/tcp sad_ride #可以看到執行的是80埠 [root@iZwz908j8pbqd86doyrez5Z test]# docker attach 4ce4eebf72f9 [root@4ce4eebf72f9 local]# #可以看到進入的是/usr/local這一工作目錄 [root@4ce4eebf72f9 local]# ifconfig #成功在基礎的centos上添加了一些新功能(RUN) eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.10 netmask 255.255.0.0 broadcast 172.17.255.255 ether 02:42:ac:11:00:0a txqueuelen 0 (Ethernet) 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 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 #5.檢視映象固構建的歷史 [root@iZwz908j8pbqd86doyrez5Z test]# docker history newcentos IMAGE CREATED CREATED BY SIZE COMMENT ded9efb6e766 12 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B 345196631c6a 12 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B 86451430c08f 12 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B 11948d022259 12 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B 99c8922d054b 12 minutes ago /bin/sh -c yum -y install net-tools 22.8MB b43f395d0d9e 12 minutes ago /bin/sh -c yum -y install vim 57.2MB c973079ba70d 13 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B ff143e3cb146 13 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B eee54c129432 13 minutes ago /bin/sh -c #(nop) MAINTAINER arno<114303778… 0B 0d120b6ccaa8 4 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 4 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B <missing> 4 weeks ago /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d… 215MB
docker history:檢視映象的變更歷史(構建過程,配置引數)
-
CMD命令與ENTRYPOINT區別
比較思路,cmd中的“ls -a”可以列出所有的目錄,"ls -al"可以列出所有目錄的詳細資訊.我們分別用CMD和ENTRYPOINT命令構建映象,然後在執行容器時嘗試新增"-l引數",檢視執行結果
(1).CMD
#1.編寫dockerfile檔案 FROM centos CMD ["ls","-a"] #複雜命令用[]包裹 #2.構建映象 [root@iZwz908j8pbqd86doyrez5Z test]# docker build -f dockerfiletest1 -t dockerfiletest1 . #3.執行容器 [root@iZwz908j8pbqd86doyrez5Z test]# docker run dockerfiletest1 . .. ... #4.嘗試新增引數執行——失敗,因為沒有"ls -l"指令 [root@iZwz908j8pbqd86doyrez5Z test]# docker run -l dockerfiletest1 "docker run" requires at least 1 argument.
(2).ENTRYPOINT
#1.編寫dockerfile檔案 FROM centos ENTRYPOINT ["ls","-a"] #複雜命令用[]包裹 #2.構建映象 [root@iZwz908j8pbqd86doyrez5Z test]# docker build -f dockerfiletest2 -t dockerfiletest1 . #3.執行容器 [root@iZwz908j8pbqd86doyrez5Z test]# docker run dockerfiletest2 . .. ... #4.嘗試新增引數執行 [root@iZwz908j8pbqd86doyrez5Z test]# docker run dockerfiletest2 -l total 56 drwxr-xr-x 1 root root 4096 Sep 13 01:17 . ...
區別:
- docker run的命令的引數是覆蓋CMD指令的引數
- docker run的命令的引數是追加ENTRYPOINT指令的引數後
-
使用duockerfile製作Tomcat映象(最難的一部分)
準備工作:tomcat壓縮包,jdk壓縮包
#1.編寫Dockerfile檔案 FROM centos MAINTAINER arno<[email protected]> COPY readme.txt /usr/local/readme.txt #新增readme目錄 ADD jdk-8u261-linux-x64.tar.gz /usr/local/ #新增安裝包,會自動解壓 ADD apache-tomcat-9.0.37.tar.gz /usr/local/ #這裡路徑最後應該有"/" RUN yum -y install vim ENV MYPATH /usr/local #工作目錄(使用者一開始進入的目錄) WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8.0_261 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.37 #centos環境變數 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.37 #絕對路徑 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 CMD /usr/local/apache-tomcat-9.0.37/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.37/logs/catalina.out #啟動apache,同時輸出日誌檔案 #2.構建映象 docker build -t arno-tomcat . #因為dockerfile檔名為Dockerfile,所以省略了-f #3.執行容器 docker run -d -it -p 9090:8080 -v /usr/arno/tomcat/test:/usr/local/apache-tomcat-9.0.37/webapps/ROOT -v /usr/arno/tomcat/log:/usr/local/apache-tomcat-9.0.37/logs arno-tomcat #掛載tomcat的對外展示頁面以及日誌的目錄 #4.測試埠 curl localhost:38775
- 需要準備tar.gz壓縮包,這邊犯了一個比較睿智的問題,x86是32位的,x64是64位的
- 起名為Dockerfile(預設名),在build的時候-f後面可以不用指定名字
- 使用COPY命令拷貝檔案到容器內部(比如readme.md)
- ADD命令新增的壓縮包會自動解壓(一般會將它解壓到/usr/local目錄下)
- Tomcat沒有執行起來,可以到tomcat/bin目錄下執行
catalina.sh run &
指令執行
-
映象釋出
釋出到DockerHub
(1).註冊賬號
(2).從伺服器登陸docker.hub
docker login -u usrname -p password
(3).從伺服器提交映象
[root@iZwz908j8pbqd86doyrez5Z test]# docker tag arno-tomcat8 arnovc/arno-tomcat8 #打上標記 [root@iZwz908j8pbqd86doyrez5Z test]# docker push arnovc/arno-tomcat8 #將打上標記的映象上傳
注意:
- 要在映象之前打上id的標記
- 用
docker tag
指令打標記
阿里雲映象
準備工作:登陸阿里雲,點開阿里雲映象服務,建立名稱空間,建立映象倉庫,建立容器映象
#登陸阿里雲(如果有登陸docker.hub,建議先退出) docker login --username=亞諾_vc registry.cn-hangzhou.aliyuncs.com #打上tag docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/arno-test/新的映象名:[映象版本號] #上傳映象 $ sudo docker push registry.cn-hangzhou.aliyuncs.com/arno-test/映象名:[映象版本號]
注意:
- 點選倉庫的基本資訊,可以檢視映象推送的步驟
- [:tag]中的"[]"表示可選項,本身是不用帶上的