Docker 使用Dockerfile构建自己的docker服务(三)
生活随笔
收集整理的這篇文章主要介紹了
Docker 使用Dockerfile构建自己的docker服务(三)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
先介紹一下DockerFile文件的一些指令說明
DockerFile的指令 FROM 基礎鏡鏡像,一切從這里開始構建 MAINTAINER 鏡像是誰寫的,姓名+郵箱 RUN 鏡像構建的時候需要運行的$令 ADD 步驟,tomcat鏡像, 這個tomcat壓縮包!添加內容 WORKDIR 鏡像的工作目錄 VOLUME 掛載的目錄 EXPOSE 保留端口配置 CMD 指定這個容器啟動的時候曼運行的命令,只有最后一個會生效,可被替代 ENTRYPOINT 指定這個容器啟動的時候要運行的命令,可以追加命令 ONBUILD 當構建一個被繼承DockerFile 這個時候就會運行ONBUILD 的指令。觸發(fā)指令。 COPY 類似ADD。將我們文件拷貝到鏡像中 ENV 構建的時候設置環(huán)境變量 1.FROM <image>例子:FROM centosFROM指定構建鏡像的基礎源鏡像,如果本地沒有指定的鏡像,則會自動從Docker的公共庫pull鏡像下來。FROM必須是Dockerfile中非注釋行的第一個指令,即一個Dockerfile從FROM語句開始FROM可以在一個DOCKERfile中出現(xiàn)多次,如果有需求在一個Dockerfile中創(chuàng)建多個鏡像2.MAINTAINER <name>例子:MAINTAINER zxg zhutoyearn@163.com指定創(chuàng)建鏡像的用戶3.RUN <"executable","parm1","param2">兩種使用方式: RUN RUN "executable", "param1", "param2"例子:RUN yum install wget -y每條RUN指令將在當前鏡像基礎上執(zhí)行指定命令,并提交為新的鏡像,后續(xù)的RUN都在之前RUN提交后的鏡像為基礎,鏡像是分層的,可以通過一個鏡像的任何一個歷史提交點來創(chuàng)建,類似源碼的 版本控制 。exec 方式會被解析為一個 JSON 數(shù)組,所以必須使用雙引號而不是單引號。exec 方式不會調用一個命令 shell,所以也就不會繼承相應的變量,如:RUN [ "echo", "$HOME" ] #錯誤,這個個方法不會輸出HOME變量,下面為正確方式RUN [ "sh", "-c", "echo", "$HOME" ]RUN 產生的緩存在下一次構建的適合是不會失效的,會被重用,可以使用--no-cache選擇,即docker build-no-cache,如此便不會緩存4.CMD <"executable",>三種使用方式: CMD "executable","param1","param2" CMD "param1","param2" CMD command param1 param2 (shell form)例子:CMD["nginx"] CMD指定在 Dockerfile 中只能使用一次,如果有多個,則只有最后一個會生效。CMD的目的是為了在啟動容器時提供一個默認的命令執(zhí)行選項。如果用戶啟動容器時指定了運行的命令,則會覆蓋掉CMD指定的命令。CMD會在啟動容器的時候執(zhí)行,build 時不執(zhí)行,而RUN只是在構建鏡像的時候執(zhí)行,后續(xù)鏡像構建完成之后,啟動容器就與RUN無關了,這個初學者容易弄混這個概念,這里簡單注解一下。5.EXPOSE <port>[<port>...]告訴docker服務端容器對外映射的本地端口,需要在docker run的使用使用-p或者-P選項生效例子:EXPOSE 80 6.ENVENV <key> <value>ENV <key>=<value>。。。指定一個環(huán)節(jié)變量,會被后續(xù)RUN指令使用,并在容器運行時保留例子:ENV myname zxgENV myhome beijingENV myname="zxg" myhome=beijing7.ADDADD <src>...<dest>ADD復制本地主機文件、目錄或者遠程文件URLS從并且添加到容器指定路徑中支持通過Go的正則模式匹配,具體規(guī)則可參見Go filepath.Match例子:ADD hom* /mydir/ #adds all files starting with ”hom“ADD hom?.txt /mydir/ #?is replaced with any single characterADD index.html /usr/share/nginx/html/index.html注意如下: 路徑必須是絕對路徑,如果 不存在,會自動創(chuàng)建對應目錄 路徑必須是 Dockerfile 所在路徑的相對路徑 如果是一個目錄,只會復制目錄下的內容,而目錄本身則不會被復制8.COPYCOPY <src>...<dest>COPY復制新文件或者目錄并且添加到容器指定路徑中,用法和ADD相同,唯一區(qū)別時不能指定遠程文件URLS。9.ENTRYPOINTENTRYPOINT "executable","param1","param2"ENTRYPOINT command param1 param2(shell form)配置容器啟動后執(zhí)行的命令,并且不可被 docker run 提供的參數(shù)覆蓋,而CMD是可以被覆蓋的。如果需要覆蓋,則可以使用docker run --entrypoint選項。每個 Dockerfile 中只能有一個ENTRYPOINT,當指定多個時,只有最后一個生效。Exec form ENTRYPOINT 例子通過ENTRYPOINT使用 exec form 方式設置穩(wěn)定的默認命令和選項,而使用CMD添加默認之外經常被改動的選項。FROM ubuntuENTRYPOINT ["top", "-b"]CMD ["-c"]通過 Dockerfile 使用ENTRYPOINT展示前臺運行 Apache 服務FROM debian:stableRUN apt-get update && apt-get install -y --force-yes apache2EXPOSE 80 443VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]Shell form ENTRYPOINT 例子這種方式會在/bin/sh -c中執(zhí)行,會忽略任何CMD或者docker run命令行選項,為了確保docker stop能夠停止長時間運行ENTRYPOINT的容器,確保執(zhí)行的時候使用exec選項。FROM ubuntuENTRYPOINT exec top -b如果在ENTRYPOINT忘記使用exec選項,則可以使用CMD補上:FROM ubuntuENTRYPOINT top -bCMD --ignored-param1 # --ignored-param2 ... --ignored-param3 ... 依此類推10.VOLUMEVOLUME ["/data"]創(chuàng)建一個可以從本地主機或其他容器掛載的掛載點,后續(xù)具體介紹11.USERUSER daemon指定運行容器時的用戶名或UID,后續(xù)RUN、CMD、ENTERPOINT也會使用指定用戶12.WORKDIRWORKDIR /path/to/workdir為后續(xù)的RUN、CMD、ENTRYPOINT指令配置工作目錄。可以使用多個WORKDIR指令,后續(xù)命令如果參數(shù)是相對路徑,則會基于之前命令指定的路徑WORKDIR /aWORKDIR bWORKDIR cRUN pwd最終路徑是/a/b/cWORKDIR指令可以在ENV設置變量之后調用環(huán)境變量:ENV DIRPATH /pathWORKDIR $DIRPATH/$DIRNAME最終路徑則為 /path/$DIRNAME13.ONBUILDONBUILD [INSTRUCTION]配置當所創(chuàng)建的鏡像作為其他新創(chuàng)建鏡像的基礎鏡像時,所執(zhí)行的操作指令例如:Dockerfile 使用如下的內容創(chuàng)建了鏡像image-A:[...]ONBUILD ADD . /app/srcONBUILD RUN /usr/local/bin/python-build --dri /app/src[...]?
這里我們使用java項目做演示
準備項目jar包,我們這里的jar包就是一個自己編寫java監(jiān)控程序
[root@test1 monitor-1.0-SNAPSHOT]# ll total 24 -rwxrwxrwx 1 zhonghong zhonghong 8124 Jul 7 19:25 monitor-1.0-SNAPSHOT.jar -rwxrwxrwx 1 zhonghong zhonghong 578 Aug 20 16:38 monitor-1.0-SNAPSHOT.log drwxrwxrwx 2 zhonghong zhonghong 201 Jul 7 17:29 lib -rwxrwxrwx 1 zhonghong zhonghong 183 Aug 20 16:58 run.shmonitor-1.0-SNAPSHOT.jar 是我們要執(zhí)行的jar包
lib目錄下是我們java項目所需要的所有依賴jar包
?創(chuàng)建dockerfile
[root@test1 monitor-1.0-SNAPSHOT]# cat dockerfile FROM java:8 COPY *.jar / COPY lib/*.jar /lib/ CMD ["--server.port=8080"] EXPOSE 8080 ENTRYPOINT ["java","-cp","/lib/*:/monitor-1.0-SNAPSHOT.jar","wiki.hadoop.monitor.TaskMonitor","111"]?生成docker image
docker build -t test-docker .運行docker
docker run -d -P --name test-docker-name test-docker查看docker運行的日志,發(fā)現(xiàn)我們的程序運行正常
> docker logs test-docker-name 02:22:39,009 INFO wiki.hadoop.monitor.util.Log - [{"uid":"clementhii8","name":"許志國 Clement Hii","usr_level":"1"},{"uid":"sammifuhiulam","name":"傅曉琳 Sammi Fu","usr_level":"1"}] 02:22:39,009 INFO wiki.hadoop.monitor.util.Log - 獲取正常,2020-08-22 02:22:39 02:22:39,009 INFO wiki.hadoop.monitor.util.Log - 46=================================================================== 02:22:39,009 INFO wiki.hadoop.monitor.util.Log - 休眠30s 02:23:09,054 INFO wiki.hadoop.monitor.util.Log - [{"uid":"osuperpower","name":"長權","usr_level":"1"},{"uid":"BBC-中文網-132411143477916","name":"Log In or Sign Up to View","usr_level":"1"}] 02:23:09,054 INFO wiki.hadoop.monitor.util.Log - 獲取正常,2020-08-22 02:23:09 02:23:09,054 INFO wiki.hadoop.monitor.util.Log - 45=================================================================== 02:23:09,054 INFO wiki.hadoop.monitor.util.Log - 休眠30s 02:23:39,101 INFO wiki.hadoop.monitor.util.Log - [{"uid":"willisfonghohin","name":"方浩軒 Willis Fong","usr_level":"1"},{"uid":"Au-Kam-San-區(qū)錦新-111358238886242","name":"Au Kam San 區(qū)錦新","usr_level":"1"}] 02:23:39,101 INFO wiki.hadoop.monitor.util.Log - 獲取正常,2020-08-22 02:23:39 02:23:39,101 INFO wiki.hadoop.monitor.util.Log - 47=================================================================== 02:23:39,101 INFO wiki.hadoop.monitor.util.Log - 休眠30s?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的Docker 使用Dockerfile构建自己的docker服务(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Phoenix 关联hbase表历史数据
- 下一篇: Reactor事件驱动的两种设计实现:面