總覽
先簡(jiǎn)單理解 docker 的使用過(guò)程矢洲,它分為鏡像構(gòu)建與容器啟動(dòng)炊甲。
鏡像構(gòu)建:即創(chuàng)建一個(gè)鏡像,它包含安裝運(yùn)行所需的環(huán)境琴拧、程序代碼等。這個(gè)創(chuàng)建過(guò)程就是使用 dockerfile 來(lái)完成的嘱支。
容器啟動(dòng):容器最終運(yùn)行起來(lái)是通過(guò)拉取構(gòu)建好的鏡像蚓胸,通過(guò)一系列運(yùn)行指令(如端口映射、外部數(shù)據(jù)掛載除师、環(huán)境變量等)來(lái)啟動(dòng)服務(wù)的赢织。針對(duì)單個(gè)容器,這可以通過(guò) docker run 來(lái)運(yùn)行馍盟。
而如果涉及多個(gè)容器的運(yùn)行(如服務(wù)編排)就可以通過(guò) docker-compose 來(lái)實(shí)現(xiàn)于置,它可以輕松的將多個(gè)容器作為 service 來(lái)運(yùn)行(當(dāng)然也可僅運(yùn)行其中的某個(gè)),并且提供了 scale (服務(wù)擴(kuò)容) 的功能贞岭。
簡(jiǎn)單總結(jié):
1.dockerfile: 構(gòu)建鏡像八毯;
2.docker run: 啟動(dòng)容器;
3.docker-compose: 啟動(dòng)服務(wù)瞄桨;
從頭說(shuō)起话速。
假如你不用 docker ,搭建 wordpress 怎么弄芯侥?先找臺(tái) server 泊交,假設(shè)其 OS 為 Ubuntu 乳讥,然后按照文檔一步步敲命令,寫配置廓俭,對(duì)吧云石?
用 docker 呢? 隨便找臺(tái) server 研乒,不管什么操作系統(tǒng)汹忠,只要支持 docker 就行, docker run ubuntu, docker 會(huì)從官方源里拉取最新的 Ubuntu 鏡像雹熬,可以認(rèn)為你開(kāi)了個(gè) Ubuntu 虛擬機(jī)宽菜,然后一步步安裝,跟上面一樣竿报。
但是這樣安裝有個(gè)顯著的缺點(diǎn)铅乡,一旦 container 被刪,你做的工作就都沒(méi)了烈菌。當(dāng)然可以用 docker commit 來(lái)保存成鏡像隆判,這樣就可以復(fù)用了。
但是鏡像一般比較大僧界,而且只分享鏡像的話侨嘀,別人也不知道你這鏡像到底包含什么,這些問(wèn)題都不利于分享和復(fù)用捂襟。
一個(gè)直觀的解決方案就是咬腕,寫個(gè)腳本把安裝過(guò)程全部記錄下來(lái),這樣再次安裝的時(shí)候葬荷,執(zhí)行腳本就行了涨共。 Dockerfile 就是這樣的腳本,它記錄了一個(gè)鏡像的制作過(guò)程宠漩。
有了 Dockerfile, 只要執(zhí)行 docker build . 就能制作鏡像举反,而且 Dockerfile 就是文本文件,修改也很方便扒吁。
現(xiàn)在有了 wordpress 的鏡像火鼻,只需要 docker run 就把 wordpress 啟動(dòng)起來(lái)了。
如果僅僅是 wordpress, 這也就夠了雕崩。但是很多時(shí)候魁索,需要多個(gè)鏡像合作才能啟動(dòng)一個(gè)服務(wù),比如前端要有 nginx 盼铁, 數(shù)據(jù)庫(kù) mysql, 郵件服務(wù)等等粗蔚,當(dāng)然你可以把所有這些都弄到一個(gè)鏡像里去,但這樣做就無(wú)法復(fù)用了饶火。
更常見(jiàn)的是, nginx, mysql, smtp 都分別是個(gè)鏡像鹏控,然后這些鏡像合作致扯,共同服務(wù)一個(gè)項(xiàng)目。
docker-compose 就是解決這個(gè)問(wèn)題的当辐。你的項(xiàng)目需要哪些鏡像抖僵,每個(gè)鏡像怎么配置,要掛載哪些 volume, 等等信息都包含在 docker-compose.yml 里瀑构。
要啟動(dòng)服務(wù),只需要 docker-compose up 就行刨摩,停止也只需要 docker-compse stop/down
簡(jiǎn)而言之寺晌, Dockerfile 記錄單個(gè)鏡像的構(gòu)建過(guò)程, docker-compse.yml 記錄一個(gè)項(xiàng)目(project, 一般是多個(gè)鏡像)的構(gòu)建過(guò)程澡刹。
你說(shuō)有些教程用了 dockerfile+docker-compose, 是因?yàn)?docker-compose.yml 本身沒(méi)有鏡像構(gòu)建的信息呻征,如果鏡像是從 docker registry 拉取下來(lái)的,那么 Dockerfile 就不需要罢浇;如果鏡像是需要 build 的陆赋,那就需要提供 Dockerfile.
docker-compose是編排容器的。例如嚷闭,你有一個(gè)php鏡像攒岛,一個(gè)mysql鏡像,一個(gè)nginx鏡像胞锰。如果沒(méi)有docker-compose灾锯,那么每次啟動(dòng)的時(shí)候,你需要敲各個(gè)容器的啟動(dòng)參數(shù)嗅榕,環(huán)境變量顺饮,容器命名,指定不同容器的鏈接參數(shù)等等一系列的操作凌那,相當(dāng)繁瑣兼雄。而用了docker-composer之后,你就可以把這些命令一次性寫在docker-composer.yml文件中帽蝶,以后每次啟動(dòng)這一整個(gè)環(huán)境(含3個(gè)容器)的時(shí)候赦肋,你只要敲一個(gè)docker-composer up命令就ok了。
dockerfile的作用是從無(wú)到有的構(gòu)建鏡像励稳。它包含安裝運(yùn)行所需的環(huán)境金砍、程序代碼等。這個(gè)創(chuàng)建過(guò)程就是使用 dockerfile 來(lái)完成的麦锯。Dockerfile - 為 docker build 命令準(zhǔn)備的恕稠,用于建立一個(gè)獨(dú)立的 image ,在 docker-compose 里也可以用來(lái)實(shí)時(shí) build
docker-compose.yml - 為 docker-compose 準(zhǔn)備的腳本扶欣,可以同時(shí)管理多個(gè) container 鹅巍,包括他們之間的關(guān)系千扶、用官方 image 還是自己 build 、各種網(wǎng)絡(luò)端口定義骆捧、儲(chǔ)存空間定義等
dockerfile指令
一澎羞、 變量
變量用 $variable_name 或者 ${variable_name} 表示。
${variable:-word} 表示如果 variable 設(shè)置敛苇,則結(jié)果將是該值妆绞。如果 variable 未設(shè)置,word 則將是結(jié)果枫攀。
${variable:+word} 表示如果 variable 設(shè)置則為 word 結(jié)果括饶,否則為空字符串。
變量前加 \ 可以轉(zhuǎn)義成普通字符串:\$foo or \${foo}来涨,表示轉(zhuǎn)換為 $foo 和 ${foo} 文字图焰。
二、FROM
初始化一個(gè)新的構(gòu)建階段蹦掐,并設(shè)置基礎(chǔ)鏡像:
FROM [--platform=<platform>] <image> [AS <name>]
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]
單個(gè) Dockfile 可以多次出現(xiàn) FROM技羔,以使用之前的構(gòu)建階段作為另一個(gè)構(gòu)建階段的依賴項(xiàng)
AS name 表示為構(gòu)建階段命名,在后續(xù) FROM 和 COPY --from=<name> 說(shuō)明中可以使用這個(gè)名詞卧抗,引用此階段構(gòu)建的映像
digest 其實(shí)就是就是根據(jù)鏡像內(nèi)容產(chǎn)生的一個(gè) ID藤滥,只要鏡像的內(nèi)容不變 digest 也不會(huì)變
tag 或 digest 值是可選的。如果您省略其中任何一個(gè)社裆,構(gòu)建器默認(rèn)使用一個(gè) latest 標(biāo)簽超陆。如果找不到該 tag 值,構(gòu)建器將返回錯(cuò)誤浦马。
--platform 標(biāo)志可用于在 FROM 引用多平臺(tái)鏡像的情況下指定平臺(tái)时呀。例如,linux/amd64晶默、linux/arm64谨娜、 或 windows/amd64。
三磺陡、RUN
將在當(dāng)前鏡像之上的新層中執(zhí)行命令趴梢,在 docker build時(shí)運(yùn)行。
RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'
RUN 有兩種形式:
RUN<command>(shell 形式币他,命令在 shell 中運(yùn)行坞靶,默認(rèn) /bin/sh -c 在 Linux 或 cmd /S /CWindows 上)
RUN ["executable", "param1", "param2"](執(zhí)行形式)
說(shuō)明:
可以使用 \(反斜杠)將單個(gè) RUN 指令延續(xù)到下一行
RUN 在下一次構(gòu)建期間,指令緩存不會(huì)自動(dòng)失效蝴悉≌靡酰可以使用 --no-cache 標(biāo)志使指令緩存無(wú)效
Dockerfile 的指令每執(zhí)行一次都會(huì)在 Docker 上新建一層。所以過(guò)多無(wú)意義的層拍冠,會(huì)造成鏡像膨脹過(guò)大尿这,可以使用 && 符號(hào)連接命令簇抵,這樣執(zhí)行后,只會(huì)創(chuàng)建 1 層鏡像
四射众、CMD
運(yùn)行程序碟摆,在 docker run 時(shí)運(yùn)行,但是和 run 命令不同叨橱,RUN 是在 docker build 時(shí)運(yùn)行典蜕。
FROM ubuntu
CMD ["/usr/bin/wc","--help"]
支持三種格式:
CMD ["executable","param1","param2"] 使用 exec 執(zhí)行,推薦方式罗洗;
CMD command param1 param2 在 /bin/sh 中執(zhí)行愉舔,提供給需要交互的應(yīng)用;
CMD ["param1","param2"] 提供給 ENTRYPOINT 的默認(rèn)參數(shù)栖博。
指定啟動(dòng)容器時(shí)執(zhí)行的命令屑宠,每個(gè) Dockerfile 只能有一條 CMD 命令厢洞。如果指定了多條命令仇让,只有最后一條會(huì)被執(zhí)行。
如果用戶啟動(dòng)容器時(shí)候指定了運(yùn)行的命令躺翻,則會(huì)覆蓋掉 CMD 指定的命令丧叽。
五、LABEL
添加元數(shù)據(jù):
LABEL multi.label1="value1" \
multi.label2="value2" \
other="value3"
六公你、EXPOSE
EXPOSE <port> [<port>/<protocol>...]
Docker 容器在運(yùn)行時(shí)偵聽(tīng)指定的網(wǎng)絡(luò)端口踊淳。可以指定端口是監(jiān)聽(tīng)TCP還是UDP陕靠,如果不指定協(xié)議迂尝,默認(rèn)為TCP。
該 EXPOSE 指令實(shí)際上并未發(fā)布端口剪芥。要在運(yùn)行容器時(shí)實(shí)際發(fā)布端口垄开,docker run -P 來(lái)發(fā)布和映射一個(gè)或多個(gè)端口。
默認(rèn)情況下税肪,EXPOSE 假定 TCP溉躲。您還可以指定 UDP:
EXPOSE 80/udp
七、ENV
設(shè)置環(huán)境變量:
ENV <key>=<value> ...
設(shè)置的環(huán)境變量將持續(xù)存在益兄,您可以使用 docker inspect 來(lái)查看锻梳。使用 docker run --env <key>=<value> 來(lái)更改環(huán)境變量的值。
如果環(huán)境變量只在構(gòu)建期間需要净捅,請(qǐng)考慮為單個(gè)命令設(shè)置一個(gè)值:
RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y ...
或者使用 ARG疑枯,它不會(huì)保留在最終鏡像中:
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y ...
八、ADD
復(fù)制新文件蛔六、目錄或遠(yuǎn)程文件 URL <src> 神汹,并將它們添加到 <dest> 中庆捺。
<src> 可以指定多個(gè)資源,但如果它們是文件或目錄屁魏,則它們的路徑被解釋為相對(duì)于構(gòu)建上下文的源滔以,也就是 WORKDIR。
每個(gè)都 <src> 可能包含通配符氓拼,匹配將使用 Go 的 filepath.Match 規(guī)則你画。例如:
添加所有以“hom”開(kāi)頭的文件:
ADD hom* /mydir/
在下面的示例中,? 被替換為任何單個(gè)字符桃漾,例如“home.txt”坏匪。
ADD hom?.txt /mydir/
<dest> 是一個(gè)絕對(duì)路徑,或相對(duì) WORKDIR 的相對(duì)路徑撬统。
九适滓、COPY
語(yǔ)法同ADD一致,復(fù)制拷貝文件恋追。
COPY 指令和 ADD 指令的唯一區(qū)別在于:是否支持從遠(yuǎn)程URL獲取資源凭迹。COPY 指令只能從執(zhí)行 docker build 所在的主機(jī)上讀取資源并復(fù)制到鏡像中。而 ADD 指令還支持通過(guò) URL 從遠(yuǎn)程服務(wù)器讀取資源并復(fù)制到鏡像中苦囱。
相同需求時(shí)嗅绸,推薦使用 COPY 指令。ADD 指令更擅長(zhǎng)讀取本地tar文件并解壓縮撕彤。
十鱼鸠、ENTRYPOINT
ENTRYPOINT 和 CMD 一樣,都是在指定容器啟動(dòng)程序及參數(shù)羹铅,不過(guò)它不會(huì)被 docker run 的命令行參數(shù)指定的指令所覆蓋蚀狰。如果要覆蓋的話,需要通過(guò) docker run --entrypoint 來(lái)指定职员。
它有2種格式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
指定了 ENTRYPOINT 后麻蹋, CMD 的內(nèi)容作為參數(shù)傳給 ENTRYPOINT 指令,實(shí)際執(zhí)行時(shí)廉邑,將變?yōu)椋?
<ENTRYPOINT> <CMD>
十一哥蔚、VOLUME
創(chuàng)建一個(gè)具有指定名稱的掛載數(shù)據(jù)卷。
VOLUME ["/var/log/"]
VOLUME /var/log
它的主要作用是:
避免重要的數(shù)據(jù)蛛蒙,因容器重啟而丟失
避免容器不斷變大
十二糙箍、ARG
定義變量,與 ENV 作用相同牵祟,不過(guò) ARG 變量不會(huì)像 ENV 變量那樣持久化到構(gòu)建好的鏡像中深夯。
ARG <name>[=<default value>]
Docker 有一組預(yù)定義的 ARG 變量,您可以在 Dockerfile 中沒(méi)有相應(yīng)指令的情況下使用這些變量。
HTTP_PROXY
http_proxy
HTTPS_PROXY
https_proxy
FTP_PROXY
ftp_proxy
NO_PROXY
no_proxy
要使用這些咕晋,請(qǐng)使用 --build-arg 標(biāo)志在命令行上傳遞它們雹拄,例如:
docker build --build-arg HTTPS_PROXY=https://my-proxy.example.com .
十三、ONBUILD
將一個(gè)觸發(fā)指令添加到鏡像中掌呜,以便稍后在該鏡像用作另一個(gè)構(gòu)建的基礎(chǔ)時(shí)執(zhí)行滓玖。也就是另外一個(gè) dockerfile FROM 了這個(gè)鏡像的時(shí)候執(zhí)行。
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
十四质蕉、STOPSIGNAL
設(shè)置將發(fā)送到容器退出的系統(tǒng)調(diào)用信號(hào)势篡。該信號(hào)可以是與內(nèi)核系統(tǒng)調(diào)用表中的位置匹配的有效無(wú)符號(hào)數(shù),例如 9模暗,或格式為 SIGNAME 的信號(hào)名稱禁悠,例如 SIGKILL。
STOPSIGNAL signal
默認(rèn)的 stop-signal 是 SIGTERM兑宇,在 docker stop 的時(shí)候會(huì)給容器內(nèi) PID 為 1 的進(jìn)程發(fā)送這個(gè) signal碍侦,通過(guò) --stop-signal 可以設(shè)置自己需要的 signal,主要目的是為了讓容器內(nèi)的應(yīng)用程序在接收到 signal 之后可以先處理一些事物隶糕,實(shí)現(xiàn)容器的平滑退出瓷产,如果不做任何處理,容器將在一段時(shí)間之后強(qiáng)制退出若厚,會(huì)造成業(yè)務(wù)的強(qiáng)制中斷拦英,默認(rèn)時(shí)間是 10s蜒什。
十五测秸、HEALTHCHECK
用于指定某個(gè)程序或者指令來(lái)監(jiān)控 Docker 容器服務(wù)的運(yùn)行狀態(tài)。該 HEALTHCHECK 指令有兩種形式:
HEALTHCHECK [OPTIONS] CMD command(通過(guò)在容器內(nèi)運(yùn)行命令來(lái)檢查容器健康狀況)
HEALTHCHECK NONE(禁用從基礎(chǔ)鏡像繼承的任何健康檢查)
十六灾常、SHELL
覆蓋用于命令的 shell 形式的默認(rèn) shell霎冯。Linux 上的默認(rèn) shell 是 ["/bin/sh", "-c"],Windows 上是 ["cmd", "/S", "/C"]钞瀑。
SHELL ["executable", "parameters"]
該 SHELL 指令在 Windows 上特別有用沈撞,因?yàn)?Windows 有兩種常用且截然不同的本機(jī) SHELL:cmd 和 powershell,以及可用的備用 shell雕什,包括 sh。該 SHELL 指令可以出現(xiàn)多次。每條 SHELL 指令都會(huì)覆蓋所有先前的 SHELL 指令逆害,并影響所有后續(xù)指令嵌削。
十七、WORKDIR
工作目錄偿警,如果 WORKDIR 不存在躏救,即使它沒(méi)有在后續(xù) Dockerfile 指令中使用,它也會(huì)被創(chuàng)建。
docker build 構(gòu)建鏡像過(guò)程中盒使,每一個(gè) RUN 命令都會(huì)新建一層崩掘。只有通過(guò) WORKDIR 創(chuàng)建的目錄才會(huì)一直存在。
可以設(shè)置多個(gè) WORKDIR少办,如果提供了相對(duì)路徑苞慢,它將相對(duì)于前一條 WORKDIR 指令的路徑。例如:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
最終 pwd 命令的輸出是 /a/b/c英妓。
該 WORKDIR 指令可以解析先前使用 ENV枉疼,例如:
ENV DIRPATH=/path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd
最終 pwd 命令的輸出是 /path/$DIRNAME。
十八鞋拟、USER
設(shè)置用戶名(或 UID)和可選的用戶組(或 GID)骂维。
USER <user>[:<group>]
USER <UID>[:<GID>]
例子
# 指明構(gòu)建的新鏡像是來(lái)自于 centos:7 基礎(chǔ)鏡像
FROM centos:7
# 通過(guò)鏡像標(biāo)簽聲明了作者信息
LABEL maintainer="mrhelloworld.com"
# 設(shè)置工作目錄
WORKDIR /usr/local
# 新鏡像構(gòu)建成功以后創(chuàng)建指定目錄
RUN mkdir -p /usr/local/java && mkdir -p /usr/local/tomcat
# 拷貝文件到鏡像中并解壓
ADD jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java
ADD apache-tomcat-9.0.37.tar.gz /usr/local/tomcat
# 暴露容器運(yùn)行時(shí)的 8080 監(jiān)聽(tīng)端口給外部
EXPOSE 8080
# 設(shè)置容器內(nèi) JAVA_HOME 環(huán)境變量
ENV JAVA_HOME /usr/local/java/jdk-11.0.6/
ENV PATH $PATH:$JAVA_HOME/bin
# 啟動(dòng)容器時(shí)啟動(dòng) tomcat 并查看 tomcat 日志信息
ENTRYPOINT /usr/local/tomcat/apache-tomcat-9.0.37/bin/startup.sh && tail -f /usr/local/tomcat/apache-tomcat-9.0.37/logs/catalina.out
復(fù)制代碼
docker compose docker-compose.yml
version: '3.7' # 指定 compose 文件的版本
services: # 定義所有的 service 信息, services 下面的第一級(jí)別的 key 既是一個(gè) service 的名稱
aaa: #服務(wù)aaa
build: # 與image二選一,指定包含構(gòu)建上下文的路徑, 或作為一個(gè)對(duì)象贺纲,該對(duì)象具有 context 和指定的 dockerfile 文件以及 args 參數(shù)值
context: . # context: 指定 Dockerfile 文件所在的路徑
dockerfile: Dockerfile # dockerfile: 指定 context 指定的目錄下面的 Dockerfile 的名稱(默認(rèn)為 Dockerfile)
args: # args: Dockerfile 在 build 過(guò)程中需要的參數(shù) (等同于 docker container build --build-arg 的作用)
JAR_FILE: service.jar
cache_from: # v3.2中新增的參數(shù), 指定緩存的鏡像列表 (等同于 docker container build --cache_from 的作用)
labels: # v3.3中新增的參數(shù), 設(shè)置鏡像的元數(shù)據(jù) (等同于 docker container build --labels 的作用)
shm_size: # v3.5中新增的參數(shù), 設(shè)置容器 /dev/shm 分區(qū)的大小 (等同于 docker container build --shm-size 的作用)
#ports:
# - "80:80"
# - "443:443"
ports: # 建立宿主機(jī)與容器間的端口映射關(guān)系航闺,上面是短語(yǔ)法寫法,下面是長(zhǎng)語(yǔ)法寫法
- target: 80 # 容器端口
published: 80 # 宿主機(jī)端口
protocol: tcp # 協(xié)議類型
mode: host # host在每個(gè)節(jié)點(diǎn)上發(fā)布主機(jī)端口猴誊,ingress 對(duì)于集群模式端口進(jìn)行負(fù)載均衡
- target: 443
published: 443
protocol: tcp
mode: host
command: # 覆蓋容器啟動(dòng)后默認(rèn)執(zhí)行的命令, 支持 shell 格式和 [] 格式
configs: # 不知道怎么用
cgroup_parent: # 為容器指定父 cgroup 組潦刃,意味著將繼承該組的資源限制。
container_name: # 指定容器的名稱 (等同于 docker run --name 的作用)
deploy: # v3 版本以上, 指定與部署和運(yùn)行服務(wù)相關(guān)的配置, deploy 部分是 docker stack 使用的, docker stack 依賴 docker swarm
endpoint_mode: vip # v3.3 版本中新增的功能, 指定服務(wù)暴露的方式
# vip # Docker 為該服務(wù)分配了一個(gè)虛擬 IP(VIP), 作為客戶端的訪問(wèn)服務(wù)的地址
# dnsrr # DNS輪詢, Docker 為該服務(wù)設(shè)置 DNS 條目, 使得服務(wù)名稱的 DNS 查詢返回一個(gè) IP 地址列表, 客戶端直接訪問(wèn)其中的一個(gè)地址
labels: # 指定服務(wù)的標(biāo)簽懈叹,這些標(biāo)簽僅在服務(wù)上設(shè)置
mode: replicated # 指定 deploy 的模式
# global # 每個(gè)集群節(jié)點(diǎn)都只有一個(gè)容器
# replicated # 用戶可以指定集群中容器的數(shù)量(默認(rèn))
placement:
constraints:
- node.role==manager # 不知道怎么用
replicas: 1 # deploy 的 mode 為 replicated 時(shí), 指定容器副本的數(shù)量
resources: # 資源限制
limits: # 設(shè)置容器的資源限制
cpus: "0.5" # 設(shè)置該容器最多只能使用 50% 的 CPU
memory: 50M # 設(shè)置該容器最多只能使用 50M 的內(nèi)存空間
reservations: # 設(shè)置為容器預(yù)留的系統(tǒng)資源(隨時(shí)可用)
cpus: "0.2" # 為該容器保留 20% 的 CPU
memory: 20M # 為該容器保留 20M 的內(nèi)存空間
restart_policy: # 定義容器重啟策略, 用于代替 restart 參數(shù)
condition: on-failure # 定義容器重啟策略(接受三個(gè)參數(shù))
# none: # 不嘗試重啟
# on-failure: # 只有當(dāng)容器內(nèi)部應(yīng)用程序出現(xiàn)問(wèn)題才會(huì)重啟
# any : # 無(wú)論如何都會(huì)嘗試重啟(默認(rèn))
delay: 10s # 嘗試重啟的間隔時(shí)間(默認(rèn)為 0s)
max_attempts: 6 # 嘗試重啟次數(shù)(默認(rèn)一直嘗試重啟)
window: 120s # 檢查重啟是否成功之前的等待時(shí)間(即如果容器啟動(dòng)了, 隔多少秒之后去檢測(cè)容器是否正常, 默認(rèn) 0s)
update_config: # 用于配置滾動(dòng)更新配置
parallelism: 1 # 一次性更新的容器數(shù)量
delay: 10s # 更新一組容器之間的間隔時(shí)間
order: stop-first # v3.4 版本中新增的參數(shù), 回滾期間的操作順序
# stop-first #舊任務(wù)在啟動(dòng)新任務(wù)之前停止(默認(rèn))
# start-first #首先啟動(dòng)新任務(wù), 并且正在運(yùn)行的任務(wù)暫時(shí)重疊
failure_action: continue # 定義更新失敗的策略
# continue # 繼續(xù)更新
# rollback # 回滾更新
# pause # 暫停更新(默認(rèn))
# monitor # 每次更新后的持續(xù)時(shí)間以監(jiān)視更新是否失敗(單位: ns|us|ms|s|m|h) (默認(rèn)為0)
max_failure_ratio: 0 # 回滾期間容忍的失敗率(默認(rèn)值為0)
rollback_config: # v3.7 版本中新增的參數(shù), 用于定義在 update_config 更新失敗的回滾策略
parallelism: 1 # 一次回滾的容器數(shù), 如果設(shè)置為0, 則所有容器同時(shí)回滾
delay: 0 # 每個(gè)組回滾之間的時(shí)間間隔(默認(rèn)為0)
failure_action: continue # 定義回滾失敗的策略
# continue # 繼續(xù)回滾
# pause # 暫凸愿埽回滾
monitor: 10s # 每次回滾任務(wù)后的持續(xù)時(shí)間以監(jiān)視失敗(單位: ns|us|ms|s|m|h) (默認(rèn)為0)
max_failure_ratio: 0 # 回滾期間容忍的失敗率(默認(rèn)值0)
order: stop-first # 回滾期間的操作順序
# stop-first # 舊任務(wù)在啟動(dòng)新任務(wù)之前停止(默認(rèn))
# start-first # 首先啟動(dòng)新任務(wù), 并且正在運(yùn)行的任務(wù)暫時(shí)重疊
devices: # 指定設(shè)備映射列表 (等同于 docker run --device 的作用)
depends_on: #依賴容器
- db
- redis
dns: # 設(shè)置 DNS 地址(等同于 docker run --dns 的作用)
dns_search: # 設(shè)置 DNS 搜索域(等同于 docker run --dns-search 的作用)
tmpfs: # v2 版本以上, 掛載目錄到容器中, 作為容器的臨時(shí)文件系統(tǒng)(等同于 docker run --tmpfs 的作用, 在使用 swarm 部署時(shí)將忽略該選項(xiàng))
entrypoint: # 覆蓋容器的默認(rèn) entrypoint 指令 (等同于 docker run --entrypoint 的作用)
env_file: # 從指定文件中讀取變量設(shè)置為容器中的環(huán)境變量, 可以是單個(gè)值或者一個(gè)文件列表, 如果多個(gè)文件中的變量重名則后面的變量覆蓋前面的變量, environment 的值覆蓋 env_file 的值
RACK_ENV=development
volumes: # 定義容器和宿主機(jī)的數(shù)據(jù)卷映射關(guān)系
- "/u01:/u01" # 映射容器內(nèi)的 /u01 到宿主機(jī)的 /u01目錄
environment: # 設(shè)置環(huán)境變量, environment 的值可以覆蓋 env_file 的值 (等同于 docker run --env 的作用)
- TZ=Asia/Shanghai
- PORT_TO_EXPOSE=80
- LOG_PATH=/opt/proj/logs
- PROFILES_ACTIVE=prod
expose: # 暴露端口, 但是不能和宿主機(jī)建立映射關(guān)系, 類似于 Dockerfile 的 EXPOSE 指令
external_links: # 連接不在 docker-compose.yml 中定義的容器或者不在 compose 管理的容器(docker run 啟動(dòng)的容器, 在 v3 版本中使用 swarm 部署時(shí)將忽略該選項(xiàng))
extra_hosts: # 添加 host 記錄到容器中的 /etc/hosts 中 (等同于 docker run --add-host 的作用)
healthcheck: # v2.1 以上版本, 定義容器健康狀態(tài)檢查, 類似于 Dockerfile 的 HEALTHCHECK 指令
test: NONE # 檢查容器檢查狀態(tài)的命令, 該選項(xiàng)必須是一個(gè)字符串或者列表, 第一項(xiàng)必須是 NONE, CMD 或 CMD-SHELL, 如果其是一個(gè)字符串則相當(dāng)于 CMD-SHELL 加該字符串
# NONE # 禁用容器的健康狀態(tài)檢測(cè)
# CMD # test: ["CMD", "curl", "-f", "http://localhost"]
# CMD-SHELL # test: ["CMD-SHELL", "curl -f http://localhost || exit 1"] 或者 test: curl -f https://localhost || exit 1
interval: 1m30s # 每次檢查之間的間隔時(shí)間
timeout: 10s # 運(yùn)行命令的超時(shí)時(shí)間
retries: 3 # 重試次數(shù)
start_period: 40s # v3.4 以上新增的選項(xiàng), 定義容器啟動(dòng)時(shí)間間隔
disable: true # true 或 false, 表示是否禁用健康狀態(tài)檢測(cè)和 test: NONE 相同
image: # 指定 docker 鏡像, 可以是遠(yuǎn)程倉(cāng)庫(kù)鏡像澄成、本地鏡像
init: # v3.7 中新增的參數(shù), true 或 false 表示是否在容器中運(yùn)行一個(gè) init, 它接收信號(hào)并傳遞給進(jìn)程
isolation: # 隔離容器技術(shù), 在 Linux 中僅支持 default 值
labels: # 使用 Docker 標(biāo)簽將元數(shù)據(jù)添加到容器, 與 Dockerfile 中的 LABELS 類似
links: # 鏈接到其它服務(wù)中的容器, 該選項(xiàng)是 docker 歷史遺留的選項(xiàng), 目前已被用戶自定義網(wǎng)絡(luò)名稱空間取代, 最終有可能被廢棄 (在使用 swarm 部署時(shí)將忽略該選項(xiàng))
logging: # 設(shè)置容器日志服務(wù)
driver: # 指定日志記錄驅(qū)動(dòng)程序, 默認(rèn) json-file (等同于 docker run --log-driver 的作用)
options: # 指定日志的相關(guān)參數(shù) (等同于 docker run --log-opt 的作用)
max-size: # 設(shè)置單個(gè)日志文件的大小, 當(dāng)?shù)竭_(dá)這個(gè)值后會(huì)進(jìn)行日志滾動(dòng)操作
max-file: # 日志文件保留的數(shù)量
network_mode: # 指定網(wǎng)絡(luò)模式 (等同于 docker run --net 的作用, 在使用 swarm 部署時(shí)將忽略該選項(xiàng))
networks: # 將容器加入指定網(wǎng)絡(luò) (等同于 docker network connect 的作用), networks 可以位于 compose 文件頂級(jí)鍵和 services 鍵的二級(jí)鍵
aliases: # 同一網(wǎng)絡(luò)上的容器可以使用服務(wù)名稱或別名連接到其中一個(gè)服務(wù)的容器
ipv4_address # IP V4 格式
ipv6_address # IP V6 格式
例1
version: '3.9'
services:
pms-tsssd-service:
build:
context: .
args:
JAR_FILE: servsssisce.jar
dockerfile: Dockerfile
image: pms-td-ssssservice:1.0.0
restart: always
ports:
- "9199:80"
environment:
- TZ=Asia/Shanghai
- PORT_TO_EXPOSE=80
- LOG_PATH=/opt/proj/logs
- PROFILES_ACTIVE=test
volumes:
## - /opt/pro/pms-td-service.jar:/home/admin/service.jar
- /Users/yuan/Desktop/nc/pms-td-service.jar:/home/admin/service.jar
- /Users/yuan/Desktop/nc/logs:/opt/proj/logs
# - /opt/pe/data/logs:/opt/proj/logs
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.role==manager
resources:
limits:
cpus: '2'
memory: 4096M
# reservations:
# cpus: '2'
# memory: 1024M
update_config:
parallelism: 1
delay: 10s
order: stop-first
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 6
window: 120s
# networks:
# host:
# external: true
# default:
# external:
# name: pldds_nctransfer
version: '3.7' # 版本必須3.0及以上胧洒,否則無(wú)法使用docker-stack 運(yùn)行
services: # 定義 service 信息
emcs-nginx:
image: "***/nginx:test" # 使用指定的 docker 鏡像
#ports:
# - "80:80"
# - "443:443"
ports: # 建立宿主機(jī)與容器間的端口映射關(guān)系,上面是短語(yǔ)法寫法墨状,下面是長(zhǎng)語(yǔ)法寫法
- target: 80 # 容器端口
published: 80 # 宿主機(jī)端口
protocol: tcp # 協(xié)議類型
mode: host # host在每個(gè)節(jié)點(diǎn)上發(fā)布主機(jī)端口卫漫,ingress 對(duì)于集群模式端口進(jìn)行負(fù)載均衡
- target: 443
published: 443
protocol: tcp
mode: host
volumes: # 定義容器和宿主機(jī)的數(shù)據(jù)卷映射關(guān)系
- "/u01:/u01" # 映射容器內(nèi)的 /u01 到宿主機(jī)的 /u01目錄
environment: # 設(shè)置環(huán)境變量
TZ: Asia/Shanghai # 設(shè)置時(shí)區(qū)為上海
deploy: # 指定與部署和運(yùn)行服務(wù)相關(guān)的配置, deploy部分是docker stack使用的, docker stack依賴docker swarm
mode: replicated # 指定模式:global每個(gè)集群節(jié)點(diǎn)都只有一個(gè)容器,
# replicated用戶可以指定集群中容器的數(shù)量(默認(rèn))
replicas: 1 # deploy的mode為 replicated 時(shí), 指定容器副本的數(shù)量
update_config: # 用于配置滾動(dòng)更新的配置
parallelism: 1 # 一次性更新的容器數(shù)量
delay: 10s # 更新一組容器之間的間隔10s
order: stop-first # 指定回滾期間的操作順序:stop-first舊任務(wù)在啟動(dòng)新任務(wù)之前停止(默認(rèn))肾砂,
# start-first首先啟動(dòng)新任務(wù), 并且正在運(yùn)行的任務(wù)暫時(shí)重疊
restart_policy: # 定義容器重啟策略, 用于代替 restart 參數(shù)
condition: on-failure # 定義容器重啟策略(接受三個(gè)參數(shù)):
# none不嘗試重啟列赎;any無(wú)論如何都會(huì)嘗試重啟(默認(rèn))
# on-failure只有當(dāng)容器內(nèi)部應(yīng)用程序出現(xiàn)問(wèn)題才會(huì)重啟
emcs-front: # 第二個(gè)服務(wù)
image: "***/front"
volumes:
- "/u01/log:/u01/log"
environment:
TZ: Asia/Shanghai
deploy:
mode: replicated
replicas: 1
update_config:
parallelism: 1
delay: 20s
order: stop-first
restart_policy:
condition: on-failure
docker-compose 命令
docker-compose up
用于編排并啟動(dòng)容器,如果docker-compose.yaml文件中service用的是build 的話镐确,還會(huì)先構(gòu)建一個(gè)鏡像包吝。
-d 表示在后臺(tái)運(yùn)行容器
docker-compose up -d
docker-compose ps
用于查看容器的運(yùn)行情況,類似linux下的ps命令源葫。
docker-compose <stop|start|restart>
停止|啟動(dòng)|重新啟動(dòng) 容器服務(wù)诗越,可以指定特定的服務(wù)
docker-compose stop
停止所有
docker-compose stop nginx
停止nginx服務(wù),這個(gè)服務(wù)是在docker-compose.yaml里面配置的臼氨。
docker-compose restart nginx
重啟nginx