docker企业级运维

Docker Compose

简介

Docker

DockerFile build run 手动操作,单个容器!

微服务。100个微服务!依赖关系。

Docker Compose 来轻松高效的管理容器。定义运行多个容器!

官方介绍
定义、运行多个容器。
YAML file 配置文件
single command 命令有哪些

三步骤

  1. Dockerfile 保证我们的项目在任何地方可以运行。
  2. services
    docker-compose.yml 这个文件怎么写!
  3. docker-compose up 启动项目

作用:批量容器编排。

Compose 是Docker官方的开源项目。需要安装!

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

docker-compose.yaml

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

Compose:重要的概念

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

安装docker-compose

# -o 下载docker-compose 到本地
curl -L "https://get.daocloud.io/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 不知道为什么上面那个有时候会报错,就用下面这个
curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 授权,否则会报权限不够
chmod +x /usr/local/bin/docker-compose

# 出现版本则安装成功
docker-compose version

# 卸载docker-compose
# docker-compose卸载只需要删除二进制文件就可以了。
sudo rm /usr/local/bin/docker-compose

docker-compose命令

# 重启
docker-compose restart

# 日志
docker-compose logs -f 容器id/名称

体验

python应用。计数器。redis!

  1. 应用 app.py
  2. Dockerfile 应用打包为镜像(单机玩具!)
  3. docker-compose yaml文件(定义整个服务,需要的环境。web、redis)完整的上线服务!
  4. 启动 compose 项目(docker-compose up,停止是down,得再docker-compose.yml文件下输入命令)

就是四个文件

app.py
docker-compose.yml
Dockerfile
requirements.txt

内容在:
https://docs.docker.com/compose/gettingstarted/

流程:

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

Creating composetest_redis_1 ... done
Creating composetest_web_1   ... done 

文件名定义规则

  1. 文件名 composetest
  2. 服务
  3. 1 就是集群中的第一个节点
version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

网络规则

一个项目中有10个服务,所有服务都在同个网络下。

 "ConfigOnly": false,
        "Containers": {
            "ae9d28941ef9a6be84856341bae784d45bf5e1c9f2f1cbdbf89d406fc7a48215": {
                "Name": "composetest_redis_1",
                "EndpointID": "f113bba0f037b68f4a780684246dd531334bd24a23df3a851fd75d288fe8c697",
                "MacAddress": "02:42:ac:14:00:03",
                "IPv4Address": "172.20.0.3/16",
                "IPv6Address": ""
            },
            "cd9727b5c5643c9af07c6296643684b904755e48b499c9ffb335a76506066cb5": {
                "Name": "composetest_web_1",
                "EndpointID": "59835d4adafaa0b682a8987fcb60f44957244a14edd093668a635929724d4253",
                "MacAddress": "02:42:ac:14:00:02",
                "IPv4Address": "172.20.0.2/16",
                "IPv6Address": ""
            }

如果在同一个网络下,我们能可以直接通过域名(name)访问。

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

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

Docker小结:

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

yaml规则

# 三层!!!

version:''		# 版本,向下兼容
services:		# 服务
	服务1:web
		# 服务配置(就是说这里可以配置docker容器的配置)
		images
		build
		network
		# docker容器并不能自动读取宿主机的hosts,所以需要配置
		# 配置后需要停止容器,再启动才会读取到配置
		extra_hosts:
      		- "www.baidu.com:11.0.9.1"
		...
	服务2:redis
# 其他配置	网络/卷、全局规则
volumes:
network:
configs:

depends_on 启动顺序

在这里插入图片描述

配置域名解析

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

dns: 8.8.8.8

dns:
  - 8.8.8.8
  - 9.9.9.9

开源项目

实战

  1. 编写项目微服务
package com.example.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @Autowired
    StringRedisTemplate stringRedisTemplate;

    @GetMapping("/hello")
    public String hello(){
        Long views = stringRedisTemplate.opsForValue().increment("views");

        return "hello,kuangshen,thx,views" + views;
    }
}

  1. Dockerfile 构建镜像
FROM java:8

COPY *.jar /app.jar

CMD ["--server.port=8080"]

EXPOSE 8080

ENTRYPOINT ["java","-jar","/app.jar"]
  1. docker-compose.yml 编排项目
version: '3.8'
services:
  kuangapp:
    build: . # .代表当前目录下的Dockerfile
    image: kuangapp
    depends_on:
      - redis
    ports:
    - "8080:8080"
  redis:
    image: "library/redis:alpine"
  1. 丢到服务器,docker-compose up 启动

总结

工程、服务、容器

项目 compose:三层

  • 工程 Project
  • 服务 服务
  • 容器 运行实例! docker k8s

Docker Swarm 适合十台服务器以下,k8s适合十台以上,现在k8s用的多,所以下面的了解一下就可以,我自己也没觉得下面有多详细,

Docker Swarm

集群

购买服务器并安装docker

4台服务器 1核2G!

工作模式

在这里插入图片描述

  • 管理节点之间可以相互通信
  • 操作都在 manager(管理节点)
  • Raft 一致性算法

搭建集群

swarm命令

  1. 生成主节点 init
  2. 加入(管理者、worker)
  3. 目标:双主双从
[root@iZ2ze7eg85rq92ilowwya5Z ~]# docker swarm --help

Usage:  docker swarm COMMAND

Manage 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

私网、公网!

用私网的,不要钱,ip addr,eth0,172.22.80.249

# 初始化swarm节点
docker swarm init --advertise-addr 172.22.80.249

# 初始化节点后就会生成这个,在别的服务器上输入就可以加入该初始化节点
# docker swarm join --token SWMTKN-1-3o1dlg1iv4ritpj32lm0jhiy9lnwvjncdwzxcn82yur2y1p2ge-5fdhgkkqx6neglmevopfk9dtu 172.22.80.249:2377

# 加入一个节点
docker swarm join

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

# 主节点
[root@iZ2ze7eg85rq92ilowwya2Z ~]# docker node ls
ID                            HOSTNAME                  STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
9lttrciqnitzalg6zd62nnen3 *   iZ2ze7eg85rq92ilowwya2Z   Ready     Active         Reachable        20.10.5
c0201mzwwyhir4zn2spdrxlsc     iZ2ze7eg85rq92ilowwya3Z   Ready     Active                          20.10.5
hx2x19h34lz1bolne0vbn8sjc     iZ2ze7eg85rq92ilowwya4Z   Ready     Active                          20.10.5
vxdbials4mo4qgyhnkiysxzc4     iZ2ze7eg85rq92ilowwya5Z   Ready     Active         Leader           20.10.5

Raft协议

双主双从:假设一个节点挂了!其他节点是否可用!

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

实验:

  1. 将docker1机器停止。宕机!双主,另外一个主节点也不能使用了!
  2. 将其他非主节点离开集群
# 节点离开集群
docker swarm leave
  1. worker就是工作的,管理节点操作!3台机器设置为了管理节点
# 在管理节点输入命令
docker swarm join-token manager

十分简单:集群,可用!3个主节点。>1台管理节点存活!
Raft协议:保证大多数节点存货,才可以使用 ,高可用!

体会

弹性、扩缩容!集群!

以后告别 docker run!

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

集群:swarm docker service

容器 => 服务

容器 => 服务 => 副本

redis服务 => 10个副本!(同时开启10个redis容器)

docker service 命令

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

[root@iZ2ze7eg85rq92ilowwya5Z ~]# docker service --help

Usage:  docker service COMMAND

Manage services

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 ps 服务名
# 查看节点
docker service ls
# 动态扩缩容
# 添加三个nginx服务到集群,是一共3个不是添加3个
# 此时会把3个服务分配到不同的服务器,但有一个服务器不会有nginx服务
# 但依然可以对nginx进行访问
# 如果此时,想要动态回滚到两个节点,只需要把以下命令改为2
docker service update --replicas 3 mynginx
# 和上面命令是一样的
docker service scale mynginx=5
# 删除服务
docker service rm mynginx

服务,集群中任意的节点都可以访问。服务可以有多个副本动态扩缩容实现高可用!

docker swarm 其实并不难

只要会搭集群、会启动服务、动态管理容器就可以了!

概念总结

  • swarm

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

  • node
    就是一个docker节点。多个节点就组成了一个网络集群。

  • service
    任务,可以在管理节点或者工作节点来运行。核心。

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

转载自:
https://www.bilibili.com/video/BV1kv411q7Qc?p=8&spm_id_from=pageDriver

感谢狂神

他突然明白,那些清晨他没有问,其实是从牡丹眼神中读到,你别问我。

云边有个小卖部
张嘉佳

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值