docker微服務初體驗

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)

docker-compose logs

docker-compose stop

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末缀去,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子甸祭,更是在濱河造成了極大的恐慌缕碎,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淋叶,死亡現(xiàn)場離奇詭異阎曹,居然都是意外死亡伪阶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門处嫌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來栅贴,“玉大人,你說我怎么就攤上這事熏迹¢苁恚” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵注暗,是天一觀的道長坛缕。 經常有香客問我,道長捆昏,這世上最難降的妖魔是什么赚楚? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮骗卜,結果婚禮上宠页,老公的妹妹穿的比我還像新娘。我一直安慰自己寇仓,他們只是感情好举户,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著遍烦,像睡著了一般俭嘁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上服猪,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天供填,我揣著相機與錄音,去河邊找鬼蔓姚。 笑死捕虽,一個胖子當著我的面吹牛,可吹牛的內容都是我干的坡脐。 我是一名探鬼主播泄私,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼备闲!你這毒婦竟也來了晌端?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤恬砂,失蹤者是張志新(化名)和其女友劉穎咧纠,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泻骤,經...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡漆羔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年梧奢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片演痒。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡亲轨,死狀恐怖,靈堂內的尸體忽然破棺而出鸟顺,到底是詐尸還是另有隱情惦蚊,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布讯嫂,位于F島的核電站蹦锋,受9級特大地震影響,放射性物質發(fā)生泄漏欧芽。R本人自食惡果不足惜莉掂,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渐裸。 院中可真熱鬧巫湘,春花似錦、人聲如沸昏鹃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洞渤。三九已至,卻和暖如春属瓣,著一層夾襖步出監(jiān)牢的瞬間载迄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工抡蛙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留护昧,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓粗截,卻偏偏與公主長得像惋耙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子熊昌,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內容