学自狂神。
视频地址: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/log
links:
- redis
redis:
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.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)
-
requirements.txt
[root@yang composetest]# vim requirements.txt flask 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.yml version: "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.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 后台启动
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: yangapp
depends_on:
- redis
ports:
- "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
配置