Dockerfile可以定义一个单独的应用容器,但是如果要定义多个容器时就要用到服务编排。服务编排有很多种技术方案,官方提供的是Compose
Dockerfile 可以让用户管理一个单独的应用容器,而Compose则允许用户在一个模板(YAML格式)中定义一组相关联的应用容器(被称为一个project,即项目),例如一个web服务器再加上后端的数据库服务器等。
docker Compose介绍
Docker-Compose 是Docker的一种编排服务,是一个用于在Docker上定义并运行复杂应用的工具,可以让用户在集群中不熟分布式应用
通过Docker-Compose 用户可以很容易的用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有以来,完成构建。Docker-Compose解决了容器与容器之间如何编排的问题。
Docker Compose 工作原理
Compose中有两个重要的概念:
- 服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
- 项目(project) :由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义。
一个项目可以有多个服务(容器)关联而成,compose面向项目进行管理,通过子命令对项目中的一组容器进行便捷的生命周期管理。
Compose项目由python编写,实际上调用了Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持DockerAPI,就可以在其上利用Compose来进行编排管理。
Docker Compose安装
Docker Compose是Docker的独立产品,因此需要安装Docker之后单独安装Docker Compose
官方安装方法
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
官方实例
创建项目路径
mkdir composetest
cd composetest
在目录下创建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)
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
在这个例子中,redis使用了容器内的网络默认端口是6379。这段Python程序的内容就是。启动后连接redis并且输出hello()方法,当每次访问的时候累计访问次数并且将结果放回到页面。
在同目录下闯将 requirements.txt
文件
cat requirements.txt
flask
redis
创建dockerfile
写一个dockerfile来定义Docker镜像,此镜像包含了Python的依赖包和Python环境。
cat Dockerfile
FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
- 使用基础镜像Python3.4
- 将当前目录映射到镜像的/code目录下
- 设置工作目录为/code
- 安装Pyhton依赖包
- 启动 app.py程序
创建docker-compose.yml文件
cat docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
启动
docker-compose up
启动成功后在浏览器访问:http://ip:5000 会返回
Hello World! I have been seen 1 times.
再次刷新,看变化
Docker Compose 常用命令
docker-compose up -d
在后台启动服务
docker-compose stop
停止服务
docker-compose -f
指定使用的compose模板文件,默认为docker-compose.yml,可以多次指定。
docker-compose -f docker-compose.yml up -d
#启动所有容器,-d 将会在后台启动并运行所有的容器
docker-compose up -d
#查看服务容器的输出
docker-compose logs
#列出项目中目前的所有容器
docker-compose ps
#构建(重新构建)项目中的服务容器。服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db。可以随时在项目目录下运行 docker-compose build 来重新构建服务
docker-compose build
#拉取服务依赖的镜像
docker-compose pull
#重启项目中的服务
docker-compose restart
#删除所有(停止状态的)服务容器。推荐先执行 docker-compose stop 命令来停止容器。
docker-compose rm
#在指定服务上执行一个命令。
docker-compose run ubuntu ping docker.com
#设置指定服务运行的容器个数。通过 service=num 的参数来设置数量
docker-compose scale web=3 db=2
#启动已经存在的服务容器。
docker-compose start
#停止已经处于运行状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器。
docker-compose stop