---
# System prepended metadata

title: docker-compose 學習筆記(回家做)
tags: [學長作業]

---

# 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: `學長作業` 