# docker-compose 學習筆記(回家做) 我們的docker-compose要放在專案目錄底下我們將docker-compose取為`docker-compose.yml`我先來了解一下什麼是.yml對之後撰寫docker-compose有一定的幫助 ### YAML? * 特點 * 大小寫敏感(大小寫名稱有差) * 使用所寫表示層級關系(跟python的層級關係有點像) * 鎖進**不允許使用TAB**,只能用空格 * 縮進的隔數不重要,只要相同層級的元素左邊對其即可 * '#'為註解 * 簡介 * 一種 適用於所有語言,人性化的資料序列標準,其中YAML有多個節點 (node),每個節點必定是**純量** (Scalar)、**序列** (Sequence)、**映射**(Mapping)資料 其中一種。 * 資料格式 * 純量:自定義資料,是最基本、不可再分的值 >`scalar` * 序列:有序的節點清單。以 "-" 表示該行資料序列 >`- sequence1` >`- sequence2` * 映射:利用 `Key:Value` 來表示 >`language:csharp` ## yaml 語法 要住一點YAML他的縮行是使用**空格**,註解是用#放段落最前端 ## 資料集 YAML 的資料,可以利用 Scalar、Sequence、mapping 的各種組合,表示出資料的集合。 ### 序列格式資料集 * 序列:純量(scalar) ```yaml= - JOHN - Happy ``` * 序列:印射(mapping) ```yaml= - name: John age: 20 - name: Roy age: 32 ``` ### 映射格式資料集 * 映射:Scalars to Scalars ```yaml= name: John age: 20 ``` * 映射:Scalars to Sequence ```yaml= person: - John - Roy ``` ## 區塊結構 將資料進行區塊劃分 ```yaml= --- # begin ... # end ``` ## 多行資料的表示方式 Scalars 內的文字太長或是需要分段落時,會以` | `或` > `表示。 ```yaml= node: | this is first line this is second line ``` node取得的資料結果為 ## Docker-compose ### 簡介 我們可以利用Docker CLI 將容器一個個得開啟,但實在是太麻煩了且容易出錯。所以Docker Compose定義應用程式的預期狀態。我們可以將Docker容器執行時所有的命令與配置放入Compose當中,利用Docker Compose工具執行應用程式。執行過程中Docker Compose會計算需要的Docker資源,並藉由Docker API發送新增資源的要求。 ### code & 解釋 ```yaml= version: '3.8' # 文件的版本,但現在已經被棄用了所以版本這段可有可無 services: #列出組成應用程式的所有元件 services 為 Docker Compose 的最小單位 # 定義要運行的服務 backend: # 運行的服務,提供給 docker-compose 及 network 使用 build: . # Dockerfile 的路徑 container_name: backend_flask # 定義容器名稱 networks: # 新增網路 - net # 新增名為 net 的網路 ports: # 'backend_flask'容器的埠號設定 - 5000:5000 # host & 'backend_flask'容器埠號設定為 5000,有需要可以新增其他埠號 environment: # 當應用程式執行時,容器會設定的環境變數 - REDIS_URL=redis://cache:6379/0 volumes: # 掛載定義,'.'的意思是專案當前目錄,冒號後面 '/test' 為掛載位子,名稱會對應到你 dockerfile 底下volume的名稱 - .:/test:ro # /test後面有一個:ro(read only) 這邊是定義權限 command: "python3 app.py" # 終端指令"python3 app.py" cache: # 運行的服務器名稱 image: redis # 使用名為redis的映象檔(image), container_name: database_redis networks: - net ports: - 6379:6379 networks: # 列出可以加入Docker的虛擬網路 # 新增一個名為 net 的網路(network) net: #net name: frnet # 將net的名稱設為 frnet driver: bridge # 設定網路類型為 bridge(最常用且為預設) # driver 類型有 bridge、host、overlay、macvlan、none # bridge network : 每個獨立的 container 都有一個 software bridge 作為對外部的連線(全部連到同一個出口) # host network : 使用與 Docker Host 相同的網路 、 僅在 Linux 上才有用,最後一定要對外開放port才會有功能 # overlay network : 要啟用 swarm service 來讓多個 container 可以相互溝通,詳細資訊底下放連結 # macvlan network : 可以讓使用者直接分配實體網卡的 MAC address 給特定的 container,講白了就是讓 container 連接到實體網卡的網路 # none : 不給 container 使用網路,不讓他對外聯繫 # https://godleon.github.io/blog/Docker/docker-network-overview/#Host-Network ``` ### Q&A 1. Q: 為什麼DockerCompose的最小單位不是容器(Container)? * A: Service 是有可能由同一個映像檔中的多個容器多個容器所構成的 ###### tags: `學長作業`