1. 程式人生 > >Docker | 第七章:Docker Compose服務編排介紹及使用

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

覆蓋 tin linu docs 使用 學習 events environ 操作系統

前言

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

  • Compose介紹
  • Compose安裝
    • 二進制文件直接安裝
    • 使用pip(Python包管理工具)安裝
    • 命令補齊
  • Compose常用命令
    • build
    • kill
    • logs
    • port
    • ps
    • pull
    • rm
    • run
    • start
    • stop
    • up
    • pause
  • docker-compose.yml模版文件常用命令
    • image
    • build
    • command
    • links
    • dns
    • environment
    • env_file
    • expose
    • volumes
    • volumes_from
  • Compose編排實踐
  • 參考資料
  • 總結
  • 最後
  • 老生常談

Compose介紹

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

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

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

技術分享圖片

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

Compose實現原理圖:

技術分享圖片

Compose 中有兩個重要的概念:

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

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

Compose 項目由 Python 編寫,實現上調用了 Docker

服務提供的 API 來對容器進行管理。因此,只要所操作的平臺支持 Docker API,就可以在其上利用 Compose 來進行編排管理。

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

Compose安裝

本身Compose是一個獨立的產品,所以需要獨立安裝的。

按官網的說明,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

鏈接到其它服務中的容器。使用服務名稱(同時作為別名)或服務名稱:服務別名 (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/

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