Bootstrap

【docker的那些事】docker-compose、scale扩容缩容

前言

Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用 Compose,您可以使用 YAML 文件来配置应用程序的服务。然后,使用单个命令,从配置创建并启动所有服务。虽然现在Compose的使用不是非常广泛,大多数选择还是更倾向于k8s。但是对于一些不是很大的项目来说Compose依然还是可以去选择的。

传统的使用的docker

在传统的docker使用上,如果我们需要去部署一个springboot的项目,他依赖于redis、mysql等一些环境,我们就需要docker pull去拉取这些镜像,并且逐个去运行,使用起来还是非常不方便的,但是docker compose就能很好的帮助我们去解决这一问题,我们先来体验一下compose再来聊它。

安装docker compose

查看是否安装,如果没有安装请进行安装

docker-compose version
#1.下载
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#2.添加权限信息
sudo chmod +x /usr/local/bin/docker-compose
首先看看传统方式使用

1、创建项目目录

mkdir composetest

cd composetest

2、创建app.py,并写入测试代码

touch 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)

3、新建requirements.txt文件,并写入

touch requirements.txt

vim requirements.txt
flask
redis

4、编写Dockerfile

touch 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"]

5、根据Dockerfile生成image

docker build -t python-app-image .

在这里插入图片描述

6、查看镜像
在这里插入图片描述
7、获取redis的镜像

docker pull redis:alpine

8.创建 container

  • 创建网络
docker network ls

docker network create --subnet=172.20.0.0/24 app-net 
  • 创建python程序的container,并指定网段和端口
docker run -d --name web -p 5000:5000 --network app-net python-app-image
  • 创建redis的container,并指定网段
docker run -d --name redis --network app-net redis:alpine

7.访问 ip:5000,发现可以
在这里插入图片描述

使用compose来进行

在上面我们队docker compose已经进行了安装

我们删除上面所创建的images和container,但是保留我们创建的一些文件(Dockerfile那些文件)

docker rm -f $(docker ps -a -aq)

docker rmi $(docker images)

进入app.py所在的目录

touch docker-compose.yaml

vim docker-compose.yaml
version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
    networks:
      - app-net

  redis:
    image: "redis:alpine"
    networks:
      - app-net

networks:
  app-net:
    driver: bridge

通过docker-compose.yaml启动

docker-compose up -d

在这里插入图片描述
构建过程可能需要等待一会,构建成功后会帮我们创建所需要的images和container我们继续按照上面的访问进行访问ip:5000
在这里插入图片描述
在这里插入图片描述

发现能够访问,相比较传统的方式,使用
docker-compose.yaml/yml而言,要方便的很多。

docker-compose.yml

上述docker-compose的注释,当然远远不止这些,有兴趣的可以去看看相关语法。

(1)version: ‘3’ #表示docker-compose的版本
(2)services #一个service表示一个container
(3)networks #相当于docker network create app-net
(4)volumes #相当于-v v1:/var/lib/mysql
(5)image #表示使用哪个镜像,本地build则用build,远端则用image
(6)ports #相当于-p 8080:8080
(7)environment #相当于-e

docker-compose常见操作:

  • 查看版本 docker-compose version
  • 根据yml创建service docker-compose up
    –指定yaml:docker-compose up -f xxx.yaml
    –后台运行: docker-compose up
  • 查看启动成功的service:docker-compose ps或者docker ps
  • 查看images:docker-compose images
  • 停止/启动service: docker-compose stop/start
  • 删除service[同时会删除掉network和volume]: docker-compose down
  • 进入到某个service: docker-compose exec redis sh

scale扩缩容

注意在使用扩容的同时,我们需要去掉docker-compose.yml/yaml文件service指定的端口号,因为是在单机中会造成端口占用问题。

停止之前的docker-compose.修改一下配置

version: '3'
services:
  web:
    build: .
    networks:
      - app-net

  redis:
    image: "redis:alpine"
    networks:
      - app-net

networks:
  app-net:
    driver: bridge

启动:

docker-compose up -d

在这里插入图片描述

扩容缩容

docker-compose up --scale web=5 -d

在这里插入图片描述

#查看容器
docker-compose ps

在这里插入图片描述

#查看日志
docker-compose logs web

在这里插入图片描述

;