docker file && docker compose

總覽

先簡(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>]

d894585a9f572c7884b36f2396eaffea_a5d1a5433a7a25ead69e08665094d84f.png

例子
# 指明構(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掺喻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌感耙,老刑警劉巖褂乍,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異即硼,居然都是意外死亡逃片,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門只酥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)褥实,“玉大人,你說(shuō)我怎么就攤上這事裂允∷鹄耄” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵绝编,是天一觀的道長(zhǎng)僻澎。 經(jīng)常有香客問(wèn)我,道長(zhǎng)十饥,這世上最難降的妖魔是什么窟勃? 我笑而不...
    開(kāi)封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮逗堵,結(jié)果婚禮上秉氧,老公的妹妹穿的比我還像新娘。我一直安慰自己蜒秤,他們只是感情好汁咏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著垦藏,像睡著了一般梆暖。 火紅的嫁衣襯著肌膚如雪伞访。 梳的紋絲不亂的頭發(fā)上掂骏,一...
    開(kāi)封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音厚掷,去河邊找鬼弟灼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛冒黑,可吹牛的內(nèi)容都是我干的田绑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼抡爹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼掩驱!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤欧穴,失蹤者是張志新(化名)和其女友劉穎民逼,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涮帘,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拼苍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了调缨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疮鲫。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖弦叶,靈堂內(nèi)的尸體忽然破棺而出俊犯,到底是詐尸還是另有隱情,我是刑警寧澤伤哺,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布瘫析,位于F島的核電站,受9級(jí)特大地震影響默责,放射性物質(zhì)發(fā)生泄漏贬循。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一桃序、第九天 我趴在偏房一處隱蔽的房頂上張望杖虾。 院中可真熱鬧,春花似錦媒熊、人聲如沸奇适。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嚷往。三九已至,卻和暖如春柠衅,著一層夾襖步出監(jiān)牢的瞬間皮仁,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工菲宴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贷祈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓喝峦,卻偏偏與公主長(zhǎng)得像势誊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谣蠢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容