docker之compose容器编排

目录

前言

1.1 问题

1.2 解决

1.3 学习计划

开始 

2.1 docker network 运行机制

2.1.1 介绍

2.1.2 存在啥问题

2.2 docker network 学习

2.2.1 解决问题

2.2.2 介绍

2.2.3 网络模式

2.2.3.1 docker0

2.2.3.2 bridge

2.2.3.3 host

2.2.3.4 none

2.2.3.5 container        

2.2.4 自定义网络

2.3  docker-compose容器编排

2.3.1 概念

2.3.2 配置环境

2.3.3 步骤

2.3.4 基本命令 

2.4 compose实战    

2.4.1 分析

2.4.2 开始

2.4.3 测试 

2.5 容器监控(轻量级)

2.5.1 简介         

2.5.1 下载

2.6 CAdvisor+InfluxDB+Granfana

2.6.1 CIG        

结束


前言

1.1 问题

        docker部署固然越来越简单,但是当系统拆分出N多个子系统、缓存、数据库、消息等各种中间件儿,docker部署起来也变得麻烦,有没有一种方式可以一键部署和管理?

1.2 解决

        compose容器编排应运而生,简单说就是将你所需要部署的docker,在这个文件描述清楚,然后执行如下命令:

docker-compose up -d

        docker 会按照我们定义的方式进行部署,达到一键管理 。

1.3 学习计划

        docker network:容器间需要网络通信,搞清楚docker 的通信机制

        docker compose:基本语法

        docker 监控:图形化工具

        测试工程Git地址:docker-maven 实战项目

开始 

2.1 docker network 运行机制

2.1.1 介绍

启动docker

# 启动docker
systemctl start docker

 docker启动后,网络情况

解释:docker 进程启动后,会分配一个docker0的默认桥接模式的网桥,

        所有docker容器都会在这个网桥上进行通信

加深理解:

1 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。

2 docker run 的时候,没有指定network的话默认使用的网桥模式就是bridge,使用的就是docker0。在宿主机ifconfig,就可以看到docker0和自己create的network(后面讲)eth0,eth1,eth2……代表网卡一,网卡二,网卡三……,lo代表127.0.0.1,即localhost,inet addr用来表示网卡的IP地址

3 网桥docker0创建一对对等虚拟设备接口一个叫veth,另一个叫eth0,成对匹配。

   3.1 整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,

        每个接口叫veth,在本地主机和容器内分别创建一个虚拟接口,

        并让他们彼此联通(这样一对接口叫veth pair);

   3.2 每个容器实例内部也有一块网卡,每个接口叫eth0;

   3.3 docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。

 通过上述,将宿主机上的所有容器都连接到这个内部网络上,两个容器在同一个网络下,会从这个网关下各自拿到自动分配的ip,此时两个容器的网络是互通的。

2.1.2 存在啥问题

自动分配:每个运行的docker容器内部ip是由docker0自动分配,ip不固定。

        假如我的一个web项目调用mysql容器,mysql容器ip不固定,我该如何连接myql数据库?

2.2 docker network 学习

2.2.1 解决问题

容器间的互联和通信以及端口映射

容器IP变动时候可以通过服务名直接网络通信而不受到影响

2.2.2 介绍

1.默认的网络模式

docker network ls

2.会出现如下三种模式,(我自己新增啦一个)

网络模式

简介

使用方式

bridge

为每一个容器分配、设置IP等,并将容器连接到一个docker0

虚拟网桥,默认为该模式

--network bridge

host

容器将不会虚拟出自己的网卡、配置自己的IP等,而是使用宿主机的IP和端口

--network host

none

容器有独立的 Network namespace,但并没有对齐进行任何网络设置,如分配 veth pari

和 网桥连接、IP等

--network none

container

新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等

--network container:NAME或者容器ID

 3.查看容器的网络模式

# 通过inspect获取容器信息,最后20行即为容器的网络模式信息
docker inspect 容器ID | tail -n 20

2.2.3 网络模式

2.2.3.1 docker0

        Docker 服务默认会创建一个docker0网桥

        默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥互相通信

# 查看bridge信息
docker network inspect bridge | grep name
2.2.3.2 bridge

        详情看上图解析

        bridge模式:使用--network bridge指定,默认使用docker0        

2.2.3.3 host

        直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行 NAT 转换。

        容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network         space。

        容器将不会虚拟出自己的网卡,而是直接使用宿主机的 IP 和端口。

        host模式:使用--network host指定

2.2.3.4 none

        禁用网络功能

        在none模式下,并不为docker容器进行任何网络配置。进入容器内,

        使用 ip addr查看网卡信        息,只能看到 lo(本地回环网络127.0.0.1网卡)。

        none模式:使用--network none指定

2.2.3.5 container        

        新建的容器和已经存在的一个容器共享网络IP配置,而不是和宿主机共享。

        新创建的容器不会创建自己的网卡、IP,而是和一个指定的容器共享IP、端口范围。

        两个容器除了网络共享,其他的如文件系统、进程列表依然是隔离的。

        container模式:使用--network container:NAME或者容器ID指定

# Alpine操作系统是一个面向安全的轻型 Linux发行版
docker run -it --name alpine /bin/sh
# 指定和 alpine1 容器共享网络
docker run -it --network container:alpine1 --name alpine2 alpine /bin/sh

此时使用 ip addr查看两台容器的网络,会发现两台容器的eth0网卡内的IP等信息完全相同。

如果关掉了alpine1容器,因为alpine2的网络使用的alpine1共享网络,所以关掉alpin1后,alpine2eth0网卡也随之消失了。

2.2.4 自定义网络

1.解决问题

        容器间的互联和通信以及端口映射。

        容器 IP 变动时候可以通过服务名直接网络通信而不受影响。        

        (类似Eureka,通过服务名直接互相通信,而不是写死IP地址)。

 2.自定义桥接网络(自定义网络默认使用的是桥接网络 bridge

        创建一个网络

# 创建一个网络
docker network create asia-net

        查看网络列表 

docker network ls

        创建容器时,指定加入我们自定义的网络中 

docker run -d -p 8081:8080 --network asia-net--name tomcat1 tomcat:8.5-jdk8-corretto

docker run -d -p 8082:8080 --network asia-net--name tomcat2 tomcat:8.5-jdk8-corretto

        测试结果

# 安装ifconfig命令
yum install -y net-tools
# 安装ip addr命令
yum install -y iproute
# 安装ping命令
yum install -y iputils
# 直接ping容器名,不需要ping IP地址
ping tomcat2

        问题结论

                自定义网络本身就维护好了主机名和ip的对应关系(ip和域名都能通)

 3. link连接(已标记过时)

# 启动一台mysql容器
# --name 为容器指定一个别名
docker run --name mysql-matomo -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.28
# 启动另一个容器,通过--link连接到mysql容器
# --link 容器名称:本容器连接对方时的别名
docker run -d -p 8888:80 --link mysql-matomo:db --name matomo matomo:4.9.0
# 此时,在matomo容器中,便可以通过 db 这个hostname连接到mysql-matomo容器,而无须再通过ip
# 连接地址:db:3306

2.3  docker-compose容器编排

2.3.1 概念

Docker-Compose是Docker官方的开源项目,  负责实现对Docker容器集群的快速编排。   

Docker-Compose可以管理多个Docker容器组成一个应用。 需要定义一个yaml格式的配置文件 docker-compose.yml,配置好多个容器之间的调用关系,然后只需要一个命令就能同时启动/关闭这些容器。

Docker建议我们每个容器中只运行一个服务,因为Docker容器本身占用资源极少,所以最好是将每个服务单独的分割开来。但是如果我们需要同时部署多个服务,每个服务单独构建镜像构建容器就会比较麻烦。所以 Docker 官方推出了 docker-compose 多服务部署的工具。

Compose允许用户通过一个单独的 docker-compose.yml 模板文件来定义一组相关联的应用容器为一个项目(project)。可以很容易的用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。

核心概念:

  • 服务(service:一个个应用容器实例(每一个docker容器)
  • 工程(project:由一组关联的应用容器实例组成的一个完整业务单元,在docker-compose.yml中定义(就是一个个关联的服务构成了一个工程

2.3.2 配置环境

        基本语法:官网基本语法介绍

        安装: 

# 例如从github下载 2.5.0版本的docker-compose
# 下载下来的文件放到 /usr/local/bin目录下,命名为 docker-compose
curl -L https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
# 添加权限
chmod +x /usr/local/bin/docker-compose
# 验证
docker-compose version

2.3.3 步骤

Compose使用的三个步骤:

        编写 Dockerfile 定义各个应用容器,并构建出对应的镜像文件

        编写 docker-compose.yml,定义一个完整的业务单元,

        安排好整体应用中的各个容器服务

        执行命令,其创建并运行整个应用程序,完成一键部署上线

 docker-compose up

2.3.4 基本命令 

# 查看帮助
docker-compose -h
# 启动
docker-compose up
# 后台运行
docker-compose up -d
# 停止并删除容器、网络、卷、镜像:(类似 docker stop +  docker rm)
docker-compose down
# 进入容器实例内部
docker-compose exec <yml里面的服务id> /bin/bash
# 展示当前docker-compose编排过的运行的所有容器:
docker-compose ps
# 展示当前docker-compose编排过的运行的所有容器:
docker-compose ps
# 展示当前docker-compose编排过的容器进程:
docker-compose top
# 查看容器输出日志
docker-compose log <yml里面的服务id>
# 检查配置
docker-compose config
# 有问题才输出
docker-compose config -q
# 重启工程
docker-compose restart
# 启动工程(类似 docker start)
docker-compose start
# 停止工程
docker-compose stop

2.4 compose实战    

               准备一个maven项目,maven工程配置了redis和mysql,

                用docker-compose方式,将maven工程、mysql、redis一键部署

2.4.1 分析

                1.maven项目制作镜像

                        docker之Dockerfile文章我们制作了一个含jdk环境的镜像:mycentosjava8

                        将maven工程打成jar包 :docker_maven.jar

                       mycentosjava8 +docker_mavenar  = new images(docker-boot)

                        (  docker之Dockerfile文章 讲述具体的实现过程)

                2.准备一个MySQL镜像(5.7)      

docker pull mysql:5.7

                3.准备一个redis镜像

docker pull redis

                4.镜像之间的通信问题   --network 可以用上了

docker network -create ms01-net

        注意:

                这里maven 工程我放入git,有兴趣可以自己拉下来体验体验打镜像

                Git 地址 docker-maven

                

这里要把Dockerfile和jar包放入同一个目录 然后执行docker build -t 命令,(脚本放入git)

# 基础镜像(之前创建好的镜像,内含有jdk环境)
FROM mycentosjava8:1.0
# 定义作者
MAINTAINER wangtc@15299095124@163.com
# 定义环境变量
ENV base_path /usr/local/java-maven
# 定义进入目录
WORKDIR $base_path
# 执行命令 将jar包考入工程 这里不解压
COPY . $base_path/
# 执行命令 进入工程目录
RUN  cd $base_path/
EXPOSE 8081
# 运行工程命令
ENTRYPOINT ["java","-jar","./docker_maven-0.0.1-SNAPSHOT.jar"]

 查看镜像 准备工作就绪

2.4.2 开始

                如果有docker基础 这个地方也能看懂,

                docker run 命令后面的参数用yml文件的形式输出而已

                vi cocker-compose.yml (脚本放入git)

# docker-compose文件版本号
version: "3"
# 配置各个容器服务
services:
  microService:
    image: docker-boot:1.0
    container_name: ms01  # 容器名称,如果不指定,会生成一个服务名加上前缀的容器名
    ports:
      - "6001:6001"
    volumes:
      - /app/microService:/data
    networks:
      - ms01_net
    depends_on:  # 配置该容器服务所依赖的容器服务
      - redis
      - mysql

  redis:
    image: redis
    ports:
      - "6379:6379"
    volumes:
      - /app/redis/redis.conf:/etc/redis/redis.conf
      - /app/redis/data:/data
    networks:
      - ms01_net
    command: redis-server /etc/redis/redis.conf

  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: 'root'
      MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
      MYSQL_DATABASE: 'db2025'
      MYSQL_USER: 'master'
      MYSQL_PASSWORD: 'root'
    ports:
      - "3306:3306"
    volumes:
      - /app/mysql/db:/var/lib/mysql
      - /app/mysql/conf/my.cnf:/etc/my.cnf
      - /app/mysql/init:/docker-entrypoint-initdb.d
    networks:
      - ms01_net
    command: --default-authentication-plugin=mysql_native_password # 解决外部无法访问

networks:
  # 创建 ms01_net 网桥网络
  ms01_net:

结果如下 先检查格式 没问题就执行compose

2.4.3 测试 

1.输入Swagger UI地址 一般是:http://localhost:你的微服务端口/swagger-ui.html#/

2.测试接口 数据库存在相应数据,则算部署成功,

        msyql:

        redis :

3.如果报错 执行docker logs -f 容器 查看实时日志 建表语句放入Git,自行下载建表

2.5 容器监控(轻量级)

2.5.1 简介         

Portainer是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环境。

Portainer分为开源社区版(CE版)和商用版(BE版/EE版)。

2.5.1 下载

官网 :Kubernetes and Docker Container Management Software

            Portainer Documentation

docker run -d -p 8000:8000 -p 9000:9000 
--name portainer 
--restart=always 
-v /var/run/docker.sock:/var/run/docker.sock 
-v portainer_data:/data 
portainer/portainer 

 第一次登录需创建admin,访问地址:xxx.xxx.xxx.xxx:9000

   设置admin用户和密码后首次登陆

    选择local选项卡后本地docker详细信息展示

    上一步的图形展示,能想得起对应命令吗?

    2.6 CAdvisor+InfluxDB+Granfana

            重量级监控,了解即可,反正我没学

    2.6.1 CIG        

    通过docker stats 命令可以很方便的查看当前宿主机上所有容器的CPU、内存、网络流量等数据,可以满足一些小型应用。

    但是 docker stats 统计结果只能是当前宿主机的全部容器,数据资料是实时的,没有地方存储、没有健康指标过线预警等功能。

    CAdvisor(监控收集) + InfluxDB(存储数据) + Granfana(展示图表),合称 CIG

    结束

            晚安 各位!!!

      评论
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

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

      抵扣说明:

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

      余额充值