1. 程式人生 > 實用技巧 >技術點11:JSTL標籤庫

技術點11:JSTL標籤庫

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  #賦予可執行許可權
複製程式碼

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

使用maven進行編譯打包

mvn clean package -Dmaven.test.skip=true
複製程式碼

在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-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
複製程式碼


在瀏覽器中訪問http://伺服器ip:7001 進行驗證,使用者名稱密碼為:root/root guest/guest


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
複製程式碼

build

指令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命令時將從該檔案中讀取變數