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

小魔童哪吒發表於2021-12-03

我們前面的文章學習了 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 Dockerfileso it can be reproduced anywhere.

2、Define the services that make up your app in docker-compose.ymlso 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-compose up

#docker-compose up

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

Creating network "composetest_default" with the default driver

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

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

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

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

curl localhost:5000

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

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

檢視一下網路

docker network ls

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 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

歡迎點贊,關注,收藏

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

好了,本次就到這裡

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

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

本作品採用《CC 協議》,轉載必須註明作者和本文連結
關注微信公眾號:小魔童哪吒

相關文章