Docker-Compose簡介安裝使用

Docker-Compose簡介安裝使用

[TOC]

1 簡介

Github源碼
官方文檔和示例

Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration.

Compose是定義和運行多容器Docker應(yīng)用程序的工具,使用Compose,您可以使用YAML文件來配置應(yīng)用程序的服務(wù),然后,使用單個命令創(chuàng)建并啟動配置中的所有服務(wù)

Dockerfile 可以讓用戶管理一個單獨的應(yīng)用容器。使用Docker Compose,不再需要使用shell腳本來啟動容器。在配置文件中,所有的容器通過services來定義,然后使用docker-compose腳本來啟動,停止和重啟應(yīng)用,和應(yīng)用中的服務(wù)以及所有依賴服務(wù)的容器

2 安裝

方法一:

$curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$chmod +x /usr/local/bin/docker-compose
#查看版本
$docker-compose version

方法二:用pip方式安裝(備用)

#安裝pip
$yum -y install epel-release
$yum -y install python-pip
#確認版本
$pip --version
#更新pip
$pip install --upgrade pip
#安裝docker-compose
$pip install docker-compose 
#查看版本
$docker-compose version

3 使用

3.1 docker-comose命令

docker-compose [SUBCOMMAND]完整的命令列表如下----- 官網(wǎng)

SUBCOMMAND 解釋
build 構(gòu)建或重建服務(wù)
help 命令幫助
kill 殺掉容器
logs 顯示容器的輸出內(nèi)容
port 打印綁定的開放端口
ps 顯示容器
pull 拉取服務(wù)鏡像
restart 重啟服務(wù)
rm 刪除停止的容器
run 運行一個一次性命令
scale 設(shè)置服務(wù)的容器數(shù)目
start 開啟服務(wù)
stop 停止服務(wù)
up 創(chuàng)建并啟動容器服務(wù)(-d:后臺啟動)

備注:執(zhí)行以上的命令大多數(shù)要在docker-compose.yml文件同級目錄中

3.2 docker-compose.yml 文件

示例:參考(Docker Compose 配置文件詳解)

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

可以看到一份標(biāo)準(zhǔn)配置文件應(yīng)該包含 versionservices、networks 三大部分,其中最關(guān)鍵的就是 services 和 networks 兩個部分,下面先來看 services 的書寫規(guī)則。

1. image

services:
  web:
    image: hello-world

在 services 標(biāo)簽下的第二級標(biāo)簽是 web,這個名字是用戶自己自定義,它就是服務(wù)名稱
image 則是指定服務(wù)的鏡像名稱或鏡像 ID。如果鏡像在本地不存在,Compose 將會嘗試拉取這個鏡像。
例如下面這些格式都是可以的:

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd

2. build

服務(wù)除了可以基于指定的鏡像,還可以基于一份 Dockerfile,在使用 up 啟動之時執(zhí)行構(gòu)建任務(wù),這個構(gòu)建標(biāo)簽就是 build,它可以指定 Dockerfile 所在文件夾的路徑。Compose 將會利用它自動構(gòu)建這個鏡像,然后使用這個鏡像啟動服務(wù)容器。

build: /path/to/build/dir

也可以是相對路徑,只要上下文確定就可以讀取到 Dockerfile。

build: ./dir

設(shè)定上下文根目錄,然后以該目錄為準(zhǔn)指定 Dockerfile。

build:
  context: ../
  dockerfile: path/of/Dockerfile

注意 build 都是一個目錄,如果你要指定 Dockerfile 文件需要在 build 標(biāo)簽的子級標(biāo)簽中使用 dockerfile 標(biāo)簽指定,如上面的例子。
如果你同時指定了 image 和 build 兩個標(biāo)簽,那么 Compose 會構(gòu)建鏡像并且把鏡像命名為 image 后面的那個名字。如下:鏡像名稱會是webapp:tag

build: ./dir
image: webapp:tag

既然可以在 docker-compose.yml 中定義構(gòu)建任務(wù),那么一定少不了 arg 這個標(biāo)簽,就像 Dockerfile 中的 ARG 指令,它可以在構(gòu)建過程中指定環(huán)境變量,但是在構(gòu)建成功后取消,在 docker-compose.yml 文件中也支持這樣的寫法:

build:
  context: .
  args:
    buildno: 1
    password: secret

下面這種寫法也是支持的,一般來說下面的寫法更適合閱讀

build:
  context: .
  args:
    - buildno=1
    - password=secret

與 ENV 不同的是,ARG 是允許空值的。例如:

args:
  - buildno
  - password

這樣構(gòu)建過程可以向它們賦值。

注意:YAML 的布爾值(true, false, yes, no, on, off)必須要使用引號引起來(單引號、雙引號均可),否則會當(dāng)成字符串解析。

3. command

使用 command 可以覆蓋容器啟動后默認執(zhí)行的命令。

command: bundle exec thin -p 3000

也可以寫成類似 Dockerfile 中的數(shù)組格式:

command: [bundle, exec, thin, -p, 3000]

4. container_name

前面說過 Compose 的容器名稱格式是:<項目名稱><服務(wù)名稱><序號>
雖然可以自定義項目名稱、服務(wù)名稱,但是如果你想完全控制容器的命名,可以使用這個標(biāo)簽指定:

container_name: app

這樣容器的名字就指定為 app 了。

5. depends_on

在使用 Compose 時,最大的好處就是少打啟動命令,但是一般項目容器啟動的順序是有要求的,如果直接從上到下啟動容器,必然會因為容器依賴問題而啟動失敗。
例如在沒啟動數(shù)據(jù)庫容器的時候啟動了應(yīng)用容器,這時候應(yīng)用容器會因為找不到數(shù)據(jù)庫而退出,為了避免這種情況我們需要加入一個標(biāo)簽,就是 depends_on,這個標(biāo)簽解決了容器的依賴、啟動先后的問題。
例如下面容器會先啟動 redis 和 db 兩個服務(wù),最后才啟動 web 服務(wù):

version: '2'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

注意的是,默認情況下使用 docker-compose up web 這樣的方式啟動 web 服務(wù)時,也會啟動 redis 和 db 兩個服務(wù),因為在配置文件中定義了依賴關(guān)系。

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

掛載臨時目錄到容器內(nèi)部,與 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 文件吧,這個文件可以設(shè)置 Compose 的變量。而在 docker-compose.yml 中可以定義一個專門存放變量的文件。
如果通過 docker-compose -f FILE 指定了配置文件,則 env_file 中路徑會使用配置文件路徑。

如果有變量名稱與 environment 指令沖突,則以后者為準(zhǔn)。格式如下:

env_file: .env

或者根據(jù) docker-compose.yml 設(shè)置多個:

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

注意的是這里所說的環(huán)境變量是對宿主機的 Compose 而言的,如果在配置文件中有 build 操作,這些變量并不會進入構(gòu)建過程中,如果要在構(gòu)建中使用變量還是首選前面剛講的 arg 標(biāo)簽。

10. environment

與上面的 env_file 標(biāo)簽完全不同,反而和 arg 有幾分類似,這個標(biāo)簽的作用是設(shè)置鏡像變量,它可以保存變量到鏡像里面,也就是說啟動的容器也會包含這些變量設(shè)置,這是與 arg 最大的不同。
一般 arg 標(biāo)簽的變量僅用在構(gòu)建過程中。而 environment 和 Dockerfile 中的 ENV 指令一樣會把變量一直保存在鏡像、容器中,類似 docker run -e 的效果。

environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET

11. expose

這個標(biāo)簽與Dockerfile中的EXPOSE指令一樣,用于指定暴露的端口,但是只是作為一種參考,實際上docker-compose.yml的端口映射還得ports這樣的標(biāo)簽。

expose:
 - "3000"
 - "8000"

12. external_links

在使用Docker過程中,我們會有許多單獨使用docker run啟動的容器,為了使Compose能夠連接這些不在docker-compose.yml中定義的容器,我們需要一個特殊的標(biāo)簽,就是external_links,它可以讓Compose項目里面的容器連接到那些項目配置外部的容器(前提是外部容器中必須至少有一個容器是連接到與項目內(nèi)的服務(wù)的同一個網(wǎng)絡(luò)里面)。
格式如下:

external_links:
 - redis_1
 - project_db_1:mysql
 - project_db_1:postgresql

13. extra_hosts

添加主機名的標(biāo)簽,就是往/etc/hosts文件中添加一些記錄,與Docker client的--add-host類似:

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

啟動之后查看容器內(nèi)部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吧,那個標(biāo)簽解決的是啟動順序問題,這個標(biāo)簽解決的是容器連接問題,與Docker client的--link一樣效果,會連接到其它服務(wù)中的容器。
格式如下:

links:
 - db
 - db:database
 - redis

使用的別名將會自動在服務(wù)容器中的/etc/hosts里創(chuàng)建。例如:

172.12.2.186  db
172.12.2.186  database
172.12.2.187  redis

相應(yīng)的環(huán)境變量也將被創(chuàng)建。

16. logging

這個標(biāo)簽用于配置日志服務(wù)。格式如下:

logging:
  driver: syslog
  options:
    syslog-address: "tcp://192.168.0.42:123"

默認的driver是json-file。只有json-file和journald可以通過docker-compose logs顯示日志,其他方式有其他日志查看方式,但目前Compose不支持。對于可選值可以使用options指定。
有關(guān)更多這方面的信息可以閱讀官方文檔:
https://docs.docker.com/engine/admin/logging/overview/

17. pid

pid: "host"

將PID模式設(shè)置為主機PID模式,跟主機系統(tǒng)共享進程命名空間。容器使用這個標(biāo)簽將能夠訪問和操縱其他容器和宿主機的名稱空間。

18. ports

映射端口的標(biāo)簽。
使用HOST:CONTAINER格式或者只是指定容器的端口,宿主機會隨機映射端口。

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


注意:當(dāng)使用HOST:CONTAINER格式來映射端口時,如果你使用的容器端口小于60你可能會得到錯誤得結(jié)果,因為YAML將會解析xx:yy這種數(shù)字格式為60進制。所以建議采用字符串格式。

19. security_opt

為每個容器覆蓋默認的標(biāo)簽。簡單說來就是管理全部服務(wù)的標(biāo)簽。比如設(shè)置全部服務(wù)的user標(biāo)簽值為USER。

security_opt:
  - label:user:USER
  - label:role:ROLE

20. stop_signal

設(shè)置另一個信號來停止容器。在默認情況下使用的是SIGTERM停止容器。設(shè)置另一個信號可以使用stop_signal標(biāo)簽。

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ù)卷(這個路徑是容器內(nèi)部的)。
  - /var/lib/mysql

  // 使用絕對路徑掛載數(shù)據(jù)卷
  - /opt/data:/var/lib/mysql

  // 以 Compose 配置文件為中心的相對路徑作為數(shù)據(jù)卷掛載到容器。
  - ./cache:/tmp/cache

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

  // 已經(jīng)存在的命名的數(shù)據(jù)卷。
  - datavolume:/var/lib/mysql

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

volume_driver: mydriver

22. volumes_from

從其它容器或者服務(wù)掛載數(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

添加或刪除容器的內(nèi)核功能。詳細信息在前面容器章節(jié)有講解,此處不再贅述。

cap_add:
  - ALL

cap_drop:
  - NET_ADMIN
  - SYS_ADMIN

24. cgroup_parent

指定一個容器的父級cgroup。

cgroup_parent: m-executor-abcd


25. devices

設(shè)備映射列表。與Docker client的--device參數(shù)類似。

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


26. extends

這個標(biāo)簽可以擴展另一個服務(wù),擴展內(nèi)容可以是來自在當(dāng)前文件,也可以是來自其他文件,相同服務(wù)的情況下,后來者會有選擇地覆蓋原有配置。

extends:
  file: common.yml
  service: webapp

用戶可以在任何地方使用這個標(biāo)簽,只要標(biāo)簽內(nèi)容包含file和service兩個值就可以了。file的值可以是相對或者絕對路徑,如果不指定file的值,那么Compose會讀取當(dāng)前YML文件的信息。
更多的操作細節(jié)在后面的12.3.4小節(jié)有介紹。

27. network_mode

網(wǎng)絡(luò)模式,與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]

可以指定使用服務(wù)或者容器的網(wǎng)絡(luò)。

28. networks

加入指定網(wǎng)絡(luò),格式如下:

services:
  some-service:
    networks:
     - some-network
     - other-network

關(guān)于這個標(biāo)簽還有一個特別的子標(biāo)簽aliases,這是一個用來設(shè)置服務(wù)別名的標(biāo)簽,例如:

services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
         - alias3
      other-network:
        aliases:
         - alias2

相同的服務(wù)可以在不同的網(wǎng)絡(luò)有不同的別名。

29. 其它

還有這些標(biāo)簽: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
上面這些都是一個單值的標(biāo)簽,類似于使用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

4 note

4.1 docker run和docker-compose up

note:docker run 是創(chuàng)建新的容器 而docker-compose up 是會使用舊容器(如果存在的話)

官網(wǎng)介紹:

Preserve volume data when containers are created

Compose preserves all volumes used by your services. When docker-compose up runs, if it finds any containers from previous runs, it copies the volumes from the old container to the new container. This process ensures that any data you’ve created in volumes isn’t lost.

docker-compose只會為每個鏡像維護一個實例,每次運行docker-compose up的時候,compose會查找之前的容器,把舊容器的volume-data拷貝到容器中。除非手動用docker rm命令刪除容器,否則CONTAINER ID不會發(fā)生改變。

這和docker run [images name]不一樣,這個命令每次運行會新生成一個鏡像的實例,即新容器,它們對應(yīng)的CONTAINER ID也各不相同

4.2 容器命名

docker-compose up -d
創(chuàng)建的容器的名字:是由docker-compose.yml的文件目錄名加文件中指定的名字作為前綴,使用數(shù)字作為后綴
ex:
cluster/docker-compose.yml

docker-compose.yml中指定兩個服務(wù):

web:
   image:
   command:
   ....
redis:
    image:
    command:
   ....

則創(chuàng)建的服務(wù)容器名為:cluster_web_1和cluster_redis_1

參考

1 Get started with Docker Compose

2 開始使用Docker-compose

3 快速入門:Compose和Django

4 快速入門:Compose Rails

5 快速入門:Compose WordPress

6 常見問題

7 Compose命令行參考

8 Compose文件版本3參考

9 Docker Compose 配置文件詳解


                           2017-12-8-Boy
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Docker — 云時代的程序分發(fā)方式 要說最近一年云計算業(yè)界有什么大事件?Google Compute Engi...
    ahohoho閱讀 15,873評論 15 147
  • Docker基礎(chǔ)資料 安裝docker $ sudo apt-get install docker.io 查看本地...
    Sherry鳳閱讀 548評論 0 0
  • 五、Docker 端口映射 無論如何,這些 ip 是基于本地系統(tǒng)的并且容器的端口非本地主機是訪問不到的。此外,除了...
    R_X閱讀 1,971評論 0 7
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評論 19 139
  • 身體訓(xùn)練營第二季之第一周感悟: 1)連著跟了兩期的身體訓(xùn)練營,現(xiàn)在已經(jīng)堅持了五周,從最開始的興奮的每天發(fā)圖,到現(xiàn)在...
    秋小愚358閱讀 276評論 1 1

友情鏈接更多精彩內(nèi)容