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/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-计数器应用

  1. 应用 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)
    
  2. requirements.txt

    [root@yang composetest]# vim requirements.txt
    
    flask
    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.yml
    
    version: "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.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: {}

  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: 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

配置

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值