我們前面的文章學習了 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 安裝
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 ,我們一起來體驗一下官方的 例子,先會使用,再來研究
準備環境和程式碼
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 網路,自定義網路
參考資料:
歡迎點贊,關注,收藏
朋友們,你的支援和鼓勵,是我堅持分享,提高質量的動力
好了,本次就到這裡
技術是開放的,我們的心態,更應是開放的。擁抱變化,向陽而生,努力向前行。
我是小魔童哪吒,歡迎點贊關注收藏,下次見~
本作品採用《CC 協議》,轉載必須註明作者和本文連結