Docker进阶笔记

Docker Compose

简介

用来高效地管理容器,定义运行多个容器

三个步骤

  1. Define your app’s environment with a Dockerfile so it can be reproduced anywhere.
  • 保证项目在任何地方都可以运行
  1. Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.
  • 定义服务service
  • 编写yml
  1. Run docker compose up and the Docker compose command starts and runs your entire app. You can alternatively run docker-compose up using the docker-compose binary.
  • 启动项目

作用:批量容器编排
注: Compose是官方的开源项目,需要安装

示例

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

一些重要的概念

  • 服务service。即容器、应用(web、redis、mysql)
  • 项目project。一组关联的容器(博客:web、mysql)

Compose安装

  1. 下载
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 推荐下面的国内镜像
curl -L https://get.daocloud.io/docker/compose/releases/download/1.28.6/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
  1. 授权
sudo chmod +x /usr/local/bin/docker-compose
  1. 测试是否安装成功
[root@VM-12-16-centos bin]# docker-compose version
docker-compose version 1.28.6, build 5db8d86f
docker-py version: 4.4.4
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

体验:getting start

地址:https://docs.docker.com/compose/gettingstarted/
Python应用:计数器,用来记录该web应用被访问的次数

  1. 准备工作
yum install python-pip #pip是Python包管理工具
yum -y install epel-release #报错的话执行
  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)

在本例中,redis是应用程序网络上redis容器的主机名,我们使用redis的默认端口6379

  1. 创建一个名为requirements.txt的文件
flask
redis
  1. 创建Dockerfile 应用打包为镜像
FROM python:3.7-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirement.txt
CMD ["python", "app.py"]

# 从3.7镜像开始构建镜像
# 将当前目录添加.到/code镜像中的路径中
# 将工作目录设置为/code
# 安装Python依赖项
# 将容器的默认命令设置为Python app.py
# 也可以用官方文档上的,因为狂神没启起来,所以这里换了
  1. 创建Docker-compose.yaml文件(定义整个服务,需要的环境:web、redis)完整的上线流程
version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"
  1. 启动compose项目(docker-compose up)
Starting composetest_redis_1 ... done
Starting composetest_web_1   ... done

在这里插入图片描述

流程

  1. 创建网络
  2. 执行Docker-compose.yaml
  3. 启动服务

默认的服务名:文件名_服务名_num,因为是集群,有多个服务器,故num为副本数量

网络规则

在这里插入图片描述

10个服务的项目,内容都在同一个网络下面,域名访问
在这里插入图片描述

如果在同一个网络下,我们可以直接通过域名访问,高可用(HA)
停止:ctrl+c
以前都是单个docker run启动容器
docker-compose,通过docker-compose编写yaml配置文件,可以通过compose一键启动所有服务,停止

Docker小结

  1. Docker镜像=>容器
  2. Dockerfile构建镜像(服务打包)
  3. docker-compose启动服务(编排、多个微服务环境)
  4. Docker网络

yaml规则

docker-compose.yaml核心
官方文档

# 3层

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

在这里插入图片描述

开源项目:博客

WordPress官方文档

  1. 下载项目(docker-compose.yaml)
  2. 如果需要文件,Dockerfile
  3. 文件准备齐全(一键启动项目)

前台启动: docker -d
后台启动: docker-compose up -d

Docker Swarm

官方文档

工作模式

在这里插入图片描述

帮助文档:

Commands:
  ca          Display and rotate the root CA
  init        Initialize a swarm
  join        Join a swarm as a node and/or manager
  join-token  Manage join tokens
  leave       Leave the swarm
  unlock      Unlock swarm
  unlock-key  Manage the unlock key
  update      Update the swarm

初始化节点:docker swarm init
在这里插入图片描述

docker swarm join加入一个节点

# 获取令牌
docker swarm join-token manager
docker swarm join-token worker

将节点加入
在这里插入图片描述
在这里插入图片描述

  1. 生成主节点
  2. 加入manager、worker

Raft协议

双主双从:假设一个节点挂了,其他节点呢
Raft协议:保证大多数节点存活才可以用,集群至少大于3台

实验

  1. 将docker1停止,宕机,双主另一个节点也不能使用了
    在这里插入图片描述

leader节点宕机再次启动可以发现该节点变为manager节点,原来的manager节点有一个会荣升为leader
2. 可以将其他worker节点离开
在这里插入图片描述

  1. worker就是工作的,管理节点才能操作

结论:至少要有3个主节点,大于1台的管理者可用

swarm集群弹性创建服务

创建服务、动态扩展服务、动态更新服务

Commands:
  create      Create a new service
  inspect     Display detailed information on one or more services
  logs        Fetch the logs of a service or task
  ls          List services
  ps          List the tasks of one or more services
  rm          Remove one or more services
  rollback    Revert changes to a service's configuration
  scale       Scale one or multiple replicated services
  update      Update a service

灰度发布、金丝雀发布
在这里插入图片描述

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

查看服务器:

在这里插入图片描述

动态扩缩容:(两种方式)

docker service update --replicas 3 my-nginx
docker service scale my-nginx=5

在这里插入图片描述
在这里插入图片描述

这些服务会被随机分到不同的服务器上
集群中没有运行容器的机器,也能访问部署的服务,服务可以有多个副本动态扩缩容实现高可用

移除服务:

docker service rm my-nginx

概念总结

  • swarm: 集群的管理和编排。docker可以初始化一个swarm集群,其他节点可以加入
  • node:就是一个docker节点,多个节点就组成了一个网络集群
  • service:任务,可以在管理节点或者工作节点来运行,核心,用户访问
  • task:容器内的命令,细节任务

在这里插入图片描述

**逻辑是不变的 **
命令->管理->api->调度->工作节点(创建Task容器维护创建)

服务副本与全局服务

在这里插入图片描述

调整service以什么方式运行
在这里插入图片描述

拓展:网络模式:
“PublishMode”: “ingress”
swarm:
Overlay:
ingress:特殊的overlay网络

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值