現代化小白也要嘗試的容器手札 - YAML 描述檔探討

 Day 29. YAML 描述檔探討

科普YAML

實際上自己也常把YAML與JSON拿來做比較,我這邊非常簡易的分辨一下:

  1. YAML本身視為JSON的超集,故YAML本身就支援JSON的格式。
  2. 實務場景應用上JSON與YAML本身並不是很雷同。
  • JSON大多用於資料傳輸通訊
  • YAML大多用於組態設定

所以透過以上區分其實並沒有互相取代的意味,更凸顯的雙方的共生行列。

科普YAML維基百科
官網強調YAML並非標註語言,而是一種適用於所有語言,人性化的資料序列標準。講人話YAML就是一種描述設定的文字檔格式,讓生為萬物之靈的我們可以清楚了解文字內容所要表達的意思。

科普超集:

  • 如果一個集合S2中的每一個元素都在集合S1中,且集合S1中可能包含S2中没有的元素,則集合S1就是S2的一個超集,反之,S2是S1的子集,而S1是S2的超集。
  • 若S1中一定有S2中没有的元素,则S1是S2的真超集,反之S2是S1的真子集。

https://ithelp.ithome.com.tw/upload/images/20201004/200254812u5wAiWewt.png

[科普JSON、XML、TOML、CSON、YAML差異化](https://kknews.cc/code/a3ex5av.html https://kknews.cc/zh-tw/code/a3ex5av.html)

docker-compose.yml

Docker Compose可讓我們用一個指定採用的描述檔docker-compose.yml來管理多容,預設範本文件是docker-compose.yml,其描述檔就是採用YAML格式來做撰寫。
而描述檔中的服務會需要透過image指令來指定映像透過build搭配Dockerfile来做自動佈建
一旦透過build佈建,在Dockerfile中所設置的選項如:CMD,EXPOSE,VOLUME等.. 都是會被自動獲取而無需在docker-compose.yml中重複设置。

我們可以先比較一個個分開的前後端部署的狀態
單身前
使用Dockerfile建立新映像或是到指定的倉庫來抓取後建立所需要的容器,以下為例分別有前後端各一組容器,透過docker run指令來運行,但會需輸入很多次可能是重複性或非重複性的指令才能讓一個完整的應用服務啟動。

前端

docker run --rm -p 8000:8000 --name webapp1.frontend webapp/frontend:2.1

後端

docker run --rm -p 8080:8080 --name webapp2.backend webapp/backend:2.1 npm run start

脫單後
只需將想要編排設置寫在docker-compose.yml後,就可一次運作多個Dockerfile並協調Service間的相依性和調度安排。

前後端

// docker-compose.yml
version: '3'
services:
    frontend:
        image: webapp/frontend:2.1
        container_name: webapp1.frontend
        ports:
            - "8000:8000"
    backend:
        image: webapp/backend:2.1
        container_name: webapp2.backend
        ports:
            - "8080:8080"
        command: "npm run start"
        environment:
            PORT: 8080
            NODE_ENV: "development"

在Compose的描述世界中,AP是由一群Service所組成,每個service就像容器可以編寫好每個映像容器要安裝什麼樣的程式,應該到哪個環境提取,掛載哪個Volume空間,並透過所定義的網路,指定什麼樣的連接埠來做一套流程串連。

每當需要建立容器時,就會以Service來作為當範本產生容器服務。

常用參數解析

version:用來定義Compose的版本,最新是Version3含以上是官方推薦使用的版本。
service:定義服務描述之內容。
cgroup_parent:用來繼承父Cgroup的資源限制。

cgroup_parent: cgroups_01

build:取得DockerFile所在資料夾位置

version: '3'
services:

  webapp:
    build: ./dir

depends_on:有服務相依關係,如須先啟動db後,才會執行AP的部份。

version: '3'

services:
  web:
    build: .
    depends_on:
      - db
      - redis

  redis:
    image: redis

  db:
    image: postgres

cap_add or cap_drop:指定容器Capacity的分配,如使用全部的資源。

cap_add:
  - ALL

port:允許暴露連接埠給外部存取訪問使用。
expose:只允許暴露連接埠給其他內部容器來使用,從外部存取訪問是無法的。
volume:本地資料夾掛載容器資料並直接修改本地資料夾內檔案,一旦容器裡的檔案更新後,就無需重建映像。

  • 絕對路徑 /opt/cache:/tmp/cache
  • Compose配置為中心的相對路徑 ./cache:/tmp/cache
  • ~/ 表示的是目錄 ~/cache://tmp/cache

NODE_ENV:設置變量後會自動運行Compose內對應的參數值。
ulimits:指定最大程序數量為65535,可以指定文件句數軟性限制10000,這是可以隨時修改,但唯一要求就是不能超過硬限制,如一旦達到40000時就出現的系統硬限制天花板底線,唯一只有Root帳戶可以修改。
dns:自訂解析的名稱伺服器位置。

dns:
  - 8.8.8.8
  - 168.95.1.1

sysctls:設置容器的內核參數。

sysctls:
  net.core.somaxconn: 512
  net.ipv4.tcp_syncookies: 0

devices:指定設備的映射關係。

devices:
  - "/dev/ttyUSB001:/dev/gyttyUSB01"

command:容器啟動後會預設執行的命令。

command: echo "This is a Container world"

tmpfs:指定搭載一個暫存文檔空間。

tmpfs: /run
tmpfs:
  - /run
  - /tmp

cache_from:建立映像時的快取空間。

build:
  context: .
  cache_from:
    - alpine:latest
    - corp/web_app:2.1

留言

這個網誌中的熱門文章

Azure 命令工具資源彙整

Azure DNS PTR 反解解惑教學

Windows Server 2022 整合 Azure Arc 簡易教學示範