Docker 进阶,Docker 集群部署

Docker 集群

Docker Compose

简介

DockerFile build run 手动操作,单个容器!

如果是微服务,100个微服务!各种依赖关系

  • Docker Compose 可以轻松高效的管理容器,定义运行多个容器 == 批量容器编排

官方文档 Overview of docker-compose CLI | Docker Documentation

步骤:
1、DockerFile 保证我们的项目在任何地方可以运行
2、service 什么是服务;
   docker-compose.yml 文件怎么写?
3、启动项目   up / down

安装 Dcocker-Compoes

Compose 是 Docker 官方的开源项目,需要安装!

Dockerfile 让程序运行在任何地方,web 服务,redis,mysql,nginx…多个容器

docker-compose.yml

version: "3.9"  # optional since v1.27.0
services:
  web:                                  # 再启动 web
    build: .
    ports:
      - "8000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis                         # 先启动 redis
volumes:
  logvolume01: {}

docker-compose up 100 个微服务,一建上线

Compose 重要概念

  • 服务 service (web、redis、mysql …)

  • 项目 project = 一组关联的容器 = 对外的业务单元

安装

DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
# 官方镜像
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose

体验

应用 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 文件
flask
redis
Dockerfile 应用打包镜像
# syntax=docker/dockerfile:1
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
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
**Docker compose yaml **
  • 定义整个服务,需要的环境 web redis) , 完整的上线服务
version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:5000"
  redis:
    image: "redis:alpine"
启动 compose 文件
docker compose up .              # 启动
docker compose down              # 停止
# 流程
1、创建网络
2、执行 docker-compose.yml
3、启动服务
⠿ Network composetest_default    Created                                                                       
⠿ Container composetest-redis-1  Created                                                                       
⠿ Container composetest-web-1    Created

yaml 文件规则

  • docker-compose.yaml 是核心
# 语法 - 3 层

version: ''   			# 版本
services:     		    # 服务
	服务1: web
		# 服务配置
		images:
		build:
		network:
		...
     服务2: redis
     	...
     服务3: mysql
     	...
     服务4: ...
 # 其他配置    网络、卷、全局规则
volumes:
networks:
configs: 

示例

Quickstart: Compose and WordPress | Docker Documentation

version: "3.9"   
services:
  db:                                            # db 服务
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql                   # 挂载到本地 db_data 目录下
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    
  wordpress:								  # WordPress 服务
    depends_on:								  # depends_on   解决服务依赖,启动次序
      - db
    image: wordpress:latest
    volumes:
      - wordpress_data:/var/www/html			# 挂载到本地的 WordPress_data 目录下
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
volumes:                                          # 全局配置
  db_data: {}
  wordpress_data: {}

Docker Swarm

集群的方式部署,环境需要 4 台 2v4g 的云服务器

Swarm mode overview | Docker Documentation

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CeoNfhcI-1651712847192)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220428215748278.png)]

搭建集群

  • 四台服务器搭建好 docker 环境后启动 docker !
docker swarm --help
# 查看 swarm 命令
docker swarm init --advertise-addr 172.16.0.4
# 初始化一个节点,连接到节点内网地址-eth0
docker swarm join --token SWMTKN-1-6a8k9vzo6vlnlq6wrzeolrcznkiwfxz151g4bjo2t8g8dla27u-by93wkc6oka6nxbic09rxz6yx 172.16.0.4:2377
# 得到命令 == 其他节点 join 加入进来
docker swarm join-token manager
docker swarm join-token worker
# 主节点,获取管理员的令牌,生成后其他节点加入
docker node ls
# 其他节点加入后,可以查看
docker swarm leave
# 离开集群

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zXr7rpIf-1651712847193)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220428221303675.png)]

Raft 协议

  • 双主双从:假设一个节点挂了,其他节点是否可用?

Raft 协议:保证大多数节点存活才可以用,至少 > 一台,集群模式至少 > 三台,高可用

集群弹性扩缩容

告别 docker run

docker-compose up 启动一个项目,单机版!

集群: swarm docker service 容器==》服务==》副本

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DttHvuAr-1651712847193)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220428223126272.png)]

灰度发布:金丝雀发布

service 启动,具有扩缩容,滚动更新

docker service --help
# 查看创建命令
docker service create -p 8888:80 --name mynginx nginx
# 启动一个服务
docker service ps mynginx
# 查看启动的服务
docker service ls
# 查看 service
docker service rm mynginx
# 删除 service

动态扩缩容

docker service update --relipcas 3 mynginx
# 创建 三个 nginx 副本
# --relipcas number   可以实现动态扩缩容  number 可以根据实际情况填写
docker service create --replicas 2 --network host -p 8081:8081 --name nginx nginx
# 创建 2 副本的nginx
docker service create --mode
# --mode 默认使用副本运行

Docker Stack

  • Docker Stack 部署,集群部署
docker compose up -d wordpress.yaml
# 单机
docker stack deploy  wordpress.yaml
# 集群

Docker Secret

  • 安全,配置密码,证书
docker secret create 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RsoHm8ph-1651712847194)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220428231054415.png)]

Dcoekr Config

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mylfTato-1651712847194)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220428231218415.png)]

你可能感兴趣的:(docker,容器,运维,云原生,微服务)