Docker Compose

2022-09-03 12:08:44

簡介

  • 之前使用docker時,寫完一個專案之後需要定義一個docker file,再通過docker build生成一個映象,並通過docker run執行;都是通過手動操作,用於單個容器,非常麻煩,現在想要的效果是:有100個微服務,存在依賴關係,通過docker 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。
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.
介紹總結:
定義、執行多個容器。
YAML file 組態檔。
single command。 命令有哪些?

  • 三步驟:
    Using Compose is basically a three-step process:

1.Define your app’s environment with a dockerfile so it can be reproduced anywhere.
Dockerfile 保證我們的專案在任何地方可以執行。

2.Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.
services 什麼是服務。
docker-compose.yml 這個檔案怎麼寫!

3.Run docker-compose up and Compose starts and runs your entire app.
啟動專案

  • 作用:批次容器編排

補充理解
Compose 是Docker官方的開源專案。需要安裝!
Dockerfile 讓程式在任何地方執行。 web服務。 redis、mysql、nginx ... 多個容器。需要run很多次

Compose則因此而生

# A docker-compose.yml looks like this:(yml檔案範例)
version: '2.0' 
services:
	web:
		build: . 
		ports:
		- "5000:5000"
		volumes:
		-.:/code
		-logvolume01:/var/log 
		links:
		-redis 
	redis:
		image: redis 
volumes:
	logvolume01: {}

Compose重要的概念:
1.服務services,說白了就是容器,應用(web、redis、mysql.)這些應用可以使用compose進行編排
2.就生成一個專案project,是一組關聯的容器。跑起來 部落格。web、mysql。

Compose 和 Swarm區別
Docker Swarm 和 Docker Compose 一樣,都是 Docker 官方容器編排專案,但不同的是:

  • Docker Compose 是一個在單個伺服器或主機上建立多個容器的工具
  • Docker Swarm 則可以在多個伺服器或主機上建立容器叢集服務

因此,對於微服務的部署,顯然 Docker Swarm 會更加適合

安裝

1,下載

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

# 這個可能快點!
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

2,授權

cd /usr/local/bin
ll
sudo chmod +x /usr/local/bin/docker-compose
docker-compose version
# 看到版本號則安裝成功

思路

官方步驟地址:https://docs.docker.com/compose/gettingstarted/

  • 1,建立一個應用,例:app.py
  • 2,寫一個dockerfile,將應用打包成映象
  • 3,寫Docker-compose yaml檔案(檔案定義整個服務,需要的環境 | web、redis)完整的上線服務
  • 4,啟動 compose 專案(docker-compose up)

流程
1、建立網路
2、執行 Docker-compose yaml
3、啟動服務。
Docker-compose yaml

實踐步驟

通過Docker Compose上構建一個簡單的python web應用程式,該應用程式使用Flask框架並在redis中維護一個計數器,用來記錄該web應用被存取的次數。

官方步驟地址:https://docs.docker.com/compose/gettingstarted/

1,準備工作

yum -y install python-pip	# pip是python包管理工具
yum -y install epel-release # 報錯的話執行

2,為專案建立目錄

mkdir composetest
cd composetest

3,在專案目錄中建立一個名為app.py的檔案,內容如下:

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

在此範例中,redis是應用程式網路上 redis 容器的主機名。我們使用 Redis 的預設埠6379

4,在專案目錄中建立另一個名為requirements.txt的檔案,內容如下:

vim requirements.txt
# 寫入:
flask
redis

5,在專案目錄中,建立名為 Dockerfile的檔案:

vim 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 ["python", "app.py"]

# 這告訴 Docker:

# 從 Python 3.7 映像開始構建映像。
# 將工作目錄設定為 。/code
# 設定命令使用的環境變數。flask
# 安裝 gcc 和其他依賴項
# 複製並安裝 Python 依賴項。requirements.txt
# 將後設資料新增到映像,以描述容器正在偵聽埠 5000
# 將專案中的當前目錄複製到映像中的工作目錄。..
# 將容器的預設命令設定為 。flask run

6,在專案目錄中建立一個名為docker-compose.yml的檔案:

vim docker-compose.yml
# 寫入:
version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:5000"
  redis:
    image: "redis:alpine"
	
# 此撰寫檔案定義了兩個服務:web和redis

7,從專案目錄中,通過執行 啟動應用程式

docker-compose up

Compose 會拉取 Redis 映像,為程式碼構建映像,然後啟動定義的服務。在這種情況下,程式碼在生成時靜態複製到映像中

8,在瀏覽器中輸入 http://localhost:8000/ 以檢視正在執行的應用程式

curl local:8000
# 多次curl或者重新整理頁面會增加次數
Hello World!I have been seen 2 times.

如果你在 Linux、Docker Desktop for Mac 或 Docker Desktop for Windows 上本機使用 Docker,那麼 Web 應用現在應該在 Docker 守護程式主機上的埠 8000 上偵聽。
將 Web 瀏覽器指向 http://localhost:8000 以查詢郵件。如果無法解決此問題,您也可以嘗試 http://127.0.0.1:8000。Hello World

docker-compose
以前都是單個docker run啟動容器
docker-compose 通過docker-compose編寫yaml組態檔,可以通過compose一鍵啟動所有服務或停止。

docker小結

1,Docker映象 run => 容器
2,DockerFile構建映象(服務打包)
3,Docker-compose啟動專案(編排,多個微服務/環境)
4,Docker網路

Compose設定編寫規則

yaml規則

可檢視官網範例: https://docs.docker.com/compose/compose-file/

# 三層

# 1
version: '' #版本

# 2
services: #服務
	服務1:  web
	   # 服務設定
	   images
	   build
	   network
	   ......
	服務2: redis
	   ......
	服務3: redis
	   ......
	  
# 3
#其他設定 網路/卷,全域性規則
volumes:
networks:
config: