简介
前面我们构建 Docker镜像的时候,定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。
然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停。这样的效率之低,维护量之大可想而知。
为了方便管理,这样就有了Docker Compose。使用 Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具。
官方介绍:https://docs.docker.com/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 works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases.
Using Compose is basically a three-step process:
Define your app’s environment with a Dockerfile so it can be reproduced anywhere.
Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.
Rundocker 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.
安装
官方文档:https://docs.docker.com/compose/install/
下载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
# 国内推荐使用这个下载
sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
赋予可执行权限
sudo chmod +x /usr/local/bin/docker-compose
检测是否安装成功
docker-compose version
出现版本号信息,说明已经安装成功。
初步体验
官方文档:https://docs.docker.com/compose/gettingstarted/
利用官方文档中的例子进行初步体验Docker Compose。
创建一个composetest文件夹
mkdir composetest
cd composetest
创建一个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)
创建一个requirements.txt文件
vim requirements.txt
输入以下内容。此文件为python的依赖包列表
flask
redis
创建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 ["flask", "run"]
创建一个docker-compose.yml文件
vim docker-compose.yml
输入以下内容
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
创建完后,composetest文件夹下会有如下四个文件
构建并运行
docker-compose up
到这里就已经启动成功
试一下访问,也是可以的。说明项目已经成功启动了。
小结
构建并运行一个Docker Compose需要以下四步:
- 准备好项目应用,如:app.py
- 构建docker镜像的Dockerfile文件
- 定义Docker Compose必要的docker-compose.yml文件,包括整个服务需要环境等
- 启动 Docker Compose项目,指令
docker-compose up