我們前面的文章學習了 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 配置文件
- 單個命令就可以創(chuàng)建和啟動所有的服務
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 可以運行在所有的環(huán)境中
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 ,保證它在任何環(huán)境都能運行
- 在 docker-compose.yml 文件中定義好 services,那么這個 yml 文件如何寫呢?services 咋定義呢
- 使用
docker-compose binary啟動項目
總結上述官方說明:
Docker Compose 用于批量容器編排
如果一個項目中的多個微服務(幾十個或者幾百個),我們都一個一個的使用docker run是不是很傻?而且對于運維來說也是一個非常不友好的事情,優(yōu)化這樣的問題,我們有了 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 加上可執(zhí)行的權限
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 ,我們一起來體驗一下官方的 例子,先會使用,再來研究
準備環(huán)境和代碼
1、創(chuàng)建 compose 測試目錄,自己可以在任意目錄下執(zhí)行如下指令
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、創(chuàng)建一個文件 requirements.txt,用于之后的安裝
requirements.txt
flask
redis
創(chuàng)建 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 環(huán)境變量
- 設置 FLASK_RUN_HOST 環(huán)境變量
- 運行
apk add --no-cache gcc musl-dev linux-headers指令 - 拷貝文件
requirements.txt到容器中 - 運行 pip 安裝 requirements.txt 中的組件
- 暴露 5000 端口
- 拷貝 . 到 .
- 執(zhí)行 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
可以看到執(zhí)行指令 docker-compose up之后, Compose 也是在一層一層的執(zhí)行,并且我們可以看到 compose 是最先建立了一個自定義網絡
Creating network "composetest_default" with the default driver
看到這里,我們發(fā)現 Compose 會自動幫我們創(chuàng)建 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 查看一下鏡像,發(fā)現多了 composetest_web,python,redis alpine 版本 ,這些也都是 compose 自動為我們做的,非常方便
查看一下網絡
docker network ls
compose 構建的時候,一開始就會為我們創(chuàng)建一個網絡
疑問?
細心的朋友發(fā)現了,我們的容器名字為什么是 composetest_web_1 , 和 composetest_redis_1
這個是 Docker Compose 里面的一種規(guī)則,便于標識對應的副本
例如,compose 里面對于容器會是這樣的命名:
文件名_服務名_num
多個服務器集群的時候,這個 num 的作用就體現出來的,num 標識第幾個副本
網絡規(guī)則
多個容器只要是在一個局域網內,就可以互相 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": ""
}
},
...
發(fā)現上面的例子, 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 命令可以創(chuàng)建并啟動容器
- DockerFile 可以構建鏡像,也就是將服務打包
- docker-compose 可以啟動項目,進行多個微服務的編排和在環(huán)境里面一鍵部署
- Docker 網絡,自定義網絡
參考資料:
歡迎點贊,關注,收藏
朋友們,你的支持和鼓勵,是我堅持分享,提高質量的動力
好了,本次就到這里
技術是開放的,我們的心態(tài),更應是開放的。擁抱變化,向陽而生,努力向前行。
我是小魔童哪吒,歡迎點贊關注收藏,下次見~