最近學(xué)習(xí)《第一本docker書》萎攒, 學(xué)習(xí)完 Docker Compose 這一章節(jié)之后打算自己使用它來(lái)構(gòu)建一個(gè)使用 php 和 python 做的簡(jiǎn)易web app葡秒, 遂作此記錄矩父。本篇學(xué)習(xí)筆記只是為了學(xué)習(xí)docker-compose的用法妆档, 并不具體介紹flask和php的語(yǔ)法憎瘸。
一、Docker Compose
? 使用 Docker Compose 可以用一個(gè)YAML文件定義一組要啟動(dòng)的容器谨垃, 以及容器運(yùn)行時(shí)的屬性, Docker Compose稱這些容器為 “服務(wù)”硼控。
二刘陶、實(shí)現(xiàn)過(guò)程
? 新建文件夾flask-php 作為項(xiàng)目根目錄, cd 到flask-php文件夾牢撼, 新建文件夾product匙隔, 進(jìn)入product 并創(chuàng)建一個(gè)名為api.py的文件,其功能是提供給我們必要的數(shù)據(jù):
from flask import Flask
from flask_restful import Resource, Api
?
app = Flask(__name__)
api = Api(app)
?
class Product(Resource):
def get(self):
return {
'products': ['Apple', 'Candy', 'Pineapple']
}
?
api.add_resource(Product, '/')
?
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80, debug=True)
新建requirements.txt文件熏版, 用于在構(gòu)建鏡像時(shí)安裝必要的python依賴包
Flask==0.12
flask-restful==0.3.5
新建Dockerfile文件纷责, 幫助我們之后進(jìn)行鏡像的構(gòu)建
FROM python:3.5
COPY . /usr/src/app
WORKDIR /usr/src/app
RUN pip install -r requirements.txt
CMD ["python", "api.py"]
cd到項(xiàng)目的根目錄, 新建一個(gè)名為web的文件夾撼短,進(jìn)入web文件夾并新建index.php文件
<html>
<head>
<title>Docker Compose Test</title>
</head>
?
<body>
<h1>Welcome Here</h1>
<ul>
<?php
$json = file_get_contents('http://product/');
$data = json_decode($json);
$products = $data->products;
foreach ($products as $product) {
echo "<li>$product</li>";
}
?>
</ul>
</body>
</html>
接著再膳,我們需要為我們的web app構(gòu)建鏡像, 我們可以配置Compose來(lái)構(gòu)建鏡像并創(chuàng)建需要的服務(wù)曲横。 在compose中喂柒, 我們定義一組要啟動(dòng)的服務(wù)(以dockers容器的形式表現(xiàn)),我們還定義了我們希望這些服務(wù)要啟動(dòng)的運(yùn)行時(shí)屬性禾嫉, 這些屬性和 docker run 命令需要的參數(shù)類似灾杰,將所有與服務(wù)有關(guān)的屬性定義在一個(gè) YAML 文件中。 回到項(xiàng)目根目錄夭织,新建一個(gè)docker-compose.yml文件吭露,內(nèi)容如下:
version: '3'
services:
product:
build: ./product
volumes:
- ./product:/usr/src/app
ports:
- 5001:80
?
web:
image: php:apache
volumes:
- ./web:/var/www/html
ports:
- 5000:80
depends_on:
- product
? 第一行的version: '3'
并不是指定你安裝的Docker Compose的版本, 實(shí)際上他和 Docker Compose的版本并無(wú)直接關(guān)系尊惰, 它指明的是你的compose file是使用版本3的格式來(lái)進(jìn)行編寫的讲竿。
? 第二行開(kāi)始就是我們docker-compose文件的主要內(nèi)容, 它啟動(dòng)了兩個(gè)服務(wù): product和web弄屡。
? 對(duì)于product服務(wù)题禀,我們先使用bulid構(gòu)建一個(gè)鏡像, 服務(wù)除了可以基于指定的鏡像膀捷,還可以基于一份 Dockerfile迈嘹,它可以指定 Dockerfile 所在文件夾的路徑, 在本例中為docker-compose.yml所在目錄下的product文件夾。之后秀仲,我們使用volumes 掛載一個(gè)目錄融痛, 最后,我們使用ports進(jìn)行端口映射神僵, 本例是將容器的80端口映射到宿主機(jī)的5001端口之上雁刷。
? 對(duì)于web服務(wù), 它與product服務(wù)類似保礼, 不同之處在于它直接使用了image指定了要使用的鏡像沛励, 注意最后的depends_on,一般項(xiàng)目容器啟動(dòng)的順序是有要求的炮障,如果直接從上到下啟動(dòng)容器目派,必然會(huì)因?yàn)槿萜饕蕾噯?wèn)題而啟動(dòng)失敗,所以在yml文件中我們通過(guò)depend_on標(biāo)簽來(lái)先啟動(dòng)product服務(wù)胁赢, 解決容器的依賴企蹭。
? 以上步驟完成后, 整個(gè)項(xiàng)目的結(jié)構(gòu)應(yīng)該是:
E:.
│ docker-compose.yml
│
├─product
│ api.py
│ Dockerfile
│ requirements.txt
│
└─web
index.php
三徘键、運(yùn)行Compose
? 回到項(xiàng)目根目錄练对, 通過(guò)docker-compose up
命令來(lái)執(zhí)行這些服務(wù)遍蟋。
? 在瀏覽器中輸入 localhost:5000 來(lái)訪問(wèn)我們的web app吹害, 顯示如下:
同樣,我們也可以通過(guò)localhost:5001 來(lái)訪問(wèn)我們的api:
四虚青、總結(jié)
使用compose能夠非常簡(jiǎn)單的構(gòu)建一個(gè)需要Doker容器的應(yīng)用程序它呀, 本例子只展示了Compose最表層的能力,Compose的官網(wǎng)上有很多例子棒厘,比如使用Rails纵穿、Django、WordPress來(lái)展現(xiàn)更高級(jí)的概念奢人。