Docker学习进阶篇
学自狂神。
视频地址: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-计数器应用
应用 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)
requirements.txt
[root@yang composetest]# vim requirements.txtflask redis
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"]
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
启动 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/
- 下载项目
- 如果需要自己的镜像,可以自定义 Dockerfile
- 编写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: {}
- 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学习进阶篇相关推荐
- Emit学习-进阶篇-定义事件
Emit学习-进阶篇-定义事件 之前在研究如何用Emit为动态类添加事件,本来以为会非常简单,但是却碰到了许多的问题,有些问题在之前的答疑篇中已经提到了,并予以了解决,虽然有些地方自己也不是很明白,但 ...
- [Unity 学习] - 进阶篇 - Mesh基础系列1:生成网格
[Unity 学习] - 进阶篇 - Mesh基础系列1:生成网格 本文并非原创,只是本人的学习记录,原文是由放牛的星星老师翻译Catlike系列教程 链接: https://mp.weixin.qq ...
- 【狂神说】Docker【进阶篇】
[狂神说Java]Docker进阶篇超详细版教程通俗易懂_哔哩哔哩_bilibili 官网:https://www.docker.com/ 文档地址: https://docs.docker.com/ ...
- Docker 学习应用篇之一: 初识Docker
Docker 自从2013年以来就非常的火热,无论是从github上的代码活跃度,还是Redhat在RHE6.5中集成对Docker的支持,等等.第一次接触Docker,还是老师给我们介绍的. 1.初 ...
- 深度学习进阶篇-预训练模型[3]:XLNet、BERT、GPT,ELMO的区别优缺点,模型框架、一些Trick、Transformer Encoder等原理详细讲解
[深度学习入门到进阶]必看系列,含激活函数.优化策略.损失函数.模型调优.归一化算法.卷积模型.序列模型.预训练模型.对抗神经网络等 专栏详细介绍:[深度学习入门到进阶]必看系列,含激活函数.优化策略 ...
- docker学习进阶之Swarm(三)
1. docker swarm简介 Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整 体,并且通过一个入口统一管理这些Docker主机上的各种Doc ...
- docker学习-基础篇6-docker容器数据卷-使用dockerfile
使用dockerfile进行数据绑定 根目录下 #根目录下(ls /的目录下)创建一个mydocker文件夹 mkdir mydocker#进入mydocker文件夹 cd mydocker#编辑并创 ...
- spring cloud学习进阶篇:Spring Cloud Sleuth + Zipkin 实现分布式跟踪解决方案
2019独角兽企业重金招聘Python工程师标准>>> 简述 使用 spring cloud 用到最多的是各种rest服务调用,Twitter的Zipkin 是一种实现分布式跟踪解决 ...
- Emit学习-进阶篇-异常处理
异常的处理也是程序中比较重要的一个部分,今天我们就针对用IL书写异常处理代码进行讲解,首先照例给出要实现的类的C#代码,如下: ExceptionHandler class ExceptionHand ...
最新文章
- 魔尺变机器人_百变魔尺——创意生活
- 牛客练习赛81 E. 小 Q 与函数求和 1( “简单莫比乌斯反演” ,欧拉函数性质)
- 扩增子统计绘图1箱线图:Alpha多样性
- IIS6+asp.net 2.0+HTTP 错误 404 - 文件或目录未找到:您正在搜索的页面可能已经删除、更名或暂时不可用。...
- python 游戏 —— 汉诺塔(Hanoita)
- 使用Maven Jetty插件
- 输入文字自动生成图片_原来Word还可以自动生成图片和图表目录!
- 哈佛大学单细胞课程|笔记汇总(1-9)
- Java 信号 Semaphore 简介
- 【clickhouse】clickhouse 表引擎之 set
- Maven学习总结(47)——Maven常用命令再总结
- WCF服务离线操作与消息队列MSMQ(转)
- 运行Map Reduce报错Got exception: java.net.ConnectException: Call From master.localdomain/127.0.0.1 to
- Androidx跟Android的区别
- 2022-03-05 使用 putty 远程连接阿里云服务器
- jenkins自动化打包android,Android使用Jenkins实现自动化打包
- kafka集群Error creating broker listeners
- 苹果商店数据分析报告
- 白苹果了怎么办_iOS 13如何降级?iOS13降级失败怎么办?
- 20计算机数电实验四--编译器的门级建模