天天看點

docker微服務初體驗配置檔案composedocker compose使用

1. 什麼是微服務

在介紹微服務時,首先得先了解什麼是微服務,

顧名思義,微服務得從兩個方面去了解,什麼是"微"、什麼是"服務",

微 狹義來講就是體積小、單個服務的設計。 而所謂服務,一定要差別于系統,

服務一個或者一組相對較小且獨立的功能單元,是使用者可以感覺最小功能集。

微服務,關鍵其實不僅僅是微服務本身,而是系統要提供一套基礎的架構,這種架構使得微服務可以獨立的部署、運作、更新,

不僅如此,這個系統架構還讓微服務與微服務之間在結構上“松耦合”,

而在功能上則表現為一個統一的整體。這種所謂的“統一的整體”表現出來的是統一風格的界面,統一的權限管理,

統一的安全政策,統一的上線過程,統一的日志和審計方法,統一的排程方式,統一的通路入口等等。

2. 微服務由來

微服務最早由Martin Fowler與James Lewis于2014年共同提出,微服務架構風格是一種使用一套小服務來開發單個應用的方式途徑,每個服務運作在自己的程序中,并使用輕量級機制通信,通常是HTTP API,這些服務基于業務能力建構,并能夠通過自動化部署機制來獨立部署,這些服務使用不同的程式設計語言實作,以及不同資料存儲技術,并保持最低限度的集中式管理。

3. 微服務的優勢

IT架構一直從all in one到近兩年熱門的微服務架構,技術不斷進步,微服務架構模式(Microservice Architect Pattern)開始被越來越多的企業所接受,那麼究竟什麼是微服務架構?微服務架構模式有什麼優點呢?

從整個IT技術發展趨勢來看,我們可以看到無論是硬體、還是軟體、還是基礎架構都在朝着輕量化的方向發展。雲計算的發展更讓資源的調控靈活性和部署速度都有所提高,微服務就是一項在雲中部署應用和服務的技術。采用化整為零的概念,将複雜的IT部署,通過功能化、原子化分解,形成一種松散耦合的元件,讓其更容易更新和擴充。

ThoughtWorks的首席科學家,馬丁·福勒先生對微服務做出了這樣的定義:“微服務架構是一種架構模式,它提倡将單一應用程式劃分成一組小的服務,服務之間互相協調、互相配合,為使用者提供最終價值。每個服務運作在其獨立的程序中,服務與服務間采用輕量級的通信機制互相溝通(通常是基于HTTP協定的RESTful API)。每個服務都圍繞着具體業務進行建構,并且能夠被獨立的部署到生産環境、類生産環境等。另外,應當盡量避免統一的、集中式的服務管理機制,對具體的一個服務而言,應根據業務上下文,選擇合适的語言、工具對其進行建構。”

微服務架構是一項在雲中部署應用和服務的技術

總的來說,可以将微服務架構的優勢歸結為以下幾點:

1、複雜度可控

在all in one的狀态下,容易造成盲人摸象的狀态,造成不必要的資料孤島。而微服務架構通過分解單體式應用為多個服務方法,讓複雜性可控。為了實作同一功能,應用被分解為多個可管理的分支或服務,通過微服務架構模式,讓複雜的功能,通過子產品化的方式呈現出來,讓單個服務更容易開發和維護。

避免“盲人摸象”

2、靈活可擴充

靈活性是基于微服務架構模式使得每個服務獨立擴充。微服務架構下,技術選型是去中心化的。在這種模式下,每個團隊都可以根據自身服務的需求和行業發展狀況做出自己的判斷,選擇适合的技術棧。

3、獨立部署

由于微服務具備獨立的運作程序,是以每個微服務也可以獨立部署。這樣,當某個微服務發生變更時無需編譯、部署整個應用,讓釋出更高效,右下縮短應用傳遞周期。UI團隊可以采用AB測試,快速的部署變化。微服務架構模式使得持續化部署成為可能。

4、開發針對性更強

衆所周知,在單塊架構系統下,新人的培養周期很長,需要花費大量時間了解本地開發環境。而微服務架構模式使得每個服務獨立擴充,開發運維人員也不需要在花費一個月的時間去熟悉本地環境,而隻需要了解自己所處的子產品狀态即可。

5、降低TCO

在傳統IT架構中,即單塊架構系統中,是以技術分層,譬如邏輯層、資料層等。但随着市場需求的不斷變化,使用者需求住家個性化,開發周期需要越來越短,産品的生命周期也開始變短,單塊架構系統開始面臨挑戰。無論是開發還是維護成本太高。

相較而言,微服務架構模式下,當某一元件發生故障時,不會發現單塊架構系統的程序内擴散等弊端,故障會被隔離在單個服務中。

Docker微服務

Docker 是一個容器工具,提供虛拟環境。docker改變了我們對軟體的認識。

站在 Docker 的角度,軟體就是容器的組合:業務邏輯容器、資料庫容器、儲存容器、隊列容器......Docker 使得軟體可以拆分成若幹個标準化容器,然後像搭積木一樣組合起來。

這正是微服務(microservices)的思想:軟體把任務外包出去,讓各種外部服務完成這些任務,軟體本身隻是底層服務的排程中心群組裝層。

微服務很适合用 Docker 容器實作,每個容器承載一個服務。一台計算機同時運作多個容器,進而就能很輕松地模拟出複雜的微服務架構。

配置檔案

- Dockerfile

DockerFile分為四部分組成:基礎鏡像資訊、維護者資訊、鏡像操作指令和容器啟動時執行指令。例如:

#第一行必須指令基于的基礎鏡像
    From ubutu
    
    #維護者資訊
    MAINTAINER docker_user  [email protected]
    
    #鏡像的操作指令
    RUN apt-get update && apt-get install -y ngnix 
    RUN echo "\ndaemon off;">>/etc/ngnix/nignix.conf
    
    #容器啟動時執行指令
    CMD /usr/sbin/ngnix
           

介紹一下一些常用的指令:

1、From指令

From 或者From :

DockerFile第一條必須為From指令。如果同一個DockerFile建立多個鏡像時,可使用多個From指令(每個鏡像一次)
           

2、MAINTAINER

格式為maintainer ,指定維護者的資訊
           

3、RUN

格式為Run 或者Run [“executable” ,”Param1”, “param2”] 
前者在shell終端上運作,即/bin/sh -C,後者使用exec運作。例如:RUN [“/bin/bash”, “-c”,”echo hello”] 
每條run指令在目前基礎鏡像執行,并且送出新鏡像。當指令比較長時,可以使用“/”換行。
           

4、CMD指令

支援三種格式: 
CMD [“executable” ,”Param1”, “param2”]使用exec執行,推薦 
CMD command param1 param2,在/bin/sh上執行 
CMD [“Param1”, “param2”] 提供給ENTRYPOINT做預設參數。

每個容器隻能執行一條CMD指令,多個CMD指令時,隻最後一條被執行。
           

5、EXPOSE

格式為 EXPOSE […] 。

告訴Docker服務端容器暴露的端口号,供互聯系統使用。在啟動Docker時,可以通過-P,主機會自動配置設定一個端口号轉發到指定的端口。使用-P,則可以具體指定哪個本地端口映射過來

例如: 
EXPOSE 22 80 8443
           

6、ENV

格式為 ENV 。 指定一個環境變量,會被後續 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中執行)。 
配置容器啟動後執行的指令,并且不可被 docker run 提供的參數覆寫。

每個Dockerfile中隻能有一個 ENTRYPOINT ,當指定多個時,隻有最後一個起效。
           

10、VOLUME

格式為 VOLUME [“/data”] 。

建立一個可以從本地主機或其他容器挂載的挂載點,一般用來存放資料庫和需要保持的資料等。
           

11、USER

格式為 USER daemon 。

指定運作容器時的使用者名或UID,後續的 RUN 也會使用指定使用者。

當服務不需要管理者權限時,可以通過該指令指定運作使用者。并且可以在之前建立所需要的使用者,例如: RUN groupadd -r postgres && useradd -r -g postgres postgres 。要臨時擷取管理者權限可以使用 gosu ,而不推薦 sudo 。
           

12、WORKDIR

格式為 WORKDIR /path/to/workdir 。

為後續的 RUN 、 CMD 、 ENTRYPOINT 指令配置工作目錄。

可以使用多個 WORKDIR 指令,後續指令如果參數是相對路徑,則會基于之前指令指定的路徑。例如

WORKDIR /a 
WORKDIR b 
WORKDIR c 
RUN pwd 
則最終路徑為 /a/b/c 。
           

13、ONBUILD

格式為 ONBUILD [INSTRUCTION] 。

配置當所建立的鏡像作為其它新建立鏡像的基礎鏡像時,所執行的操作指令。

例如,Dockerfile使用如下的内容建立了鏡像 image-A 。

[…] 
ONBUILD ADD . /app/src 
ONBUILD RUN /usr/local/bin/python-build –dir /app/src 
[…] 
如果基于A建立新的鏡像時,新的Dockerfile中使用 FROM image-A 指定基礎鏡像時,會自動執行 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),指自動配置、協作和管理服務的過程,在 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 的書寫規則。

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 啟動之時執行建構任務,這個建構标簽就是 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 指令,它可以在建構過程中指定環境變量,但是在建構成功後取消,在 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 可以覆寫容器啟動後預設執行的指令。

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 時,最大的好處就是少打啟動指令,但是一般項目容器啟動的順序是有要求的,如果直接從上到下啟動容器,必然會因為容器依賴問題而啟動失敗。

例如在沒啟動資料庫容器的時候啟動了應用容器,這時候應用容器會因為找不到資料庫而退出,為了避免這種情況我們需要加入一個标簽,就是 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 參數一樣用途,格式如下:

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 的參數一樣效果:

tmpfs: /run
tmpfs:
  - /run
  - /tmp
           

8. entrypoint

在 Dockerfile 中有一個指令叫做 ENTRYPOINT 指令,用于指定接入點,第四章有對比過與 CMD 的差別。

在 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
           

或者根據 docker-compose.yml 設定多個:

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env
           

注意的是這裡所說的環境變量是對主控端的 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

向容器添加中繼資料,和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裡建立。例如:

172.12.2.186  db
172.12.2.186  database
172.12.2.187  redis
           

相應的環境變量也将被建立。

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模式,跟主機系統共享程序命名空間。容器使用這個标簽将能夠通路和操縱其他容器和主控端的名稱空間。

18. ports

映射端口的标簽。

使用HOST:CONTAINER格式或者隻是指定容器的端口,主控端會随機映射端口。

ports:
 - "3000"
 - "8000:8000"
 - "49100:22"
 - "127.0.0.1:8001:8001"

           
注意:當使用HOST:CONTAINER格式來映射端口時,如果你使用的容器端口小于60你可能會得到錯誤得結果,因為YAML将會解析xx:yy這種數字格式為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

挂載一個目錄或者一個已存在的資料卷容器,可以直接使用 [HOST:CONTAINER] 這樣的格式,或者使用 [HOST:CONTAINER:ro] 這樣的格式,後者對于容器來說,資料卷是隻讀的,這樣可以有效保護主控端的檔案系統。

Compose的資料卷指定路徑可以是相對路徑,使用 . 或者 .. 來指定相對目錄。

資料卷的格式可以是下面多種形式:

volumes:
  // 隻是指定一個路徑,Docker 會自動在建立一個資料卷(這個路徑是容器内部的)。
  - /var/lib/mysql

  // 使用絕對路徑挂載資料卷
  - /opt/data:/var/lib/mysql

  // 以 Compose 配置檔案為中心的相對路徑作為資料卷挂載到容器。
  - ./cache:/tmp/cache

  // 使用使用者的相對路徑(~/ 表示的目錄是 /home/<使用者目錄>/ 或者 /root/)。
  - ~/configs:/etc/configs/:ro

  // 已經存在的命名的資料卷。
  - datavolume:/var/lib/mysql

           

如果你不使用主控端的路徑,你可以指定一個volume_driver。

volume_driver: mydriver

           

22. volumes_from

從其它容器或者服務挂載資料卷,可選的參數是 :ro或者 :rw,前者表示容器隻讀,後者表示容器對資料卷是可讀可寫的。預設情況下是可讀可寫的。

volumes_from:
  - service_name
  - service_name:ro
  - container:container_name
  - container:container_name:rw

           

23. cap_add, cap_drop

添加或删除容器的核心功能。詳細資訊在前面容器章節有講解,此處不再贅述。

cap_add:
  - ALL

cap_drop:
  - NET_ADMIN
  - SYS_ADMIN

           

24. cgroup_parent

指定一個容器的父級cgroup。

cgroup_parent: m-executor-abcd

           

25. devices

裝置映射清單。與Docker client的--device參數類似。

devices:
  - "/dev/ttyUSB0:/dev/ttyUSB0"

           

26. extends

這個标簽可以擴充另一個服務,擴充内容可以是來自在目前檔案,也可以是來自其他檔案,相同服務的情況下,後來者會有選擇地覆寫原有配置。

extends:
  file: common.yml
  service: webapp

           

使用者可以在任何地方使用這個标簽,隻要标簽内容包含file和service兩個值就可以了。file的值可以是相對或者絕對路徑,如果不指定file的值,那麼Compose會讀取目前YML檔案的資訊。

更多的操作細節在後面的12.3.4小節有介紹。

27. network_mode

網絡模式,與Docker client的--net參數類似,隻是相對多了一個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 檔案定義的正在運作的所有服務,檢視服務運作狀态

docker-compose logs

docker-compose stop