目錄
- 簡介
- Compose簡單應(yīng)用
1. 簡介
Dockerfile 可以讓用戶管理一個單獨的應(yīng)用容器狂丝;而Compose則允許用戶在一個模板(YAML 格式)中定義一組相關(guān)聯(lián)的應(yīng)用容器(被稱為一個project,即項目)甸昏,例如一個 Web 服務(wù)容器再加上后端的數(shù)據(jù)庫服務(wù)容器等。
Compose是一個用于定義和運行多容器Docker應(yīng)用程序的工具垛膝。通過Compose豹爹,您可以使用Compose文件配置應(yīng)用程序的服務(wù)。然后浪蹂,使用單個命令,從配置中創(chuàng)建和啟動所有服務(wù)告材。
Compose非常適用于開發(fā)坤次,測試和組織(臨時)環(huán)境,以及CI工作流斥赋。
使用Docker Compose基本上包括以下三步流程:
- 通過Dockerfile定義您的應(yīng)用環(huán)境以便于它能夠在任何地方重用缰猴。
- 在docker-compose.yml中定義組成應(yīng)用程序的服務(wù),以便它們可以在隔離的環(huán)境中一起運行疤剑。
- 最后滑绒,運行
docker-compose up
,并將Compose啟動并運行整個應(yīng)用程序。
Docker Compose具有如下的特性:
- 單個主機中具有多個隔離環(huán)境
- 當容器創(chuàng)建時保存容器卷數(shù)據(jù)
- 僅重建已更改的容器
- 變量和在環(huán)境之間移動
2. Compose簡單應(yīng)用
Docker官方簡單示例介紹骚露。
- 創(chuàng)建項目目錄
# mkdir composetest
# cd composetest
- 創(chuàng)建 Python 的程序
app.py
蹬挤,功能就是利用 redis 的 incr 方法進行訪問計數(shù)。
from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
redis.incr('hits')
return 'Hello World! I have been seen %s times.' % redis.get('hits')
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
- 由于 Python 依賴的
flask
棘幸、redis
組件都需要另外安裝,比如使用 pip來安裝倦零,單獨設(shè)置一文件requirements.txt
误续,內(nèi)容如下:
flask
redis
- 創(chuàng)建 service 依賴的第一個 image,app.py 程序的運行環(huán)境扫茅,利用 Dockerfile 來制作蹋嵌,內(nèi)容如下:
FROM python:2.7 #基于 python:2.7 鏡像
ADD . /code #將本地目錄中的內(nèi)容添加到 container 的 /code 目錄下
WORKDIR /code #設(shè)置程序工作目錄為 /code
RUN pip install -r requirements.txt #運行安裝命令
CMD python app.py #啟動程序
-
Dockerfile
創(chuàng)建好就可以制作鏡像了,運行下面命令生成Docker鏡像:
# 生成Docker鏡像
docker build -t compose/python_app .
Docker鏡像生成成功后通過docker images
查看即能看到:
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
compose/python_app latest a92fed00abd 59 minutes ago 680.4 MB
- 配置Docker Compose配置文件
docker-compose.yml
, 定義版本和服務(wù)等信息葫隙。
version: '2'
services:
web:
image: compose/python_app
ports:
- "5000:5000"
volumes:
- .:/code
depends_on:
- redis
redis:
image: redis
說明:配置中創(chuàng)建了2個service栽烂,web和redis
,各自有依賴的鏡像恋脚,其中web服務(wù)開放container
的5000端口腺办,并與host
的5000端口應(yīng)對,方便通過 localhost:5000來訪問糟描, volumes 即將本地目錄中的文件加載到容器的 /code 中怀喉,depends_on表明services web
需要依賴另一個 service redis
。
- 生成并啟動服務(wù)
# docker-compose up
Attaching to composetestbypython_redis_1
redis_1 | 1:C 04 Nov 10:35:17.448 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1 | _._
redis_1 | _.-``__ ''-._
redis_1 | _.-`` `. `_. ''-._ Redis 3.2.5 (00000000/0) 64 bit
redis_1 | .-`` .-```. ```\/ _.,_ ''-._
redis_1 | ( ' , .-` | `, ) Running in standalone mode
redis_1 | |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
redis_1 | | `-._ `._ / _.-' | PID: 1
redis_1 | `-._ `-._ `-./ _.-' _.-'
redis_1 | |`-._`-._ `-.__.-' _.-'_.-'|
redis_1 | | `-._`-._ _.-'_.-' | http://redis.io
redis_1 | `-._ `-._`-.__.-'_.-' _.-'
redis_1 | |`-._`-._ `-.__.-' _.-'_.-'|
redis_1 | | `-._`-._ _.-'_.-' |
redis_1 | `-._ `-._`-.__.-'_.-' _.-'
redis_1 | `-._ `-.__.-' _.-'
redis_1 | `-._ _.-'
redis_1 | `-.__.-'
redis_1 |
redis_1 | 1:M 04 Nov 10:35:17.450 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1 | 1:M 04 Nov 10:35:17.450 # Server started, Redis version 3.2.5
redis_1 | 1:M 04 Nov 10:35:17.451 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis_1 | 1:M 04 Nov 10:35:17.451 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
redis_1 | 1:M 04 Nov 10:35:17.451 * The server is now ready to accept connections on port 6379
Compose啟動和部署成功后船响,通過命令查看容器運行情況躬拢。
# docker-compose ps
Name Command State Ports
---------------------------------------------------------------------------------------------
composetestbypython_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp
composetestbypython_web_1 /bin/sh -c python app.py Up 0.0.0.0:5000->5000/tcp
通過瀏覽器訪問http://localhost:5000
就能看到相關(guān)的發(fā)布信息躲履。