一个web会有很多的服务,如何按照之前Dokcer的我们需要创建很多个container,这样会很麻烦,那么如何让多个服务在docker中简单的实现呢?
安装dokcer-compose
关于安装方法可以直接参考官网的安装说明
应用实例
我们将将在这个例子中使用python来搭建后端的服务,使用php来展示前端的页面。python后端使用flask
python: api.py
# product service
from flask import Flask
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class Product(Resource):
def get(self):
return {
'products': ['Ice cream',
'Chocolate',
'Fruit']
}
api.add_resource(Product, '/')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80, debug=True)
python : requirements.txt
Flask==0.12
flask-restful==0.3.5
Dockerfile
FROM python:3-onbuild
COPY . /usr/src/app
CMD ["python", "api.py"]
这样我们就可以实现一个container的运行了,但是如果我们有很多的应用,相互之前是需要同时运行的,这样我们每次编译的时候都需要编译多个container,这样非常麻烦,这个时候我们就可以使用Docker compose来完成这一工作。
我们将上面的内容放在product文件夹中,然后在文件夹外面创建一个docker-compose.yml文件
docker-compose.yml(注意格式!不能使用tab,需要为空格)
version: '3'
services:
product-service:
build: ./product
volumes:
- ./product:/usr/src/app
ports:
- 5001:80
docker-compose up
然后我们就可以访问得到的结果:
localhost:5001
然后我们创建一个新的文件夹叫做website
index.php
<html>
<head>
<title>My shop</title>
</head>
<body>
<h1>Welcome to my shop</hi>
<ul>
<?php
$json = file_get_contents('http://product-service');
$obj = json_decode($json);
$products = $obj->products;
foreach ($products as $product)
{
echo "<li>$product</li>";
}
?>
</ul>
</body>
</html>
然后修改docker-compose.yml文件如下:
version: '3'
services:
product-service:
build: ./product
volumes:
- ./product:/usr/src/app
ports:
- 5001:80
website:
image: php:apache
volumes:
- ./website:/var/www/html
ports:
- 5000:80
depends_on:
- product-service