学自狂神。
视频地址:https://www.bilibili.com/video/BV1kv411q7Qc?share_source=copy_web

目标:

  • 掌握: docker基础,原理、网络、服务、集群、错误排查、日志。

  • linux docker k8s

一、Docker Compose

1.1、简介

DockerFile build run 单个容器

Docker Compose 来轻松高效的管理容器->批量运行编排多个容器

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

官方介绍

Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. To learn more about all the features of Compose, see the list of features.

总结:

  • 定义、运行多个容器

  • yaml file 配置文件

  • single command 命令有哪些?

Compose works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases. 即所有环境都可使用Compose

三步骤:

Using Compose is basically a three-step process:

  • Define your app’s environment with a Dockerfile so it can be reproduced anywhere.

    • Dockerfile 保证我们的项目可以在任何地方运行
  • Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.

    • services: 容器、应用
    • docker-compose.yml
  • 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是Docker官发开源的项目,需要安装

Dockerfile让程序可以在任何地方运行。

A docker-compose.yml looks like this:

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

compose重要的概念:

  • 服务services。可以理解为容器,应用,如web,redis,mysql…
  • 项目project。一组关联的容器

1.2、安装

(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# 速度快一点
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

(2)授权

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

(3)安装成功

[root@yang bin]# docker-compose version
docker-compose version 1.25.5, build 8a1c60f6
docker-py version: 4.1.0
CPython version: 3.7.5
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

1.3、体验

官网体验:https://docs.docker.com/compose/gettingstarted/ python-计数器应用

  1. 应用 app.py

    [root@yang home]# mkdir composetest
    [root@yang home]# cd composetest
    [root@yang composetest]# ls
    [root@yang composetest]# vim app.pyimport time
    import redis
    from flask import Flaskapp = Flask(__name__)
    cache = redis.Redis(host='redis', port=6379)def get_hit_count():retries = 5while True:try:return cache.incr('hits')except redis.exceptions.ConnectionError as exc:if retries == 0:raise excretries -= 1time.sleep(0.5)@app.route('/')
    def hello():count = get_hit_count()return 'Hello World! I have been seen {} times.\n'.format(count)
    
  2. requirements.txt

    [root@yang composetest]# vim requirements.txtflask
    redis
    
  3. Dockerfile 应用打包为镜像

    [root@yang composetest]# 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"]
    
  4. Docker-compose.yaml (定义整个服务、需要的环境:web、redis)

    [root@yang composetest]# vim docker-compose.ymlversion: "3"
    services:web:build: .ports:- "5000:5000"redis:image: "redis:alpine"[root@yang composetest]# ll
    
  5. 启动 compose 项目(docker-compose up)

1.4、docker-compose up的执行流程

(1)创建网络

(2)执行Docker-compose yaml

(3)启动服务

​ Creating composetest_web_1 … done

​ Creating composetest_redis_1 … done

1.5、自动的默认规则

1.5.1、文件名 composetest

1.5.2、docker images

[root@kuangshen~]# docker service ls
Error response from daemon: This node is not a swarm manager. Use "docker swa[m init" or "docker swarmjoin" to connect this node to swarm and try again.

1.5.3、服务

默认的服务名 文件名_num

多个服务器,集群 A B_num 副本数量

服务redis服务=>4个副本

集群状态,服务都不可能只有一个运行实例。弹性、10 HA 高并发

1.5.4、网络规则

10个服务=>项目(项目中的内容都在同一个网络下,域名访问)

如果在同一个网络下,我们可以通过域名进行访问

1.6、停止命令

[root@yang composetest]# docker-compose down
Stopping composetest_redis_1 ... done
Stopping composetest_web_1   ... done
Removing composetest_redis_1 ... done
Removing composetest_web_1   ... done
Removing network composetest_default

以前都是单个docker run启动容器

docker-compose通过docker-compose编写yaml配置文件、可以通过compose一键启动所有服务,停止

1.7、Docker小结

(1)Docker镜像,run=>容器

(2)DockerFile构建镜像(服务打包)

(3)docker-compose启动项目(编排、多个微服务/环境)

(4)Docker网络

1.8、docker-compose.yaml 规则

官网介绍:https://docs.docker.com/compose/compose-file/compose-file-v3/

# 总共三层version: '' # 版本
services:  #服务服务1: web# 服务配置images:port:network: depends_on: # 启动依赖(顺序)...服务2: redis...
# 其他配置 网络、卷、全局规则
volumes:
network: 

学习,要掌握规律!

只要多写,多看。compose.yaml配置。

途径:

  • 官网文档
    https://docs.docker.com/compose/compose-file/#specifying-durations
  • 开源项目compose.yaml
    redis、mysql、mq!

1.9、实战:部署博客

官网介绍:https://docs.docker.com/samples/wordpress/

  1. 下载项目
  2. 如果需要自己的镜像,可以自定义 Dockerfile
  3. 编写docker-compose.yaml
version: '3.3'services:db:image: mysql:5.7volumes:- db_data:/var/lib/mysqlrestart: alwaysenvironment:- MYSQL_ROOT_PASSWORD=somewordpress- MYSQL_DATABASE=wordpress- MYSQL_USER=wordpress- MYSQL_PASSWORD=wordpresswordpress:depends_on:- dbimage: wordpress:latestports:- '8000:80'restart: alwaysenvironment:WORDPRESS_DB_HOST: db:3306WORDPRESS_DB_USER: wordpressWORDPRESS_DB_PASSWORD: wordpressWORDPRESS_DB_NAME: wordpress
volumes:db_data: {}
  1. docker-compose up -d 后台启动

1.10、微服务

(1)编写微服务

(2)dockerfile 构建镜像

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

(3)docker-compose 编排项目

version: '3.8'
services:yangapp:build: .image: yangappdepends_on:- redisports:- "8080:8080"redis:image: "redis:alpine"

(4)docker-compose up

启动成功后,在本地使用curl localhost:8080/hello或者去浏览器访问:虚拟机ip:8080/hello即可。

二、Docker Swarm

集群方式的部署

准备:四台1核2g服务器并安装docker

swarm官发文档:https://docs.docker.com/engine/swarm/

工作模式

node

Docker Engine 1.12 introduces swarm mode that enables you to create a cluster of one or more Docker Engines called a swarm. A swarm consists of one or more nodes: physical or virtual machines running Docker Engine 1.12 or later in swarm mode.

There are two types of nodes: managers and workers.

  • manager可 调度服务、维护集群状态、serving swarm mode HTTP API endpoints
  • worker 执行容器

Service

serices、tasks、containers

swarm 接收服务并且调度任务给 worker 节点

  • manager:

    • 接收命令并创建service
    • 循环创建并调度 service
    • 分配 ip 地址给task
    • 分配 task 给节点
    • 命令 worker 运行 task
  • worker node:

    • 连接并确认被分配的 task
    • 执行 tasks

服务与全局服务

调整service以什么方式运行:

[root@yang ~]# docker service create --help
--mode string   service mode (replicated or globa1) (default "replicated")[root@yang ~]# docker service create --mode replicated --name mytom tomcat:7 默认的[root@yang ~]# docker service create --mode replicated 默认的   --mode global
场景:
日志收集:每一个节点有自己的日志收集器,过滤,再把所有日志最终传给日志中心。
服务监控

2.1、搭建集群



私网、公网

两个命令:

  • 初始化节点:docker swarm init
  • 加入一个节点:docker swarm jion
# 获取令牌
docker swarm join-token manager
docker swarm join-token worker

将第二个服务器docker-2以worker形式加入到第一个服务器上:

从docker-1上查看节点:发现多了一个节点

注:只有主节点可以使用docker node ls

从docker-1生成一个主节点的令牌:

在docker-4上执行docker-1上加入主节点的命令:

在docker-1查看节点:所有的节点都搭建进去了,双主双从

2.2、Raft协议

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

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

实验:

1、将docker1机器停止。宕机!双主,另外一个主节点docker-4也不能使用了!

2、将docker-3节点离开

docker swarm down
# docker-4查看节点

发现docker-3状态变成了down,并且4节点变成了主节点Leader,而1节点变成了主节点Reachable

3、docker-1中再次生成一个主节点令牌,让docker-3以主节点形式加入:

# docker-1
docker swarm join-token manager
# docker-3
[root@iZ2vcg4bxglqi65j2wdgm1Z ~]# docker swarm join --token SWNTKN-1-4a1qo02iwnaoqbt9vuagbucuslkk3p451u3apf7ed7ybm50a3x-6ekudx8sjj0fnkhp9zk5xjch3 172.24.82.149:2377

会有两个docker-3节点,一个是已经down掉的。

work就是工作的,而管理节点操作! 3台机器设置为了管理节点。

测试:此时将docker-1节点停掉,会发现docker-3、docker-4仍能正常使用。这表明管理节点至少要有3个,一个挂掉两外两个还能用,若只有两个管理节点,一个挂掉另一个也就不能再使用了,因此必须要保持2个或者以上管理节点存活才能使用。

Raft协议:保证大多数节点存活,才可以使用,高可用!

2.3、体会

弹性、扩缩容! 集群!

以后告别docker run!

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

集群: swarm docker serivce
容器=>服务!
容器=>服务!=>副本!
redis服务=>10个副本!(同时开启10个redis容器)

体验:创建服务、动态扩展服务、动态更新服务

灰度发布、金丝雀发布

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

查看服务:此时只有一个副本(replicas)

启动三个my-nginx的replicas:

docker service update --replicas 3 my-nginx
# 同时开启10个照样也可以,只不过是会分布在4个节点上
docker service update --replicas 10 my-nginx# 恢复到1个replicas上:
docker service update --replicas 1 my-nginx

访问:此时只要是集群中的节点,用哪个节点的ip都能访问到nginx

动态扩缩容:

# 效果等同于docker service update --replicas 5 my-nginx
docker service scale my-nginx=5

移除服务:

docker service rm my-nginx

2.4、概念总结

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

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

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

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

2.5、网络

网络模式:PublishMode:ingress

Overlay:加一层,由中间这层去统一调度到任意机器

ingress:特殊的 Overlay 网络,具有负载均衡功能 IPVS VIP

# 启动5个nginx:
[root@tencent-h1 ~]# docker service scale my-nginx=5
[root@tencent-h1 ~]# docker service inspect my-nginx
里面有:"PublishMode":"ingress"
[root@tencent-h1 ~]# docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
2fea5acac9d3   bridge            bridge    local
6802ef6d4b01   docker_gwbridge   bridge    local
9ca88c1eec4e   host              host      local
31x3e4t51obc   ingress           overlay   swarm
5c8625209093   none              null      local[root@tencent-h1 ~]# docker network inspect 31x3e4t51obc
# 感觉功能有点类似交换机,由它去统一调度

虽然docker在4台机器上,实际网络是同一个! ingress网络,是一个特殊的Overlay网络

三、其他

3.1、Docker stack

一个stack 是一组相互关联的 service,这组 service共享依赖,可被安排在一起运行和扩展

# docker-compose 单机部署
docker-compose up -d wordpress.yaml# docker stack 集群部署
docker stack deploy wordpress.yaml# 查看所有stack
docker stack ls

3.2、Docker Secret

安全、配置密码、证书

3.3、Docker Config

配置

Docker学习进阶篇相关推荐

  1. Emit学习-进阶篇-定义事件

    Emit学习-进阶篇-定义事件 之前在研究如何用Emit为动态类添加事件,本来以为会非常简单,但是却碰到了许多的问题,有些问题在之前的答疑篇中已经提到了,并予以了解决,虽然有些地方自己也不是很明白,但 ...

  2. [Unity 学习] - 进阶篇 - Mesh基础系列1:生成网格

    [Unity 学习] - 进阶篇 - Mesh基础系列1:生成网格 本文并非原创,只是本人的学习记录,原文是由放牛的星星老师翻译Catlike系列教程 链接: https://mp.weixin.qq ...

  3. 【狂神说】Docker【进阶篇】

    [狂神说Java]Docker进阶篇超详细版教程通俗易懂_哔哩哔哩_bilibili 官网:https://www.docker.com/ 文档地址: https://docs.docker.com/ ...

  4. Docker 学习应用篇之一: 初识Docker

    Docker 自从2013年以来就非常的火热,无论是从github上的代码活跃度,还是Redhat在RHE6.5中集成对Docker的支持,等等.第一次接触Docker,还是老师给我们介绍的. 1.初 ...

  5. 深度学习进阶篇-预训练模型[3]:XLNet、BERT、GPT,ELMO的区别优缺点,模型框架、一些Trick、Transformer Encoder等原理详细讲解

    [深度学习入门到进阶]必看系列,含激活函数.优化策略.损失函数.模型调优.归一化算法.卷积模型.序列模型.预训练模型.对抗神经网络等 专栏详细介绍:[深度学习入门到进阶]必看系列,含激活函数.优化策略 ...

  6. docker学习进阶之Swarm(三)

    1. docker swarm简介 Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整 体,并且通过一个入口统一管理这些Docker主机上的各种Doc ...

  7. docker学习-基础篇6-docker容器数据卷-使用dockerfile

    使用dockerfile进行数据绑定 根目录下 #根目录下(ls /的目录下)创建一个mydocker文件夹 mkdir mydocker#进入mydocker文件夹 cd mydocker#编辑并创 ...

  8. spring cloud学习进阶篇:Spring Cloud Sleuth + Zipkin 实现分布式跟踪解决方案

    2019独角兽企业重金招聘Python工程师标准>>> 简述 使用 spring cloud 用到最多的是各种rest服务调用,Twitter的Zipkin 是一种实现分布式跟踪解决 ...

  9. Emit学习-进阶篇-异常处理

    异常的处理也是程序中比较重要的一个部分,今天我们就针对用IL书写异常处理代码进行讲解,首先照例给出要实现的类的C#代码,如下: ExceptionHandler class ExceptionHand ...

最新文章

  1. 魔尺变机器人_百变魔尺——创意生活
  2. 牛客练习赛81 E. 小 Q 与函数求和 1( “简单莫比乌斯反演” ,欧拉函数性质)
  3. 扩增子统计绘图1箱线图:Alpha多样性
  4. IIS6+asp.net 2.0+HTTP 错误 404 - 文件或目录未找到:您正在搜索的页面可能已经删除、更名或暂时不可用。...
  5. python 游戏 —— 汉诺塔(Hanoita)
  6. 使用Maven Jetty插件
  7. 输入文字自动生成图片_原来Word还可以自动生成图片和图表目录!
  8. 哈佛大学单细胞课程|笔记汇总(1-9)
  9. Java 信号 Semaphore 简介
  10. 【clickhouse】clickhouse 表引擎之 set
  11. Maven学习总结(47)——Maven常用命令再总结
  12. WCF服务离线操作与消息队列MSMQ(转)
  13. 运行Map Reduce报错Got exception: java.net.ConnectException: Call From master.localdomain/127.0.0.1 to
  14. Androidx跟Android的区别
  15. 2022-03-05 使用 putty 远程连接阿里云服务器
  16. jenkins自动化打包android,Android使用Jenkins实现自动化打包
  17. kafka集群Error creating broker listeners
  18. 苹果商店数据分析报告
  19. 白苹果了怎么办_iOS 13如何降级?iOS13降级失败怎么办?
  20. 20计算机数电实验四--编译器的门级建模

热门文章

  1. ①简单介绍与电路简化
  2. 论文阅读:ExchNet
  3. 数据挖掘二:数据整合
  4. 七大设计原则之合成复用原则
  5. 鸿蒙os 麒麟970,从4499跌至979元,昔日华为顶级旗舰降成二手价:麒麟970+鸿蒙OS!...
  6. 07.从密码学看进制转化
  7. 彼得·蒂尔旗下大数据公司Palantir再融资2000万美元
  8. SNS社区网站的价格和价值
  9. 探索职场真我---“DISC测评”
  10. windows 显示苹果分区_EFI分区的挂载