天天看點

Docker入門-docker compose的使用

Compose簡介

Compose項目是Docker官方的開源項目,負責實作對Docker容器叢集的快速編排。其代碼目前在

https://github.com/docker/compose

上開源。

Compose定位是定義和運作多個Docker容器的應用,其前身是開源項目Fig。

通過前面内容的介紹,我們知道使用一個Dockerfile模闆檔案,可以讓使用者很友善的定義一個單獨的應用容器。然而,在日常工作中,經常會碰到需要多個容器互相配合來完成某任務的情況。例如要實作一個Web項目,除了Web服務容器本身,往往還需要加上後端的資料庫服務容器,甚至還包括負載均衡容器等。

Compose恰好滿足了這樣的需求。它允許使用者通過一個單獨的docker-compose.yml模闆檔案來定義一組相關聯的應用容器為一個項目(project)。

Compose中有兩個重要的概念:

  • 服務(service):一個應用的容器,實際上可以包括若幹運作相同鏡像的容器執行個體。
  • 項目(project):由一組關聯的應用容器組成的一個完整業務單元。

Compose的預設管理對象是項目,通過子指令對項目中的一組容器進行便捷地生命周期管理。

Compose項目由Python編寫,實作上調用了Docker服務提供的API來對容器進行管理。

安裝和解除安裝

Compose支援Linux、macOS、Windows10三大平台。

Compose可以通過Python的包管理工具pip進行安裝,也可以直接下載下傳編譯好的二進制檔案使用,甚至能夠直接在Docker容器中運作。

Docker for Mac、Docker for Windows自帶docker-compose二進制檔案,安裝Docker之後可以直接使用。

docker-compose --version           

Linux系統需要單獨使用二進制或者pip方式進行安裝。

Linux安裝docker-compose

二進制包

在Linux上的安裝十分簡單,從官方GitHub Release處直接下載下傳編譯好的二進制檔案即可。例如,在Linux64位系統上直接下載下傳對應的二進制包。

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose  #賦予可執行權限           
Docker入門-docker compose的使用

PIP安裝

如果您計算機的架構是ARM(例如,樹莓派),建議使用pip安裝。

sudo pip install -U docker-compose           

使用

場景:最常見的項目是web網站,一般的web網站都會依賴第三方提供的服務(比如:DB和cache),我們拿dubbo-admin進行講解(dubbo-admin依賴zookeeper)。

Compose建構dubbo-admin服務

從github上擷取dubbo-admin的master分支源碼

git clone -b master https://github.com/apache/incubator-dubbo-ops.git           

修改admin中的application配置,把zookeeper位址改為zookeeper://zookeeper:2181

Docker入門-docker compose的使用

使用maven進行編譯打包

mvn clean package -Dmaven.test.skip=true           
Docker入門-docker compose的使用

在dubbo-admin目錄下編寫Dockerfile檔案,内容為

# FROM,表示使用JDK8環境為基礎鏡像,如果鏡像不是本地會從DockerHub進行下載下傳
FROM openjdk:8-jdk-alpine
# 作者
MAINTAINER Simon<[email protected]>
VOLUME /tmp
# ADD,拷貝檔案并且重命名
ADD ./target/dubbo-admin-0.0.1-SNAPSHOT.jar app.jar
# ENTRYPOINT,為了縮短Tomcat啟動時間,添加java.security.egd的系統屬性指向/dev/urandom作為ENTRYPOINT
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]           

使用docker build -t dubbo-admin:1.0 .指令進行建構。

Docker入門-docker compose的使用

在項目根目錄下編寫docker-compose.yml檔案,這個是Compose使用的主模闆檔案。

version: '3.4'
services:
  zk_server:
    image: zookeeper:3.4
    ports:
      - 2181:2181
  dubbo-admin:
    image: dubbo-admin:1.0
    links:
      - zk_server:zookeeper
    depends_on:
      - zk_server
    ports:
      - 7001:7001            

在docker-compose.yml檔案所在目錄執行:

docker-compose up           
Docker入門-docker compose的使用

在浏覽器中通路

http://

伺服器ip:7001 進行驗證,使用者名密碼為:root/root guest/guest

Docker入門-docker compose的使用

Compose指令說明

指令對象與格式

執行docker-compose [COMMAND] --help或者docker-compose help [COMMAND]可以檢視具體某個指令的使用格式。

docker-compose指令的基本的使用格式是:

docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]           

指令選項

  • -f,--file FILE指定模闆檔案,預設為docker-compose.yml,可以多次指定。
  • -p,--project-name NAME指定項目名稱,預設将使用所在目錄名稱作為項目名。
  • --x-networking使用Docker的可拔插網絡後端特性
  • --x-network-driver DRIVER指定網絡後端的驅動,預設為bridge
  • --verbose輸出更多調試資訊。
  • -v,--version列印版本并退出。

build

格式為docker-compose build [options] [SERVICE...]。
建構(重新建構)項目中的服務容器。
可以随時在項目目錄下運作docker-compose build來重新建構服務。
選項包括:
* --force-rm 删除建構過程中的臨時容器。
* --no-cache 建構鏡像過程中不使用cache(将加長建構過程)。
* --pull 始終嘗試通過pull來擷取更新版本的鏡像。           

logs

格式為docker-compose logs [options] [SERVICE...]。
檢視服務容器的輸出。預設情況下,docker-compose将對不同的服務輸出使用不同的顔色來區分。可以通過--no-color來關閉顔色。           

port

格式為docker-compose port [options] SERVICE PRIVATE_PORT。
列印某個容器端口所映射的公共端口。
選項:
 --protocol=proto指定端口協定,tcp(預設值)或者udp。
 --index=index如果同一服務存在多個容器,指定指令對象容器的序号(預設為1)。           

ps

格式為docker-compose ps [options] [SERVICE...]
列出項目中目前的所有容器。
選項:
 -q隻列印容器的ID資訊。           

pull

格式為docker-compose pull [options] [SERVICE...]。
拉取服務依賴的鏡像。
選項:
 --ignore-pull-failures忽略拉取鏡像過程中的錯誤。           

restart

格式為docker-compose restart [options] [SERVICE...]
重新開機項目中的服務。
選項:
 -t,--timeout TIMEOUT指定重新開機前停止容器的逾時(預設為10秒)。           

rm

格式為docker-compose rm [options] [SERVICE...]
删除所有(停止狀态的)服務容器。推薦先執行docker-compose stop指令來停止容器。
選項:
 -f,--force強制直接删除,包括非停止狀态的容器。一般盡量不要使用該選項。
 -v删除容器所挂載的資料卷。           

run

格式為docker-compose run[options] [-p PORT...][-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]
在指定服務上執行一個指令。例如:
docker-compose run ubuntu ping docker.com           

scale

格式為docker-compose scal [options] [SERVICE=NUM...]
設定指定服務運作的容器個數。例如:
docker-compose scale web=3 db=2
将啟動3個容器運作web服務,2個容器運作db服務。           

up

該指令十分強大,它将嘗試自動完成包括建構鏡像,(重新)建立服務,啟動服務,并關聯服務相關容器的一系列操作。連結的服務都将會被自動啟動,除非已經處于運作狀态。
選項:
 -d 在背景運作服務容器。
 --no-color 不使用顔色來區分不同的服務的控制台輸出。
 --no-deps 不啟動服務所連結的容器。
 --force-recreate強制重新建立容器,不能與--no-recreate同時使用。
 --no-recreate如果容器已經存在了,則不重新建立,不能與--force-recreate同時使用。
 --no-build 不自動建構缺失的服務鏡像。
 -t,--timeout TIMEOUT停止容器時候的逾時(預設為10秒)。           

其它指令如下:

指令 說明
version 格式為docker-compose version,列印版本資訊
config 驗證Compose格式是否正确,若正确則顯示配置,若格式錯誤顯示錯誤原因。
exec 進入指定的容器
images 列出Compose檔案中包含的鏡像
down 停止up指令所啟動的容器,并移除網絡。
help 獲得一個指令的幫助
kill 通過發送SIGKILL信号來強制停止服務容器
pause 格式為docker-compose pause [SERVICE...],暫停一個服務容器。
push 推送服務依賴的鏡像到Docker鏡像倉庫
start 格式為docker-compose start[SERVICE...],啟動已經存在的服務容器。
stop 停止已經存在的服務容器。
top 檢視各個服務容器内運作的程序
unpause 格式為docker-compose unpause [SERVICE...],恢複處于暫停狀态中的服務。

Compose模闆檔案

模闆檔案是使用Compose的核心,涉及到的指令關鍵字也比較多,大部分指令跟docker run 相關參數的含義都類似。

預設的模闆檔案名稱為docker-compose.yml,格式為YAML格式。

注意每個服務都必須通過image指令指定鏡像或build指令(需要Dockerfile)等來自動建構生成鏡像。

如果使用build指令,在Dockerfile中設定的選項(例如:CMD,EXPOSE,VOLUME,ENV等)将會自動被擷取,無需在docker-compose.yml中再次設定。下面介紹常用指令的用法。

version: '3'
services:
  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1           
指令Dockerfile所在檔案夾的路徑(可以是絕對路徑,或者相對docker-compose.yml檔案的路徑)。
Compose将會利用它自動建構這個鏡像,然後使用這個鏡像。
使用context指令指定Dockerfile所在檔案夾的路徑
使用dockerfile指令指定Dockerfile檔案名
使用arg指令指定建構鏡像時的變量           

command

覆寫容器啟動後預設執行的指令。

command:echo "hello world"           

Container_name

指令容器名稱。預設将會使用項目名稱_服務名稱_序号這樣的格式。

container_name:docker-web-container           

configs

僅用于Swarm mode, 詳細内容後頁面swarm mode會進到。

deploy

僅用于Swarm mode,詳細内容後面swarm mode會進到。

devices

指定裝置映射關系。

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

depends_on

解決容器的依賴、啟動先後的問題。

dns

自定義DNS伺服器。可以是一個值,也可以是一個清單。

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 114.114.114.114           

environment

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

隻給定名稱的變量會自動擷取運作Compose主機上對應變量的值,可以用來防止洩露不必要的資料。

environment:
  RACK_ENV: development
  SESSION_SECRET:
environment:
  - RACK_ENV=development
  - SESSION_SECRET             

expose

顯露端口,但不映射到主控端,隻被連接配接的服務通路。僅可以指定内部端口為參數

expose:
  - "3000"
  - "8000"           

extra_hosts

類似Docker中的--add-host參數,指定額外的host名稱映射資訊。

會在啟動後的服務容器中/etc/hosts檔案中添加一條條目。8.8.8.8 googledns

extra_hosts:
  - "googledns:8.8.8.8"           

healthcheck

通過指令容器是否健康運作。

healthcheck:
   test:["CMD","curl","-f","http://localhost"]
   interval:1m30s
   timeout:10s
   retries:3           

image

指定為鏡像名稱或鏡像ID。如果鏡像在本地不存在,Compose将會嘗試拉去這個鏡像

image:session-web:latest           

lables

為容器添加Docker中繼資料(metadata)資訊。例如可以為容器添加輔助說明資訊。

labels:
  com.study.department:"devops department"
  com.study.release:"v1.0"           

links

連接配接到其他容器。注意:不推薦使用該指令。

應該使用docker network,建立網絡,而docker run --network來連接配接特定網絡。或者使用version:'2'和更高版本的docker-compose.yml直接定義自定義網絡并使用。

network_mode

設定網絡模式。使用和docker run的--network參數一樣的值。

network_mode:"bridge"
network_mode:"host"
network_mode:"none"           

networks

配置容器連接配接的網絡。

version:"3"
services:
  some-service:
    networks:
      - some-network
networks:
  some-network:                 

ports

暴露端口資訊。使用宿主端口:容器端口(HOST:CONTAINER)格式,或者僅僅指定容器的端口(宿主将會随機選擇端口)都可以。

ports:
  - "3000"
  - "8000:8000"           

volumes

資料卷所挂載路徑設定,可以設定主控端路徑,同時支援相關路徑。

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

ulimits

指定容器的ulimits限制值。

例如,指定最大程序數為65535,指定檔案句柄數為20000(軟限制,應用可以随時修改,不能超過硬限制)和40000(系統硬限制,隻能root使用者提高)。

ulimits:
  nproc: 65535
  nofile:
    soft: 20000
    hard: 40000           

此外,還有包括domainname,entrypoint,hostname,ipc,mac_address,privileged,read_only,shm_size,restart,stdin_open,tty,user,working_dir等指令,基本跟docker run中對應參數的功能相同。

指定服務容器啟動後執行的入口檔案

entrypoint: /code/entrypoint.sh           

指定容器中運作應用的使用者名

user:nginx           

指定容器中工作目錄

working_dir: /code           

指定容器中搜尋域名、主機名、mac位址等

domainname:your_website.com
hostname:test
mac_address:08-00-27-00-0C-0A           

允許容器中運作一些特權指令

privileged:true           

指定容器退出後的重新開機政策為始終重新開機。在生産環境中推薦配置為always或者unless-stopped

restart:alwarys           

以隻讀模式挂載容器的root檔案系統,意味着不能對容器内容進行修改

read_only:true           

打開标準輸入,可以接受外部輸入

stdin_open:true           

模拟一個僞終端

tty:true           

Compose模闆檔案支援動态讀取主機的系統環境變量和目前目錄下的.env檔案中的變量。例如,下面的Compose檔案将從運作它的環境中讀取變量${MONGO_VERSION}的值,并寫入執行的指令中。

version: "3"
services:
  db:
    image: "mongo:${MONGO_VERSION}"           

如果執行MONGO_VERSION=3.2 docker-compose up則會啟動一個mongo:3.2鏡像的容器。若目前目錄存在.env檔案,執行docker-compose指令時将從該檔案中讀取變量。