Docker | 第七章:Docker-Compose服務編排介紹及使用

前言

前面章節,咱們學習瞭如何構建本身的鏡像文件,如何保存本身的鏡像文件。大多都是一個鏡像啓動。當一個系統須要多個子系統進行配合時,若每一個子系統也就是鏡像須要一個個手動啓動和中止的話,那估計實施人員也會崩潰的,並且效率也很低,維護的量也就很大了。因此,本章節就來了解下,如何利用官方提供的Compose編排工具按必定的業務規則來合理的進行容器啓停工做。html

Compose介紹

Compose是一個用於定義和運行多個Docker容器的編排工具。能夠一條命令啓動多個容器。主要是解決了容器與容器之間如何管理編排的問題。java

按官網的說明,使用Compose基本上也就分紅三步:python

  • 利用Dockerfile定義運行環境
  • 使用docker-compose.yml定義組成應用的各服務
  • 運行docker-compose up啓動應用

官網介紹

題外話:我所理解的就是,其實就是個批量工具,如批處理命令同樣。mysql

Compose實現原理圖:linux

原理圖

Compose 中有兩個重要的概念:git

  • 服務 (service) :一個應用的容器,實際上能夠包括若干運行相同鏡像的容器實例。
  • 項目 (project) :由一組關聯的應用容器組成的一個完整業務單元,在 docker-compose.yml 文件中定義。

一個項目能夠由多個服務(容器)關聯而成,Compose 面向項目進行管理,經過子命令對項目中的一組容器進行便捷地生命週期管理。github

Compose 項目由 Python 編寫,實現上調用了 Docker 服務提供的 API 來對容器進行管理。所以,只要所操做的平臺支持 Docker API,就能夠在其上利用 Compose 來進行編排管理。web

題外話:關於Docker API會在下一章節進行詳細說明。redis

Compose安裝

自己Compose是一個獨立的產品,因此須要獨立安裝的。spring

按官網的說明,Compose能夠在MacWindowsLinux等操做系統,本章節主要講解下關於Linux的安裝,其餘操做系統能夠查看官網的安裝指南:https://docs.docker.com/compose/install/#install-compose

安裝指南

二進制文件直接安裝

此安裝方式簡單,但可能會有網絡鏈接問題。或者直接去gitHub上的資源列表下載到本地也能夠的。筆者下載過程(11M左右)仍是很順利的,╰( ̄▽ ̄)╮

  • 下載
sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
  • 受權
sudo chmod +x /usr/local/bin/docker-compose
  • 查看版本驗證是否成功
docker-compose --version

可看見控制檯輸出:

docker-compose version 1.22.0, build f46880fe

說明已經安裝成功了。固然你們能夠選擇不一樣的安裝版本了,直接去github上下載便可。

使用pip(Python包管理工具)安裝

這種安裝方式就是不會受限於網絡,但安裝比較麻煩。

#安裝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

命令補齊

命令補齊功能能夠提升輸入效率,因此須要安裝命令補齊功能的,能夠照着官網:https://docs.docker.com/compose/completion/#install-command-completion 說明了相應配置,這裏就不進行闡述了。

命令補齊

Compose經常使用命令

在控制窗口,直接輸入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

這裏簡單說明下一些經常使用的:

build

構建或者從新構建服務。

kill

經過發送SIGKILL信號來強制中止服務容器。支持經過參數來指定發送的信號,如:docker-compose kill -s SIGINT

logs

查看服務的日誌輸出。

port

打印綁定的公共端口

ps

列出全部的容器或者指定的容器

pull

拉取鏡像

rm

輸出容器

run

在一個服務上執行一個命令。如docker-compose run ubuntu ping docker.com將會啓動一個 ubuntu 服務,執行 ping docker.com 命令。默認狀況下,全部關聯的服務將會自動被啓動,除非這些服務已經在運行中。 該命令相似啓動容器後運行指定的命令,相關卷、連接等等都將會按照指望建立。 兩個不一樣點:

  • 給定命令將會覆蓋原有的自動運行命令;
  • 不會自動建立端口,以免衝突。

若是不但願自動啓動關聯的容器,可使用 --no-deps 選項,例如

$ docker-compose run --no-deps web python manage.py shell

將不會啓動 web 容器所關聯的其它容器。

start

啓動一個已經存在的服務容器。

stop

中止一個已經運行的容器,但不刪除它。

up

構建,(從新)建立,啓動,連接一個服務相關的容器。連接的服務都將會啓動,除非他們已經運行。 默認狀況, docker-compose up 將會整合全部容器的輸出,而且退出時,全部容器將會中止。若是使用 docker-compose up -d ,將會在後臺啓動並運行全部的容器。 默認狀況,若是該服務的容器已經存在, docker-compose up 將會中止並嘗試從新建立他們(保持使用 volumes-from 掛載的卷),以保證 docker-compose.yml 的修改生效。若是你不想容器被中止並從新建立,可使用 docker-compose up --no-recreate。若是須要的話,這樣將會啓動已經中止的容器。

pause

暫停容器服務

其餘的命令,可直接經過幫助查詢下。

docker-compose.yml模版文件經常使用命令

compose的默認模版文件爲:docker-compose.yml。和Dockerfile同樣,它也是有本身的語法命令的。其中定義的每一個服務都必須經過image指令指定鏡像或build指令(須要 Dockerfile)來自動構建。其它大部分指令都跟docker run中的相似。

若是使用build指令,在Dockerfile中設置的選項(例如:CMD, EXPOSE, VOLUME, ENV 等) 將會自動被獲取,無需在docker-compose.yml中再次設置。

模版文件有多種寫法,例如Version 1 file formatVersion 2 file formatVersion 2.1 file formatVersion 3 file format等。其中,Version 1 file format將逐步被被棄用;Version 2.xVersion 3.x基本兼容,是將來的趨勢。

具體說明可查看:https://docs.docker.com/compose/compose-file/

文件寫法

各版本對應的支持的模版文件以下:

Compose file format Docker Engine release
3.7 18.06.0+
3.6 18.02.0+
3.5 17.12.0+
3.4 17.09.0+
3.3 17.06.0+
3.2 17.04.0+
3.1 1.13.1+
3.0 1.13.0+
2.4 17.12.0+
2.3 17.06.0+
2.2 1.13.0+
2.1 1.12.0+
2.0 1.10.0+
1.0 1.9.1.+

image

指定爲鏡像名稱或鏡像 ID。若是鏡像在本地不存在,Compose 將會嘗試拉去這個鏡像。

例如:

image: frolvlad/alpine-glibc

build

指定 Dockerfile 所在文件夾的路徑。 Compose 將會利用它自動構建這個鏡像,而後使用這個鏡像。

build: /opt/docker

其中build還有一些小選項。

build:
  context: ./webapp
  dockerfile: Dockerfile-alternate
  args:
    - buildno=1
    - user=someuser

context上下文是docker build中很重要的一個概念。構建鏡像必須指定contextcontextdocker build 命令的工做目錄。默認狀況下,若是不額外指定 Dockerfile 的話,會將 Context 下的名爲 Dockerfile 的文件做爲 Dockerfile

dockerfile選項是值得備選的dockerfileargs是一些提供的參數。

command

覆蓋容器啓動後默認執行的命令。

command: bundle exec thin -p 3000

links

連接到其它服務中的容器。使用服務名稱(同時做爲別名)或服務名稱:服務別名 (SERVICE:ALIAS) 格式均可以。

links:
 - db
 - db:database
 - redis

使用的別名將會自動在服務容器中的 /etc/hosts 裏建立。例如:

172.17.2.186  db
172.17.2.186  database
172.17.2.187  redis

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

dns

配置 DNS 服務器。能夠是一個值,也能夠是一個列表。

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9

environment

設置環境變量。你可使用數組或字典兩種格式。

只給定名稱的變量會自動獲取它在 Compose 主機上的值,能夠用來防止泄露沒必要要的數據。

environment:
  RACK_ENV: development
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SESSION_SECRET

env_file

從文件中獲取環境變量,能夠爲單獨的文件路徑或列表。

若是經過 docker-compose -f FILE 指定了模板文件,則 env_file 中路徑會基於模板文件路徑。

若是有變量名稱與 environment 指令衝突,則之後者爲準。

env_file: .env

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

環境變量文件中每一行必須符合格式,支持 # 開頭的註釋行。

# common.env: Set Rails/Rack environment
RACK_ENV=development

expose

暴露端口,但不映射到宿主機,只被鏈接的服務訪問。

僅能夠指定內部端口爲參數

expose:
 - "3000"
 - "8000"

volumes

卷掛載路徑設置。能夠設置宿主機路徑 (HOST:CONTAINER) 或加上訪問模式 (HOST:CONTAINER:ro)。

volumes:
 - /var/lib/mysql
 - cache/:/tmp/cache
 - ~/configs:/etc/configs/:ro

volumes_from

從另外一個服務或容器掛載它的全部卷。

volumes_from:
 - service_name
 - container_name

其餘相關命名了或者瞭解命令的其餘配置項,可到官網查看,包括一些選項等,真的蠻多的。。

官網:https://docs.docker.com/compose/compose-file

Compose編排實踐

講了命令後,你們估計和我同樣一頭霧水,接下來,就以一個實際的啓動例子,進行講解下。這裏啓動兩個先前章節編寫過的SpringBoot項目,進行api調用進行舉例說明。

0.編寫docker-compose.yml文件:

# 表示該文件使用Version 3 文件格式
version: '3.3'
services: 
 springboot-demo-1: 
   # 依賴的鏡像,直接使用先前章節自定義的鏡像文件
   image: lqdev.cn/springboot:0.1
   # 暴露端口信息
   ports: 
      - "1222:8080"
 springboot-demo-2: 
      # 依賴的鏡像,直接使用先前章節自定義的鏡像文件
   image: lqdev.cn/springboot:0.1
   # 暴露端口信息
   ports: 
      - "1333:8080"

1.在docker-compose.yml文件所在目錄執行

# -d 說明是後臺運行
docker-compose up -d

此時能夠看見,啓動成功了:

[root@izbp16chpwsnff41nrjtfhz java]# docker-compose up -d
Creating java_springboot-demo-1_1 ... done
Creating java_springboot-demo-2_1 ... done

利用ps命令查看,說明已經啓動成功了。

[root@izbp16chpwsnff41nrjtfhz java]# docker-compose ps
          Name                        Command               State           Ports         
------------------------------------------------------------------------------------------
java_springboot-demo-1_1   java -Djava.security.egd=f ...   Up      0.0.0.0:1222->8080/tcp
java_springboot-demo-2_1   java -Djava.security.egd=f ...   Up      0.0.0.0:1333->8080/tcp

或者查看下日誌輸出,能夠看見SpringBoot已經啓動成功:

日誌查看

訪問下服務,能夠看見能正常輸出了:

服務服務


示例就簡單的利用imagesports進行簡單的運行了一個Comoose示例,你們對於複雜的能夠本身試着編寫下,對於一個後端的我來講,這塊用到的機會仍是不多了,畢竟都是本身一個微服務,本身啓停了。⊙﹏⊙‖∣


參考資料

官方的文檔仍是很齊全的,建議你們仍是直接去官網查看相關資料。

  1. https://docs.docker.com/compose/install
  2. https://docs.docker.com/compose/reference/
  3. https://docs.docker.com/compose/compose-file
  4. https://www.hi-linux.com/posts/12554.html

總結

本章節主要介紹了關於Compose編排工具的使用。使用了編排工具後,提供了應用系統部署各個管理應用的便捷性。學習後,你們就能夠根據本身的業務需求,業務系統進行合理的編排工做了。通常上仍是利用在微服務的編排上,通常上一個應用系統可能存在這幾十個微服務的,因此說合理的利用編排工具能夠提升部署效率,同時也能減小出錯遺漏的機率。

最後

鑑於做者也是個初學者,水平有限,若文中有錯誤或者遺漏之處,還望指出,共同進步!

老生常談

  • 我的QQ:499452441
  • 微信公衆號:lqdevOps

公衆號

我的博客:http://blog.lqdev.cn

原文地址:http://blog.lqdev.cn/2018/08/12/docker/docker-seven/

相關文章
相關標籤/搜索