docker进阶篇目录

  • 1. 简介
  • 2. 安装Compose
  • 3. compose初体验
  • 第 1 步:设置
  • 第 2 步:创建一个 Dockerfile
  • 第 3 步:在 Compose 文件中定义服务
  • 第 4 步: Build and run your app with Compose
  • 查看服务
  • 查看镜像
  • 服务命名规则
  • docker network ls 查看网络
  • docker-compose down 停掉服务
  • docker-compose 小结
  • Docker 小结
  • 4. compose yaml 编写规则
  • 5. 开源博客项目 wordpress快速运行
  • 6. docker-compose启动微服务项目实战
  • 6.1 创建springboot项目
  • 6.2 编写dockerfile
  • 6.3 编写docker-compose.yml
  • 6.4 项目打包
  • 6.5 上传所需文件至服务器
  • 6.6 docker-compose一键启动
  • 6.7 总结
  • 7. Docker Swarm
  • 7.1 购买服务器
  • 7.2 4台机器安装docker
  • 7.3 工作模式
  • 7.4 搭建集群
  • 8. Raft协议
  • 8.1 双主双从宕机测试
  • 8.2 节点离开集群
  • 8.3 三主测试
  • 9. 体会弹性、扩缩容


1. 简介

docker单机 docker单机弹性扩容_docker单机


docker单机 docker单机弹性扩容_容器_02

docker单机 docker单机弹性扩容_运维_03


docker单机 docker单机弹性扩容_docker_04

2. 安装Compose

官网地址:Install Compose on Linux systems

docker单机 docker单机弹性扩容_运维_05


docker单机 docker单机弹性扩容_运维_06

docker单机 docker单机弹性扩容_容器_07

3. compose初体验

docker单机 docker单机弹性扩容_docker_08

第 1 步:设置

  1. 为项目创建一个目录:
mkdir composetest
 cd composetest
  1. 项目目录中创建一个名为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)
  1. 项目目录中创建另一个文件requirements.txt
flask
redis

第 2 步:创建一个 Dockerfile

创建一个名为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单机 docker单机弹性扩容_容器_09

第 3 步:在 Compose 文件中定义服务

docker-compose.yml

version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

这个 Compose 文件定义了两个服务:web和redis.

docker单机 docker单机弹性扩容_docker_10

第 4 步: Build and run your app with Compose

docker单机 docker单机弹性扩容_redis_11

查看服务

docker单机 docker单机弹性扩容_docker_12

查看镜像

docker单机 docker单机弹性扩容_redis_13

服务命名规则

因为当前不是集群,所以尚没有服务的概念:

docker单机 docker单机弹性扩容_redis_14


docker单机 docker单机弹性扩容_docker单机_15

docker network ls 查看网络

docker单机 docker单机弹性扩容_容器_16


docker单机 docker单机弹性扩容_docker_17

可以发现它是通过域名找到Redis服务的,更说明了他们是在同一个网络的

docker单机 docker单机弹性扩容_运维_18


实际项目中,当前Redis服务ip为172.27.0.2,如果该服务挂了,然后我们重新又拉起了一个redis服务,ip变成了172.27.0.8,如果写死ip根据ip找redis服务,那么由于ip发生变化将会导致redis服务不可用了
而现在我们可以看到Name是服务名称 redis_1, 即使我们重新启了一个服务,它还是能够连接到的,这就是好处! 保证了高可用!

docker-compose down 停掉服务

docker单机 docker单机弹性扩容_docker_19

docker-compose 小结

docker单机 docker单机弹性扩容_docker_20

Docker 小结

docker单机 docker单机弹性扩容_docker单机_21

4. compose yaml 编写规则

官网地址: Compose file

docker单机 docker单机弹性扩容_容器_22


docker单机 docker单机弹性扩容_容器_23


docker单机 docker单机弹性扩容_redis_24


docker单机 docker单机弹性扩容_运维_25

掌握方法:

docker单机 docker单机弹性扩容_docker单机_26


官网地址:Compose Specification

5. 开源博客项目 wordpress快速运行

参考官网: Compose and WordPress

docker单机 docker单机弹性扩容_docker_27


docker-compose.yml

docker单机 docker单机弹性扩容_docker单机_28

docker-compose up -d         #后台启动

docker单机 docker单机弹性扩容_redis_29

6. docker-compose启动微服务项目实战

  • 编写微服务项目计数器
  • dockerfile构建镜像
  • docker-compose.yaml编排项目
  • 丢到服务器,docker-compose up

6.1 创建springboot项目

docker单机 docker单机弹性扩容_redis_30


docker单机 docker单机弹性扩容_docker单机_31

6.2 编写dockerfile

通过dockerfile构建镜像

docker单机 docker单机弹性扩容_docker单机_32

6.3 编写docker-compose.yml

docker单机 docker单机弹性扩容_容器_33

6.4 项目打包

docker单机 docker单机弹性扩容_docker_34

6.5 上传所需文件至服务器

docker单机 docker单机弹性扩容_运维_35

6.6 docker-compose一键启动

重新构建:

docker-compose up --build

docker单机 docker单机弹性扩容_运维_36

docker单机 docker单机弹性扩容_容器_37


docker单机 docker单机弹性扩容_docker_38


最后:

docker-compose --help

6.7 总结

docker单机 docker单机弹性扩容_docker_39

7. Docker Swarm

官网地址: How nodes work

7.1 购买服务器

docker单机 docker单机弹性扩容_docker_40


docker单机 docker单机弹性扩容_redis_41


docker单机 docker单机弹性扩容_docker单机_42


docker单机 docker单机弹性扩容_docker单机_43


docker单机 docker单机弹性扩容_redis_44


docker单机 docker单机弹性扩容_docker单机_45


docker单机 docker单机弹性扩容_docker单机_46


docker单机 docker单机弹性扩容_redis_47


docker单机 docker单机弹性扩容_docker_48


docker单机 docker单机弹性扩容_容器_49


docker单机 docker单机弹性扩容_运维_50


docker单机 docker单机弹性扩容_docker单机_51

7.2 4台机器安装docker

docker单机 docker单机弹性扩容_redis_52

7.3 工作模式

docker单机 docker单机弹性扩容_运维_53

  • 管理节点负责管理工作节点
  • 管理节点之间可以互通,互相查看是否存活(2个节点无意义,一般至少3个)

docker单机 docker单机弹性扩容_docker_54

7.4 搭建集群

docker单机 docker单机弹性扩容_容器_55

docker单机 docker单机弹性扩容_容器_56

docker单机 docker单机弹性扩容_容器_57

docker单机 docker单机弹性扩容_docker_58

  • 下面把docker-4作为主节点加入集群:


    再次查看节点:

    小结:

docker单机 docker单机弹性扩容_运维_59

8. Raft协议

  • 双主双从:其中一个主节点挂了,另一个页不能用了
  • Raft协议:保证大多数节点存活才可以用,只要>1台, 集群至少3台

8.1 双主双从宕机测试

将第一个主节点停掉:

docker单机 docker单机弹性扩容_docker_60


下图中可以发现,另一个主节点页挂了:

docker单机 docker单机弹性扩容_容器_61


重新启动docker, 查看节点下图中可以发现,新的Leader产生了,原来的老大是3Z,现在变成了2Z

docker单机 docker单机弹性扩容_redis_62

8.2 节点离开集群

docker单机 docker单机弹性扩容_docker_63


docker单机 docker单机弹性扩容_docker_64

8.3 三主测试

先生成一个令牌:

docker单机 docker单机弹性扩容_docker_65


下面将docker3也加到管理节点:

docker单机 docker单机弹性扩容_docker_66

停止docker1:

docker单机 docker单机弹性扩容_redis_67


docker单机 docker单机弹性扩容_运维_68


然后分别在主节点docker3和主节点docker4里面执行 docker node ls 发现是可以正常执行这条命令的,说明他们都还正常存活下面再停掉一个主节点: docker3, 然后在docker4上查看节点信息:

docker单机 docker单机弹性扩容_容器_69


可以发现docker4已经不能正常使用了,即使它是主节点Raft一致性算法协议:(集群)至少保证有3个主节点,有一个挂了没关系,剩余俩可以保证可用,但要是有2个挂了,第三个是不能用的

docker单机 docker单机弹性扩容_docker单机_70

9. 体会弹性、扩缩容

以后告别docker run , 容器只是玩具,脱离了编排,它就没有任何意义了!

先把集群恢复,启动起来:

docker单机 docker单机弹性扩容_redis_71