使用Docker Compose必要性及定义

用容器运行一个服务,需要使用docker run命令。但如果我要运行多个服务呢
假设我要运行一个web服务,还要运行一个db服务,那么是用一个容器运行,还是用多个容器运行呢?
一个容器运行多个服务会造成镜像的复杂度提高,docker倾向于一个容器运行一个应用
那么复杂的架构就会需要很多的容器,并且需要它们之间有关联(容器之间的依赖和连接)就更复杂了。
这个复杂的问题需要解决,这就涉及到了容器编排的问题了。

  • Compose
    • 编排
      • 是对多个容器进行启动和管理的方法
      • 例如:LNMT,先启动MySQL,再启动Tomcat,最后启动Nginx
  • 服务架构的演进
    • 单体服务架构
    • 分布式服务架构
    • 微服务架构
    • 超微服务架构
  • 容器编排工具

    • docker machine
      • 在虚拟机中部署docker容器引擎的工具
    • docker compose
      • 是一个用于定义和运行多容器Docker的应用程序工具
    • docker swarm
      • 是Docker Host主机批量管理及资源调度管理工具
    • mesos+marathon
      • mesos 对计算机计算资源进行管理和调度
      • marathon 服务发现及负载均衡的功能
    • kubernetes
      • google开源的容器编排工具

        Docker Compose

        概念

  • 工程(project)

  • 服务 (Service)
  • 容器 (Container)

    步骤

    1.定义应用的Dockerfile文件,为了anywhere进行构建。
    2.使用docker-compose.yaml定义一套服务,这套服务可以一起在一个隔离环境中运行。
    3.使用docker-compose up就可以启动整套服务。
    1. wget https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-linux-x86_64
    2. mv docker-compose-linux-x86_64 /usr/bin/docker-compose
    3. chmod +x /usr/bin/docker-compose
    4. docker-compose version
    docker 创建应用
    1 创建网站文件 ```shell mkdir flaskproject cd flaskproject vim 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)

创建requirements.txt

vim requirements.txt flask redis

创建Dockerfile文件

vim Dockerfile FROM python:3.7-alpine WORKDIR /code ENV FLASK_APP app.py ENV FLASK_RUN_HOST 0.0.0.0 RUN apk add —no-cache gcc musl-dev linux-headers COPY requirements.txt requirements.txt RUN pip install -r requirements.txt COPY . . CMD [“flask”, “run”]

创建docker-compose.yaml

vim docker-compose.yaml version: ‘3’ services: web: build: . ports:

  1. - "5000:5000"

redis: image: “redis:alpine”

启动docker-componse

docker-compose up ```