0%

Docker —— Docker 三剑客之 Compose 项目

如果有什么错误的地方,希望指出。

之前的文章中介绍了 Dockerfile,知道了 Dockerfile 模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务编排。服务编排有很多种技术方案,今天给大家介绍 Docker 官方产品 Docker Compose 。

Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用。Compose 定位是 「定义和运行多个 Docker 容器的应用(Defining and running multicontainer Docker applications)」,其前身是开源项目 Fig。

Docker-Compose 是用来管理你的容器的,有点像一个容器的管家,想象一下当你的 Docker 中有成百上千的容器需要启动,如果一个一个的启动那得多费时间。有了 Docker-Compose 只需要编写一个文件,在这个文件里面声明好要启动的容器,配置一些参数,执行一下这个文件,Docker就会按照你声明的配置去把所有的容器启动起来,但是Docker-Compose只能管理当前主机上的Docker,也就是说不能去启动其他主机上的Docker容器。恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件 (YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

Compose 中有两个重要的概念:

  • 服务 ( service ):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目 ( project ):由一组关联的应用容器组成的一个完整业务单元,在 dockercompose.yml 文件中定义。

使用

创建 Python 服务

1、创建项目文件夹:

1
2
$ mkdir composetest
$ cd composetest

2、在目录下创建 app.py 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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。

3、在同目录下创建requirements.txt文件,添加项目依赖的python包:

1
2
flask
redis

创建 Dockerfile

在项目文件下创建 Dockerfile

1
2
3
4
5
FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

这段代码表示:

  • 使用基础镜像 Python 3.4
  • 将当前目录映射到镜像/code目录下
  • 设置工作目录为 /code
  • 安装 Python 依赖包
  • 启动 app.py 程序

创建 docker-compose.yml

1
2
3
4
5
6
7
8
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"

这个 Compose 文件定义了两个服务, 一个 Pyhon Web 服务和 redis 服务。

  • Pyhon Web 服务:使用 Dockerfile 构建了当前镜像。将 Web 容器内部的5000端口映射到 host 的5000端口;并将 Web 容器与 redis 容器连接。
  • redis服务:该容器直接由官方的 redis 镜像创建。

启动 docker-compose.yml

在项目目录下,使用命令 docker-compose up 启动

测试

Docker Compose 其他命令

docker-compose.yml 同一目录下,使用命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#后台运行服务
$ docker-compose up -d

# 构建(重新构建)项目中的服务容器。服务容器一旦构建后,将会带上一个标记名
$ docker-compose build

#查看启动的服务
$ docker-compose ps

#拉取服务依赖的镜像
$ docker-compose pull

#停止服务
$ docker-compose stop

#启动已经存在的服务容器。
$ docker-compose start

#重启项目中的服务
$ docker-compose restart

#删除所有(停止状态的)服务容器。推荐先执行 docker-compose stop 命令来停止容器。
$ docker-compose rm

# -f 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
$ docker-compose -f docker-compose.yml up -d

命令选项

  • -f, –file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml ,可以 多次指定。
  • -p, –project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。
  • –x-networking 使用 Docker 的可拔插网络后端特性
  • –x-network-driver DRIVER 指定网络后端的驱动,默认为 bridge
  • –verbose 输出更多调试信息。
  • -v, –version 打印版本并退出。

Reference

客官,赏一杯coffee嘛~~~~