【Docker 系列】docker 學習九,Compose 內容編排官網初步體驗

小魔童哪吒 發表於 2021-12-05
Docker

【Docker 系列】docker 學習九,Compose 內容編排官網初步體驗

我們前面的文章學習了 docker ,為什麼還要 Compose 呢?Compose到底是個啥玩意?

Docker Compose 可以來輕鬆的高效的管理容器,定義執行多個容器

我們們一起來看看官方的介紹 docs

Compose 是什麼

Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. To learn more about all the features of Compose, see the list of features.

講了三個點:

  • Compose 可以定義和執行多個容器
  • 需要使用給到 YAML 配置檔案
  • 單個命令就可以建立和啟動所有的服務

Compose works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases.

Docker Compose 可以執行在所有的環境中

Using Compose is basically a three-step process:

1、Define your app’s environment with a Dockerfile so it can be reproduced anywhere.

2、Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.

3、Run docker compose up and the Docker compose command starts and runs your entire app. You can alternatively run docker-compose up using the docker-compose binary.

三個步驟:

  • 需要定義好 Dockerfile ,保證它在任何環境都能執行
  • 在 docker-compose.yml 檔案中定義好 services,那麼這個 yml 檔案如何寫呢?services 咋定義呢
  • 使用docker-compose binary啟動專案

總結上述官方說明:

Docker Compose 用於批量容器編排

如果一個專案中的多個微服務(幾十個或者幾百個),我們都一個一個的使用 docker run是不是很傻?而且對於運維來說也是一個非常不友好的事情,優化這樣的問題,我們有了 Docker Compose

Compose 在 Docker 中預設就有嗎?

Docker 中預設是沒有 Compose 的,Compose 是 Docker 官方的開源專案,我們使用 Compose ,是需要自己另外安裝的

Compose 的 yml 檔案如何編寫?

一起來看看官方文件的 yml 是怎樣的結構:

A docker-compose.yml looks like this:

version: "3.9"  # optional since v1.27.0
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}
  • services

指定服務

  • volumes

指定掛載卷

通過官方文件的上述說明,我們可以知道 Compose 有這麼 2 個重要的概念:

  • services 服務,就是容器和相關的應用
  • 專案,就是一組關聯的容器

Compose 安裝

Docker Compose install

1、我們們選擇在 linux 下面安裝 Docker Compose ,執行如下指令進行安裝

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

安裝成功後在我們的 linux 目錄 /usr/local/bin/會有 docker-compose 程式

2、 給程式 docker-compose 加上可執行的許可權

sudo chmod +x /usr/local/bin/docker-compose

3、安裝成功,檢視 docker-compose 的版本,看到如下資訊即為成功

# docker-compose version
docker-compose version 1.29.2, build 5becea4c
docker-py version: 5.0.0
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

Compose 官方案例體驗

Docker Compose gettingstarted

我們們安裝好了 docker-compose ,我們一起來體驗一下官方的 例子,先會使用,再來研究

準備環境和程式碼

1、建立 compose 測試目錄,自己可以在任意目錄下執行如下指令

mkdir composetest
cd composetest

2、編寫 app.py 檔案

app.py

import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)

@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

該 py 檔案的功能就是,註冊了一個路由為 /,我們訪問伺服器的/時,程式會去讀取 redis 的計數器,來確認這個網站是訪問了第幾次了

3、建立一個檔案 requirements.txt,用於之後的安裝

requirements.txt

flask
redis

建立 DockerFile 檔案

寫 Dockerfile 檔案

Dockerfile

# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]

Dockerfile 檔案中的含義是:

  • 基於 python:3.7-alpine 構建映象
  • 設定工作目錄為 /code
  • 設定 FLASK_APP 環境變數
  • 設定 FLASK_RUN_HOST 環境變數
  • 執行 apk add --no-cache gcc musl-dev linux-headers指令
  • 拷貝檔案requirements.txt到容器中
  • 執行 pip 安裝 requirements.txt 中的元件
  • 暴露 5000 埠
  • 拷貝 . 到 .
  • 執行 flask run 命令

定義 Compose 檔案(yml檔案)

docker-compose.yml

version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

這個 compose 檔案定義了 2 個服務

  • web 服務,暴露的是 5000 埠
  • redis

構建和執行我們的 Compose

執行指令前,我們來檢視一下我們的 compose 測試目錄都有些啥了:

【Docker 系列】docker 學習九,Compose 內容編排官網初步體驗

開始構建

docker-compose up

#docker-compose up

【Docker 系列】docker 學習九,Compose 內容編排官網初步體驗

可以看到執行指令 docker-compose up之後, Compose 也是在一層一層的執行,並且我們可以看到 compose 是最先建立了一個自定義網路

Creating network "composetest_default" with the default driver

【Docker 系列】docker 學習九,Compose 內容編排官網初步體驗

看到這裡,我們發現 Compose 會自動幫我們建立 redis 容器和 web 容器

Creating composetest_web_1   ... done
Creating composetest_redis_1 ... done

【Docker 系列】docker 學習九,Compose 內容編排官網初步體驗

最後,我們看到 Compose 幫我們將 redis 和 web 啟動起來了,程式正常執行,

我們們在宿主機使用 curl 命令,來請求一下這個 web 服務

curl localhost:5000

【Docker 系列】docker 學習九,Compose 內容編排官網初步體驗

果然 ok,官方的 compose 體驗 no problem ,nice

檢視一下映象
使用 docker images 檢視一下映象,發現多了 composetest_web,python,redis alpine 版本 ,這些也都是 compose 自動為我們做的,非常方便

【Docker 系列】docker 學習九,Compose 內容編排官網初步體驗

檢視一下網路

docker network ls

compose 構建的時候,一開始就會為我們建立一個網路

【Docker 系列】docker 學習九,Compose 內容編排官網初步體驗

疑問?

細心的朋友發現了,我們的容器名字為什麼是 composetest_web_1 , 和 composetest_redis_1

這個是 Docker Compose 裡面的一種規則,便於標識對應的副本

例如,compose 裡面對於容器會是這樣的命名:

檔名_服務名_num

多個伺服器叢集的時候,這個 num 的作用就體現出來的,num 標識第幾個副本

網路規則

多個容器只要是在一個區域網內,就可以互相 ping 通,相互通訊,通過域名訪問

例如 mysql 叢集裡面的服務,我們就可以訪問 mysql:3306 , compose 就會給我們訪問到 mysql:3306 這個服務

我們可以檢視上面的 docker compose 給我們新建的自定義網路

docker network ls

【Docker 系列】docker 學習九,Compose 內容編排官網初步體驗

# docker network inspect composetest_default
    ...
        "Containers": {
            "25b5814cfded10e00d2e59a8e17fcba670232bce135fdabd558b7c0530d011a4": {
                "Name": "composetest_web_1",
                "EndpointID": "cb131464ea9112403f851b14a37fa5c67b023f2ce28a1e85c409e3f284f78db4",
                "MacAddress": "02:42:ac:13:00:03",
                "IPv4Address": "172.19.0.3/16",
                "IPv6Address": ""
            },
            "e7fedce77d3759fefde5bef84c759a5c59e033a6f48850e5930825bfc8a8444c": {
                "Name": "composetest_redis_1",
                "EndpointID": "3af891f7d52cba7ec75eb01533af1d5dae4dcd0d8bf4c55e6b342075f971be22",
                "MacAddress": "02:42:ac:13:00:02",
                "IPv4Address": "172.19.0.2/16",
                "IPv6Address": ""
            }
        },
       ...

發現上面的例子, web 服務和 redis 服務,是在同一個網路下的,所有可以相互通訊

停止 compose

我們們可以使用 ctrl + c 停止 compose

也可以通過 docker-compose down停止 compose

停止 compose ,那麼 compose 裡面涉及的服務,全部都會停止掉

# docker-compose down
Stopping composetest_web_1   ... done
Stopping composetest_redis_1 ... done
Removing composetest_web_1   ... done
Removing composetest_redis_1 ... done
Removing network composetest_default
  • 停止 composetest_web_1
  • 停止 composetest_redis_1
  • 刪除 composetest_web_1
  • 刪除 composetest_redis_1
  • 移除自定義網路 composetest_default

小結

  • 我們們使用 docker 映象,通過 docker run 命令可以建立並啟動容器
  • DockerFile 可以構建映象,也就是將服務打包
  • docker-compose 可以啟動專案,進行多個微服務的編排和在環境裡面一鍵部署
  • Docker 網路,自定義網路

參考資料:

docker docs

歡迎點贊,關注,收藏

朋友們,你的支援和鼓勵,是我堅持分享,提高質量的動力

【Docker 系列】docker 學習九,Compose 內容編排官網初步體驗

好了,本次就到這裡

技術是開放的,我們的心態,更應是開放的。擁抱變化,向陽而生,努力向前行。

我是小魔童哪吒,歡迎點贊關注收藏,下次見~