1. 什么是微服務
在介紹微服務時,首先得先理解什么是微服務圆丹,
顧名思義滩愁,微服務得從兩個方面去理解,什么是"微"辫封、什么是"服務"硝枉,
微 狹義來講就是體積小、單個服務的設計倦微。 而所謂服務妻味,一定要區(qū)別于系統(tǒng),
服務一個或者一組相對較小且獨立的功能單元欣福,是用戶可以感知最小功能集责球。
微服務,關鍵其實不僅僅是微服務本身,而是系統(tǒng)要提供一套基礎的架構雏逾,這種架構使得微服務可以獨立的部署裁良、運行、升級校套,
不僅如此价脾,這個系統(tǒng)架構還讓微服務與微服務之間在結構上“松耦合”,
而在功能上則表現(xiàn)為一個統(tǒng)一的整體笛匙。這種所謂的“統(tǒng)一的整體”表現(xiàn)出來的是統(tǒng)一風格的界面侨把,統(tǒng)一的權限管理,
統(tǒng)一的安全策略妹孙,統(tǒng)一的上線過程秋柄,統(tǒng)一的日志和審計方法,統(tǒng)一的調度方式蠢正,統(tǒng)一的訪問入口等等骇笔。
2. 微服務由來
微服務最早由Martin Fowler與James Lewis于2014年共同提出,微服務架構風格是一種使用一套小服務來開發(fā)單個應用的方式途徑嚣崭,每個服務運行在自己的進程中笨触,并使用輕量級機制通信,通常是HTTP API雹舀,這些服務基于業(yè)務能力構建芦劣,并能夠通過自動化部署機制來獨立部署,這些服務使用不同的編程語言實現(xiàn)说榆,以及不同數(shù)據(jù)存儲技術虚吟,并保持最低限度的集中式管理。
3. 微服務的優(yōu)勢
IT架構一直從all in one到近兩年熱門的微服務架構签财,技術不斷進步串慰,微服務架構模式(Microservice Architect Pattern)開始被越來越多的企業(yè)所接受,那么究竟什么是微服務架構唱蒸?微服務架構模式有什么優(yōu)點呢邦鲫?
從整個IT技術發(fā)展趨勢來看,我們可以看到無論是硬件油宜、還是軟件掂碱、還是基礎架構都在朝著輕量化的方向發(fā)展。云計算的發(fā)展更讓資源的調控靈活性和部署速度都有所提高慎冤,微服務就是一項在云中部署應用和服務的技術疼燥。采用化整為零的概念,將復雜的IT部署蚁堤,通過功能化醉者、原子化分解但狭,形成一種松散耦合的組件,讓其更容易升級和擴展撬即。
ThoughtWorks的首席科學家立磁,馬丁·福勒先生對微服務做出了這樣的定義:“微服務架構是一種架構模式,它提倡將單一應用程序劃分成一組小的服務剥槐,服務之間互相協(xié)調唱歧、互相配合,為用戶提供最終價值粒竖。每個服務運行在其獨立的進程中颅崩,服務與服務間采用輕量級的通信機制互相溝通(通常是基于HTTP協(xié)議的RESTful API)。每個服務都圍繞著具體業(yè)務進行構建蕊苗,并且能夠被獨立的部署到生產環(huán)境沿后、類生產環(huán)境等。另外朽砰,應當盡量避免統(tǒng)一的尖滚、集中式的服務管理機制,對具體的一個服務而言瞧柔,應根據(jù)業(yè)務上下文漆弄,選擇合適的語言、工具對其進行構建非剃≈寐撸”
微服務架構是一項在云中部署應用和服務的技術
總的來說推沸,可以將微服務架構的優(yōu)勢歸結為以下幾點:
1备绽、復雜度可控
在all in one的狀態(tài)下,容易造成盲人摸象的狀態(tài)鬓催,造成不必要的數(shù)據(jù)孤島肺素。而微服務架構通過分解單體式應用為多個服務方法,讓復雜性可控宇驾。為了實現(xiàn)同一功能倍靡,應用被分解為多個可管理的分支或服務,通過微服務架構模式课舍,讓復雜的功能塌西,通過模塊化的方式呈現(xiàn)出來,讓單個服務更容易開發(fā)和維護筝尾。
避免“盲人摸象”
2捡需、靈活可擴展
靈活性是基于微服務架構模式使得每個服務獨立擴展。微服務架構下筹淫,技術選型是去中心化的站辉。在這種模式下,每個團隊都可以根據(jù)自身服務的需求和行業(yè)發(fā)展狀況做出自己的判斷,選擇適合的技術棧饰剥。
3殊霞、獨立部署
由于微服務具備獨立的運行進程,所以每個微服務也可以獨立部署汰蓉。這樣绷蹲,當某個微服務發(fā)生變更時無需編譯、部署整個應用顾孽,讓發(fā)布更高效瘸右,右下縮短應用交付周期。UI團隊可以采用AB測試岩齿,快速的部署變化太颤。微服務架構模式使得持續(xù)化部署成為可能。
4盹沈、開發(fā)針對性更強
眾所周知龄章,在單塊架構系統(tǒng)下,新人的培養(yǎng)周期很長乞封,需要花費大量時間了解本地開發(fā)環(huán)境做裙。而微服務架構模式使得每個服務獨立擴展,開發(fā)運維人員也不需要在花費一個月的時間去熟悉本地環(huán)境肃晚,而只需要了解自己所處的模塊狀態(tài)即可锚贱。
5、降低TCO
在傳統(tǒng)IT架構中关串,即單塊架構系統(tǒng)中拧廊,是以技術分層,譬如邏輯層晋修、數(shù)據(jù)層等吧碾。但隨著市場需求的不斷變化,用戶需求住家個性化墓卦,開發(fā)周期需要越來越短倦春,產品的生命周期也開始變短,單塊架構系統(tǒng)開始面臨挑戰(zhàn)落剪。無論是開發(fā)還是維護成本太高睁本。
相較而言,微服務架構模式下忠怖,當某一組件發(fā)生故障時呢堰,不會發(fā)現(xiàn)單塊架構系統(tǒng)的進程內擴散等弊端,故障會被隔離在單個服務中脑又。
Docker微服務
Docker 是一個容器工具暮胧,提供虛擬環(huán)境锐借。docker改變了我們對軟件的認識。
站在 Docker 的角度往衷,軟件就是容器的組合:業(yè)務邏輯容器钞翔、數(shù)據(jù)庫容器、儲存容器席舍、隊列容器......Docker 使得軟件可以拆分成若干個標準化容器布轿,然后像搭積木一樣組合起來。
這正是微服務(microservices)的思想:軟件把任務外包出去来颤,讓各種外部服務完成這些任務汰扭,軟件本身只是底層服務的調度中心和組裝層。
微服務很適合用 Docker 容器實現(xiàn)福铅,每個容器承載一個服務萝毛。一臺計算機同時運行多個容器,從而就能很輕松地模擬出復雜的微服務架構滑黔。
配置文件
- Dockerfile
DockerFile分為四部分組成:基礎鏡像信息笆包、維護者信息、鏡像操作指令和容器啟動時執(zhí)行指令略荡。例如:
#第一行必須指令基于的基礎鏡像
From ubutu
#維護者信息
MAINTAINER docker_user docker_user@mail.com
#鏡像的操作指令
RUN apt-get update && apt-get install -y ngnix
RUN echo "\ndaemon off;">>/etc/ngnix/nignix.conf
#容器啟動時執(zhí)行指令
CMD /usr/sbin/ngnix
介紹一下一些常用的命令:
1庵佣、From指令
From 或者From :
DockerFile第一條必須為From指令。如果同一個DockerFile創(chuàng)建多個鏡像時汛兜,可使用多個From指令(每個鏡像一次)
2巴粪、MAINTAINER
格式為maintainer ,指定維護者的信息
3粥谬、RUN
格式為Run 或者Run [“executable” ,”Param1”, “param2”]
前者在shell終端上運行肛根,即/bin/sh -C,后者使用exec運行帝嗡。例如:RUN [“/bin/bash”, “-c”,”echo hello”]
每條run指令在當前基礎鏡像執(zhí)行晶通,并且提交新鏡像。當命令比較長時哟玷,可以使用“/”換行。
4一也、CMD指令
支持三種格式:
CMD [“executable” ,”Param1”, “param2”]使用exec執(zhí)行巢寡,推薦
CMD command param1 param2,在/bin/sh上執(zhí)行
CMD [“Param1”, “param2”] 提供給ENTRYPOINT做默認參數(shù)椰苟。
每個容器只能執(zhí)行一條CMD命令抑月,多個CMD命令時,只最后一條被執(zhí)行舆蝴。
5谦絮、EXPOSE
格式為 EXPOSE […] 题诵。
告訴Docker服務端容器暴露的端口號,供互聯(lián)系統(tǒng)使用层皱。在啟動Docker時性锭,可以通過-P,主機會自動分配一個端口號轉發(fā)到指定的端口。使用-P叫胖,則可以具體指定哪個本地端口映射過來
例如:
EXPOSE 22 80 8443
6草冈、ENV
格式為 ENV 。 指定一個環(huán)境變量瓮增,會被后續(xù) RUN 指令使用怎棱,并在容器運行時保持。
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH1234
7绷跑、ADD
格式為 ADD 拳恋。
該命令將復制指定的 到容器中的 。 其中 可以是Dockerfile所在目錄的一個相對路徑砸捏;也可以是一個URL诅岩;還可以是一個tar文件(自動解壓為目錄)。則带膜。
8吩谦、COPY
格式為 COPY 。
復制本地主機的 (為Dockerfile所在目錄的相對路徑)到容器中的 膝藕。
當使用本地目錄為源目錄時式廷,推薦使用 COPY 。
9芭挽、ENTRYPOINT
兩種格式:
ENTRYPOINT [“executable”, “param1”, “param2”]
ENTRYPOINT command param1 param2 (shell中執(zhí)行)滑废。
配置容器啟動后執(zhí)行的命令,并且不可被 docker run 提供的參數(shù)覆蓋袜爪。
每個Dockerfile中只能有一個 ENTRYPOINT 蠕趁,當指定多個時,只有最后一個起效辛馆。
10俺陋、VOLUME
格式為 VOLUME [“/data”] 。
創(chuàng)建一個可以從本地主機或其他容器掛載的掛載點昙篙,一般用來存放數(shù)據(jù)庫和需要保持的數(shù)據(jù)等腊状。
11、USER
格式為 USER daemon 苔可。
指定運行容器時的用戶名或UID缴挖,后續(xù)的 RUN 也會使用指定用戶。
當服務不需要管理員權限時焚辅,可以通過該命令指定運行用戶映屋。并且可以在之前創(chuàng)建所需要的用戶苟鸯,例如: RUN groupadd -r postgres && useradd -r -g postgres postgres 。要臨時獲取管理員權限可以使用 gosu 棚点,而不推薦 sudo 早处。
12、WORKDIR
格式為 WORKDIR /path/to/workdir 乙濒。
為后續(xù)的 RUN 陕赃、 CMD 、 ENTRYPOINT 指令配置工作目錄颁股。
可以使用多個 WORKDIR 指令么库,后續(xù)命令如果參數(shù)是相對路徑,則會基于之前命令指定的路徑甘有。例如
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
則最終路徑為 /a/b/c 诉儒。
13、ONBUILD
格式為 ONBUILD [INSTRUCTION] 亏掀。
配置當所創(chuàng)建的鏡像作為其它新創(chuàng)建鏡像的基礎鏡像時忱反,所執(zhí)行的操作指令。
例如滤愕,Dockerfile使用如下的內容創(chuàng)建了鏡像 image-A 温算。
[…]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build –dir /app/src
[…]
如果基于A創(chuàng)建新的鏡像時,新的Dockerfile中使用 FROM image-A 指定基礎鏡像時间影,會自動執(zhí)行 ONBUILD 指令內容注竿,等價于在后面添加了兩條指令。
FROM image-A
#Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src
使用 ONBUILD 指令的鏡像魂贬,推薦在標簽中注明巩割,例如 ruby:1.9-onbuild 。
1234567
compose
編排
編排(orchestration)付燥,指自動配置宣谈、協(xié)作和管理服務的過程,在 Docker 中键科,編排用來描述一組實踐過程闻丑,這個過程會管理運行在多個 Docker 里的應用,這些 Docker 容器也可能運行在不同的宿主機上萝嘁。
docker-compose
Docker 編排工具 Docker Compose 梆掸,由 Python 編寫。使用 Docker Compose 牙言,可以用一個 YAML 文件定義一組要啟動的容器,以及容器運行時的屬性怪得。Docker Compose 稱這些容器為“服務”:
容器通過某些方法并制定一些運行時的屬性來和其他容器產生交互咱枉。
默認的模板文件是 docker-compose.yml卑硫,其中定義的每個服務都必須通過 image 指令指定鏡像或 build 指令(需要 Dockerfile)來自動構建。
其它大部分指令都跟 docker run 中的類似蚕断。
如果使用 build 指令欢伏,在 Dockerfile 中設置的選項(例如:CMD, EXPOSE, VOLUME, ENV 等) 將會自動被獲取,無需在 docker-compose.yml 中再次設置亿乳。
image
指定為鏡像名稱或鏡像 ID硝拧。如果鏡像在本地不存在,Compose 將會嘗試拉去這個鏡像葛假。
docker-compose.yml配置文件
先看例子:
version: '2'
services:
web:
image: dockercloud/hello-world
ports:
- 8080
networks:
- front-tier
- back-tier
redis:
image: redis
links:
- web
networks:
- back-tier
lb:
image: dockercloud/haproxy
ports:
- 80:80
links:
- web
networks:
- front-tier
- back-tier
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
front-tier:
driver: bridge
back-tier:
driver: bridge
versionn, services障陶、networks 三大部分,其中最關鍵的就是 services 和 networks 兩個部分聊训,下面先來看 services 的書寫規(guī)則。
1. image
services:
web:
image: hello-world
在 services 標簽下的第二級標簽是 web,這個名字是用戶自己自定義杉辙,它就是服務名稱挑秉。
image 則是指定服務的鏡像名稱或鏡像 ID。如果鏡像在本地不存在勋磕,Compose 將會嘗試拉取這個鏡像妈候。
例如下面這些格式都是可以的:
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd
2. build
服務除了可以基于指定的鏡像,還可以基于一份 Dockerfile挂滓,在使用 up 啟動之時執(zhí)行構建任務苦银,這個構建標簽就是 build,它可以指定 Dockerfile 所在文件夾的路徑杂彭。Compose 將會利用它自動構建這個鏡像墓毒,然后使用這個鏡像啟動服務容器。
build: /path/to/build/dir
也可以是相對路徑亲怠,只要上下文確定就可以讀取到 Dockerfile所计。
build: ./dir
設定上下文根目錄,然后以該目錄為準指定 Dockerfile团秽。
build:
context: ../
dockerfile: path/of/Dockerfile
注意 build 都是一個目錄主胧,如果你要指定 Dockerfile 文件需要在 build 標簽的子級標簽中使用 dockerfile 標簽指定,如上面的例子习勤。
如果你同時指定了 image 和 build 兩個標簽踪栋,那么 Compose 會構建鏡像并且把鏡像命名為 image 后面的那個名字。
build: ./dir
image: webapp:tag
既然可以在 docker-compose.yml 中定義構建任務图毕,那么一定少不了 arg 這個標簽夷都,就像 Dockerfile 中的 ARG 指令,它可以在構建過程中指定環(huán)境變量予颤,但是在構建成功后取消囤官,在 docker-compose.yml 文件中也支持這樣的寫法:
build:
context: .
args:
buildno: 1
password: secret
下面這種寫法也是支持的冬阳,一般來說下面的寫法更適合閱讀。
build:
context: .
args:
- buildno=1
- password=secret
與 ENV 不同的是党饮,ARG 是允許空值的肝陪。例如:
args:
- buildno
- password
這樣構建過程可以向它們賦值。
注意:YAML 的布爾值(true, false, yes, no, on, off)必須要使用引號引起來(單引號刑顺、雙引號均可)氯窍,否則會當成字符串解析。
3. command
使用 command 可以覆蓋容器啟動后默認執(zhí)行的命令蹲堂。
command: bundle exec thin -p 3000
也可以寫成類似 Dockerfile 中的格式:
command: [bundle, exec, thin, -p, 3000]
4.container_name
前面說過 Compose 的容器名稱格式是:<項目名稱><服務名稱><序號>
雖然可以自定義項目名稱狼讨、服務名稱,但是如果你想完全控制容器的命名贯城,可以使用這個標簽指定:
container_name: app
這樣容器的名字就指定為 app 了熊楼。
5.depends_on
在使用 Compose 時,最大的好處就是少打啟動命令能犯,但是一般項目容器啟動的順序是有要求的鲫骗,如果直接從上到下啟動容器,必然會因為容器依賴問題而啟動失敗踩晶。
例如在沒啟動數(shù)據(jù)庫容器的時候啟動了應用容器执泰,這時候應用容器會因為找不到數(shù)據(jù)庫而退出,為了避免這種情況我們需要加入一個標簽渡蜻,就是 depends_on术吝,這個標簽解決了容器的依賴、啟動先后的問題茸苇。
例如下面容器會先啟動 redis 和 db 兩個服務排苍,最后才啟動 web 服務:
version: '2'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
注意的是,默認情況下使用 docker-compose up web 這樣的方式啟動 web 服務時学密,也會啟動 redis 和 db 兩個服務淘衙,因為在配置文件中定義了依賴關系。
6.dns
和 --dns 參數(shù)一樣用途腻暮,格式如下:
dns: 8.8.8.8
也可以是一個列表:
dns:
- 8.8.8.8
- 9.9.9.9
此外 dns_search 的配置也類似:
dns_search: example.com
dns_search:
- dc1.example.com
- dc2.example.com
7. tmpfs
掛載臨時目錄到容器內部彤守,與 run 的參數(shù)一樣效果:
tmpfs: /run
tmpfs:
- /run
- /tmp
8. entrypoint
在 Dockerfile 中有一個指令叫做 ENTRYPOINT 指令,用于指定接入點哭靖,第四章有對比過與 CMD 的區(qū)別具垫。
在 docker-compose.yml 中可以定義接入點,覆蓋 Dockerfile 中的定義:
entrypoint: /code/entrypoint.sh
格式和 Docker 類似试幽,不過還可以寫成這樣:
entrypoint:
- php
- -d
- zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
- -d
- memory_limit=-1
- vendor/bin/phpunit
9.env_file
還記得前面提到的 .env 文件吧筝蚕,這個文件可以設置 Compose 的變量。而在 docker-compose.yml 中可以定義一個專門存放變量的文件。
如果通過 docker-compose -f FILE 指定了配置文件饰及,則 env_file 中路徑會使用配置文件路徑蔗坯。
如果有變量名稱與 environment 指令沖突康震,則以后者為準燎含。格式如下:
env_file: .env
或者根據(jù) docker-compose.yml 設置多個:
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
注意的是這里所說的環(huán)境變量是對宿主機的 Compose 而言的,如果在配置文件中有 build 操作腿短,這些變量并不會進入構建過程中屏箍,如果要在構建中使用變量還是首選前面剛講的 arg 標簽。
10. environment
與上面的 env_file 標簽完全不同橘忱,反而和 arg 有幾分類似赴魁,這個標簽的作用是設置鏡像變量,它可以保存變量到鏡像里面钝诚,也就是說啟動的容器也會包含這些變量設置颖御,這是與 arg 最大的不同。
一般 arg 標簽的變量僅用在構建過程中凝颇。而 environment 和 Dockerfile 中的 ENV 指令一樣會把變量一直保存在鏡像潘拱、容器中,類似 docker run -e 的效果拧略。
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
11. expose
這個標簽與Dockerfile中的EXPOSE指令一樣芦岂,用于指定暴露的端口,但是只是作為一種參考垫蛆,實際上docker-compose.yml的端口映射還得ports這樣的標簽禽最。
expose:
- "3000"
- "8000"
12. external_links
在使用Docker過程中,我們會有許多單獨使用docker run啟動的容器袱饭,為了使Compose能夠連接這些不在docker-compose.yml中定義的容器川无,我們需要一個特殊的標簽,就是external_links虑乖,它可以讓Compose項目里面的容器連接到那些項目配置外部的容器(前提是外部容器中必須至少有一個容器是連接到與項目內的服務的同一個網絡里面)懦趋。
格式如下:
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
13. extra_hosts
添加主機名的標簽,就是往/etc/hosts文件中添加一些記錄决左,與Docker client的--add-host類似:
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
啟動之后查看容器內部hosts:
162.242.195.82 somehost
50.31.209.229 otherhost
14. labels
向容器添加元數(shù)據(jù)愕够,和Dockerfile的LABEL指令一個意思,格式如下:
labels:
com.example.description: "Accounting webapp"
com.example.department: "Finance"
com.example.label-with-empty-value: ""
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
15. links
還記得上面的depends_on吧佛猛,那個標簽解決的是啟動順序問題惑芭,這個標簽解決的是容器連接問題,與Docker client的--link一樣效果继找,會連接到其它服務中的容器遂跟。
格式如下:
links:
- db
- db:database
- redis
使用的別名將會自動在服務容器中的/etc/hosts里創(chuàng)建。例如:
172.12.2.186 db
172.12.2.186 database
172.12.2.187 redis
相應的環(huán)境變量也將被創(chuàng)建。
16. logging
這個標簽用于配置日志服務幻锁。格式如下:
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
默認的driver是json-file凯亮。只有json-file和journald可以通過docker-compose logs顯示日志,其他方式有其他日志查看方式哄尔,但目前Compose不支持假消。對于可選值可以使用options指定。
有關更多這方面的信息可以閱讀官方文檔:
https://docs.docker.com/engine/admin/logging/overview/
17. pid
pid: "host"
將PID模式設置為主機PID模式岭接,跟主機系統(tǒng)共享進程命名空間富拗。容器使用這個標簽將能夠訪問和操縱其他容器和宿主機的名稱空間。
18. ports
映射端口的標簽鸣戴。
使用HOST:CONTAINER格式或者只是指定容器的端口啃沪,宿主機會隨機映射端口。
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
注意:當使用HOST:CONTAINER格式來映射端口時窄锅,如果你使用的容器端口小于60你可能會得到錯誤得結果创千,因為YAML將會解析xx:yy這種數(shù)字格式為60進制。所以建議采用字符串格式入偷。
19. security_opt
為每個容器覆蓋默認的標簽追驴。簡單說來就是管理全部服務的標簽。比如設置全部服務的user標簽值為USER盯串。
security_opt:
- label:user:USER
- label:role:ROLE
20. stop_signal
設置另一個信號來停止容器氯檐。在默認情況下使用的是SIGTERM停止容器。設置另一個信號可以使用stop_signal標簽体捏。
stop_signal: SIGUSR1
21. volumes
掛載一個目錄或者一個已存在的數(shù)據(jù)卷容器冠摄,可以直接使用 [HOST:CONTAINER] 這樣的格式,或者使用 [HOST:CONTAINER:ro] 這樣的格式几缭,后者對于容器來說河泳,數(shù)據(jù)卷是只讀的,這樣可以有效保護宿主機的文件系統(tǒng)年栓。
Compose的數(shù)據(jù)卷指定路徑可以是相對路徑拆挥,使用 . 或者 .. 來指定相對目錄。
數(shù)據(jù)卷的格式可以是下面多種形式:
volumes:
// 只是指定一個路徑某抓,Docker 會自動在創(chuàng)建一個數(shù)據(jù)卷(這個路徑是容器內部的)纸兔。
- /var/lib/mysql
// 使用絕對路徑掛載數(shù)據(jù)卷
- /opt/data:/var/lib/mysql
// 以 Compose 配置文件為中心的相對路徑作為數(shù)據(jù)卷掛載到容器。
- ./cache:/tmp/cache
// 使用用戶的相對路徑(~/ 表示的目錄是 /home/<用戶目錄>/ 或者 /root/)否副。
- ~/configs:/etc/configs/:ro
// 已經存在的命名的數(shù)據(jù)卷汉矿。
- datavolume:/var/lib/mysql
如果你不使用宿主機的路徑,你可以指定一個volume_driver备禀。
volume_driver: mydriver
22. volumes_from
從其它容器或者服務掛載數(shù)據(jù)卷洲拇,可選的參數(shù)是 :ro或者 :rw奈揍,前者表示容器只讀,后者表示容器對數(shù)據(jù)卷是可讀可寫的赋续。默認情況下是可讀可寫的男翰。
volumes_from:
- service_name
- service_name:ro
- container:container_name
- container:container_name:rw
23. cap_add, cap_drop
添加或刪除容器的內核功能。詳細信息在前面容器章節(jié)有講解纽乱,此處不再贅述蛾绎。
cap_add:
- ALL
cap_drop:
- NET_ADMIN
- SYS_ADMIN
24. cgroup_parent
指定一個容器的父級cgroup。
cgroup_parent: m-executor-abcd
25. devices
設備映射列表迫淹。與Docker client的--device參數(shù)類似秘通。
devices:
- "/dev/ttyUSB0:/dev/ttyUSB0"
26. extends
這個標簽可以擴展另一個服務,擴展內容可以是來自在當前文件敛熬,也可以是來自其他文件,相同服務的情況下第股,后來者會有選擇地覆蓋原有配置应民。
extends:
file: common.yml
service: webapp
用戶可以在任何地方使用這個標簽,只要標簽內容包含file和service兩個值就可以了夕吻。file的值可以是相對或者絕對路徑诲锹,如果不指定file的值,那么Compose會讀取當前YML文件的信息涉馅。
更多的操作細節(jié)在后面的12.3.4小節(jié)有介紹归园。
27. network_mode
網絡模式,與Docker client的--net參數(shù)類似稚矿,只是相對多了一個service:[service name] 的格式庸诱。
例如:
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
可以指定使用服務或者容器的網絡。
28. networks
加入指定網絡晤揣,格式如下:
services:
some-service:
networks:
- some-network
- other-network
關于這個標簽還有一個特別的子標簽aliases桥爽,這是一個用來設置服務別名的標簽,例如:
services:
some-service:
networks:
some-network:
aliases:
- alias1
- alias3
other-network:
aliases:
- alias2
相同的服務可以在不同的網絡有不同的別名昧识。
29. 其它
還有這些標簽:cpu_shares, cpu_quota, cpuset, domainname, hostname, ipc, mac_address, mem_limit, memswap_limit, privileged, read_only, restart, shm_size, stdin_open, tty, user, working_dir
上面這些都是一個單值的標簽钠四,類似于使用docker run的效果。
cpu_shares: 73
cpu_quota: 50000
cpuset: 0,1
user: postgresql
working_dir: /code
domainname: foo.com
hostname: foo
ipc: host
mac_address: 02:42:ac:11:65:43
mem_limit: 1000000000
memswap_limit: 2000000000
privileged: true
restart: always
read_only: true
shm_size: 64M
stdin_open: true
tty: true
docker compose使用
Define and run multi-container applications with Docker.
Usage:
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
docker-compose -h|--help
Options:
-f, --file FILE Specify an alternate compose file
(default: docker-compose.yml)
-p, --project-name NAME Specify an alternate project name
(default: directory name)
--verbose Show more output
--log-level LEVEL Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
--no-ansi Do not print ANSI control characters
-v, --version Print version and exit
-H, --host HOST Daemon socket to connect to
--tls Use TLS; implied by --tlsverify
--tlscacert CA_PATH Trust certs signed only by this CA
--tlscert CLIENT_CERT_PATH Path to TLS certificate file
--tlskey TLS_KEY_PATH Path to TLS key file
--tlsverify Use TLS and verify the remote
--skip-hostname-check Don't check the daemon's hostname against the
name specified in the client certificate
--project-directory PATH Specify an alternate working directory
(default: the path of the Compose file)
--compatibility If set, Compose will attempt to convert deploy
keys in v3 files to their non-Swarm equivalent
Commands:
build Build or rebuild services
bundle Generate a Docker bundle from the Compose file
config Validate and view the Compose file
create Create services
down Stop and remove containers, networks, images, and volumes
events Receive real time events from containers
exec Execute a command in a running container
help Get help on a command
images List images
kill Kill containers
logs View output from containers
pause Pause services
port Print the public port for a port binding
ps List containers
pull Pull service images
push Push service images
restart Restart services
rm Remove stopped containers
run Run a one-off command
scale Set number of containers for a service
start Start services
stop Stop services
top Display the running processes
unpause Unpause services
up Create and start containers
version Show the Docker-Compose version information
docker-compose ps
列出本地 docker-compose.yml 文件定義的正在運行的所有服務跪楞,查看服務運行狀態(tài)