Docker进阶Compose——swarm集群

文章目录

    • Docker基础回顾
    • Docker Compose
      • Compose 安装
      • Compose初体验
      • Compose配置编写规则
      • 使用Compose一键部署WP博客
    • 实战 : 自己编写微服务上线
    • Docker Swarm集群搭建
      • 环境准备
      • Swarm集群搭建
    • Raft一致性协议了解
    • Swarm集群弹性创建服务
    • Swarm概念扩展学习
    • Docker其他命令学习方式
    • Docker完结及展望

本笔记出自b站狂神说

Docker基础回顾

# 1、卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 2、删除资源  /var/lib/docker docker的默认工作路径!
rm -rf /var/lib/docker

# 1、卸载旧版的
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
             
# 推荐用这个阿里云的
    yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 更新yum软件包索引
yum makecache fast

# 4、安装docker相关的  docker-ce社区版(推荐) ee 企业版
yum install docker-ce docker-ce-cli containerd.io

# 5、启动docker
systemctl start docker
 
# 6、查看是否成功
docker version

# 7、再确认
docker run hello-world

# 8、查看下载的hello-world 镜像
docker images



## 阿里云加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://kgit923r.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Docker Compose

容器单独没有什么意义,有意义—>容器编排!

简介

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

微服务。100个微服务!依赖关系。

Docker Compose来轻松高效的管理容器!。定义运行多个容器。

定义 运行多个容器
YAML file文件
single command。 命令有哪些?
# 三步骤
定义 dockerfile
定义 docker-compose.yml
启动 docker-compose up

自己理解

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

Dockerfile 让程序在任何地方运行 。 比如一个web服务。需要redis mysql nginx…多个容器。一个一个run很麻烦

Compose

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

docker-compose up 100个服务

Compose:重要的概念

  • 服务service 。 容器 应用 (web,redis,mysql) 单个
  • 项目project 。一组关联的容器 博客 (web+mysql) 多个

Compose 安装

  • linux上

1.下载

curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

2.查看

cd /usr/local/bin
ll

3.授权

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

4.查看版本

docker-compose version

5.出现版本信息即为成功安装

Docker进阶Compose——swarm集群_第1张图片

Compose初体验

 mkdir composetest
 cd composetest

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)

vim requirements.txt

flask
redis

vim 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"]
------------------------------------- 上面有点小问题用下面的 狂神的
FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python","app.py"]

vim docker-compose.yml

version: "3"
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
  redis:
    image: "redis:alpine"
docker-compose build
docker-compose up 

成功现象

Docker进阶Compose——swarm集群_第2张图片

默认的服务名 文件名_服务名__num

多个服务器 集群

如果在同一个网络下就可以通过域名访问

停止

docker-compose down
ctrl+c

Compose配置编写规则

docker-compose.yaml

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

Docker进阶Compose——swarm集群_第3张图片

使用Compose一键部署WP博客

mkdir my_wordpress
cd my_wordpress

vim docker-compose.yml

version: '3.3'
 
services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress
 
   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
       WORDPRESS_DB_NAME: wordpress
volumes:
    db_data: {}

docker-compose up -d 后台启动

访问 ip:8000

实战 : 自己编写微服务上线

1、编写项目微服务

2、dockerfile构建镜像

3、docker-compose.yaml编排项目

4、丢到服务器docker-compose up

idea创建springboot项目 勾选web 和 redis

controller

@RestController
public class HelloController {
    @Autowired
    StringRedisTemplate redisTemplate;

    @GetMapping("/hello")
    public String hello(){
        Long views = redisTemplate.opsForValue().increment("views");
        return "hello,tian, thank you,views:"+views;
    }
}

application.properties

server.port=8080
spring.redis.host=redis

编写 Dockerfile文件

FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]

编写docker-compose.yml

version: '3'
services:
  tianapp:
    build: .
    image: tianapp
    depends_on:
      - redis
    ports:
    - "8080:8080"
  redis:
    image: "redis:alpine"

打jar包 上传至服务器

jar包 Dockerfile文件 docker-compose.yml 全部上传至一个目录

启动 docker-compose up

假設项目(有报错)要重新部署打包

docker-compose up --build # 重新构建!

测试访问

curl localhost:8080/hello

现象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J5XErpKK-1665363163758)(docker进阶.assets/Docker进阶Compose——swarm集群_第4张图片
)]

小结 :

未来项目只要有docker-compose文件。按照这个规则,启动编排容器。

公司: docker-compose。直接启动。

网上开源项目:docker-compose一键搞定

Docker Swarm集群搭建

环境准备

4台服务器 一主三从 (虚拟机 或者阿里云按量付费)

连接

Docker进阶Compose——swarm集群_第5张图片

这样子只要给一台输命令,后面几台都会自动同步输入运行

老步骤,先安装docker

Swarm集群搭建

Docker进阶Compose——swarm集群_第6张图片

# 初始化节点(第一台)
docker swarm  init --advertise-addr  172.24.82.149  # ip addr 

Docker进阶Compose——swarm集群_第7张图片

# 加入一个节点
docker swarm join-token manager  #获取令牌
docker swarm join-token work

第二台

Docker进阶Compose——swarm集群_第8张图片

第一台

docker node ls

Docker进阶Compose——swarm集群_第9张图片

第一台(让第三台加入 可以把刚刚加入的节点的代码复制给第三台)

以下是另一种方法

docker swarm join-token work

在这里插入图片描述

第三台 运行以上图片生成的命令 即可加入

还有第四台,想当成主节点

docker swarm join-token manager  #获取令牌

在这里插入图片描述

第四台 运行以上图片生成的命令 即可变成manager

# 第一台   
docker node ls

Docker进阶Compose——swarm集群_第10张图片

Raft一致性协议了解

双主双从:假设一个节点挂了!其他节点是否可以用!

Raft协议:保证大多数节点存活才可以用。只要>1,集群至少3台!

实验:

1、将docker1机器停止。宕机!双主,另外一个(第四台)也不能使用了

重启之后,docker1不是最主要的leader了,docker4变成主节点

# 第三台
docker swarm leave #离开
# 将第三台也设置为主节点

# 此时第一台停止,这个时候 docker3 docker4都可以用命令

Swarm集群弹性创建服务

以后告别 docker run

docker-compose up!启动一个项目

集群

## docker run  容器启动 不具有扩缩容功能
## docker service 服务  具有扩缩容功能 滚动更新


#创建docker service服务
 # 跟run 命令挺像的 -p指定端口 名字 镜像名
docker service create -p 8000:80  --name my-nginx nginx

#查看服务状态
docker service ps my-nginx

# 我们可以在swarm上别的机也去查看service服务,通过命令docker ps 查看

docker service ls #查看启动的副本

# 我们可以通过创建副本来扩容
 docker service update --replicas 3 my-nginx

Docker进阶Compose——swarm集群_第11张图片

起了3个副本,4台机随机分布,创建服务,我们可以在这4个里面找都有哪些机启动了docker 服务 即使有一台没有看到nginx 但依然能够用他的ip:8000访问nginx

这就是集群!

动态扩缩容
这个4台机我们可以搞3个副本,那能不能4台机搞10个呢?答案是可以的,大不了每台机多跑几个副本。

Docker进阶Compose——swarm集群_第12张图片

服务可以有多个副本

docker service update --replicas 1 my-nginx  #缩容
#scala  扩缩容
docker service scala my-nginx=5
docker service scala my-nginx=1

# 删除服务
docker service rm my-nginx

只要会搭建集群、会启动服务、动态管理容器就可以了

Swarm概念扩展学习

swarm

集群的管理和编号。docker可以初始化一个swarm集群,其他节点可以加入。(管理、工作者)

Node

就是一个docker节点。多个节点就组成了—个网络集群。(管理、工作者)

service

任务,可以在管理节点或者工作节点来运行。核心。!用户访问!

Task

容器内的命令,细节任务!

Docker其他命令学习方式

  • docker stack
docker compose :单机部署项目
docker stack:集群部署项目
docker-compose up -d wordpress.yaml(单机部署)
docker-compose deploy wordpress.yaml(集群部署)

其他呃 csdn自行了解

  • Docker Secret

就是安全有关!配置密码,证书!

  • Docker Config

配置

学习方式:网上自己看 官网~

Docker完结及展望

扩展到k8s

云原生时代

大趋势!

要掌握k8s !

要会Go语言 ! 必须掌握!

Docker是Go开发

K8s也是Go开发

你可能感兴趣的:(Docker,docker,容器,运维)