Docker Compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
大家应该也知道我们设计的一个系统肯定是涉及多个方面的,比如说你的系统中有nginx,有redis,有数据库服务等等,那这时我们要进行部署的话,是不得一个一个去run,如果服务少的话还好说,多了的话运维的忙死,所有就诞生了compose,他能很好的帮助我们实现一键多启。高效的运行多个容器。

安装

首先我们进入官网查看。

docker compose 多个command docker compose 多个镜像_redis


docker compose 多个command docker compose 多个镜像_flask_02

curl -SL https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose 但是上面这个下载速度有的慢,所以这里推荐使用下面这个
curl -SL https://get.daocloud.io/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

docker compose 多个command docker compose 多个镜像_redis_03

下面完成后

docker compose 多个command docker compose 多个镜像_flask_04

sudo chmod +x /usr/local/bin/docker-compose

然后再用docker-compose --version检查是否安装完成

docker compose 多个command docker compose 多个镜像_flask_05


然后跟着官网来,大家一定要记住,官网永远都是最全最详细的,只不过大家看见英文就觉得烦所以不肯看,但是其实大家都是从官网中学习出来的,所以我这里就和大家一起从官网出发,其实不难,compose就是一个yml文件,对所需要的服务进行编排执行罢了。

docker compose 多个command docker compose 多个镜像_docker_06


进入composetest之后创建一个名为app.py的文件

docker compose 多个command docker compose 多个镜像_容器_07


这是里面的内容。

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)

docker compose 多个command docker compose 多个镜像_运维_08


创建好了之后我们再创建一个requirements.txt的文件,熟悉python的同学应该就很清楚这个是干嘛的了。就是一个需要安装的库的声明。然后再加入以下的内容,列出需要安装的库。

flask
redis

docker compose 多个command docker compose 多个镜像_flask_09


这些准备工作做好之后是不就可以开始构建镜像了。接下来就开始操作吧,直接根据官方文档的进行操作,我来进行说明。

构建镜像Dockerfile
# 下载最基础的镜像
FROM python:3.7-alpine
# 设置工作路径为/code,后续方便卷挂载
WORKDIR /code
# 环境配置
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
# 将本地的该txt文件复制到docker引擎中并名为requirements.txt
COPY requirements.txt requirements.txt
# 下载里面所需的库或文件
RUN pip install -r requirements.txt
# 暴露端口为5000
EXPOSE 5000
# 将当前目录复制到镜像的workdir .目录下
COPY . .
# 运行flask
CMD ["flask", "run"]

docker compose 多个command docker compose 多个镜像_docker_10

创建docker-compose

接下来就可以创建docker-compose.yml

docker compose 多个command docker compose 多个镜像_容器_11

version: "3.9"
services:
  web:
  	# 构建,记住后面那个点不能少
    build: .
    # 设置本机端口8000映射至5000
    ports:
      - "8000:5000"
  redis:
  	# 找redis的镜像
    image: "redis:alpine"
启动

启动compose
docker-compose up

docker compose 多个command docker compose 多个镜像_flask_12


ok启动成功我们去页面看看

docker compose 多个command docker compose 多个镜像_flask_13


成功了。

接下来我们修改一下compose文件加一个卷挂载,让我们可以更好的修改文件。设置环境,它告诉flask run在开发模式下运行并在更改时重新加载代码。

docker compose 多个command docker compose 多个镜像_redis_14

version: "3.9"
services:
  web:
  	# 构建,记住后面那个点不能少
    build: .
    # 设置本机端口8000映射至5000
    ports:
      - "8000:5000"
    # 挂载这样我们就能在不重启镜像的情况下修改文件
    volumes:
      - .:/code
    # 设置环境,它告诉flask run在开发模式下运行并在更改时重新加载代码。这种模式应该只在开发中使用。
    environment:
      FLASK_ENV: development
  redis:
  	# 找redis的镜像
    image: "redis:alpine"

.:/code中间不能空开

我们试着去修改一个app.py文件看看能不能动态修改。去到目录底下

vim app.py

docker compose 多个command docker compose 多个镜像_容器_15


docker compose 多个command docker compose 多个镜像_docker_16

页面查看。成功了

docker compose 多个command docker compose 多个镜像_redis_17

最后

我们还可以使用docker-compose up -d来后台启动

docker compose 多个command docker compose 多个镜像_redis_18


docker-compose ps

docker compose 多个command docker compose 多个镜像_redis_19


查看 web服务可以使用哪些环境变量

docker-compose run web env

docker compose 多个command docker compose 多个镜像_运维_20


停止服务

docker-compose stop

docker compose 多个command docker compose 多个镜像_flask_21


完全删除容器down,删除数据卷

docker-compose down --volumes

docker compose 多个command docker compose 多个镜像_容器_22