• 第六节:docker compose服务编排简介、基于发布包构建多个webapi容器 和 基于镜像实现Nginx反向代理webapi


    一. docker compose服务编排简介

    1. 背景

    微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,维护的工作量会很大:

     A. 要创建镜像 Dockerfile build image 或者去dockerhub拉取image

     B. 要创建多个container

     C. 要管理这些container(启动停止删除)

    因此,“服务编排” 的概念应运而生。

    2. docker compose介绍

     docker compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。使用步骤:

    (1). 利用 Dockerfile 定义运行环境镜像

    (2). 使用 docker-compose.yml 定义组成应用的各服务

    注: 也可以自定义命名,但是需要通过 -f 指定路径

    (3). 运行指令 【docker-compose up】 启动应用

     如下图:

    3. docker compose的安装和卸载

    参照官网:https://docs.docker.com/compose/install/

    (1). 安装步骤

     前提:docker compose在Linux上运行,首先要安装docker (详见第一节,这里不再介绍)。

    A.  通过curl下载二进制文件进行安装

    (不建议使用官方地址下载,慢的要死!!!)

    sudo curl -L "https://github.com/docker/compose/releases/download/1.27.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

    PS:1.27.3 是目前最稳定版本,版本去上面的官网地址查询即可。

    注. 上面是从github上下载,由于网速原因,很容易失败,也可以尝试下面的地址: (强烈推荐使用这个地址!!!)

    sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.27.3/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose 

    如图:

    B.  通过chmod 命令将该目录设置为可运行 (对于一个目录,如果没有可执行权限,则不能cd进入)

    sudo chmod +x /usr/local/bin/docker-compose

    C. 查看安装成功后的版本号

    docker-compose --version

    (2). 卸载步骤

    sudo rm /usr/local/bin/docker-compose

    4. docker compose常用指令

    前言:默认情况下命令读取当前目录下,名为 docker-compose.yml 或 docker-compose.yaml 的文件, 当然用户也可以使用 -f 指定其他文件名。

    某个docker-compose配置文件相关指令:

    (1). 参数剖析

     -f :指定配置文件路径

     -p:指定名称,生成的镜像和容器都会以该名称开头,但是在执行后续指令的时候也需要加上-p,否则无效。如下图:

    docker-compose -f ./nginx_api_compose.yml -p yxy ps

    (2). 指令剖析

     查看镜像:【docker-compose images】

     查看容器:【docker-compose ps】【docker-compose ps -a】

     停止容器:【docker-compose stop】  

     重启容器:【docker-compose restart】

     开启容器:【docker-compose start】

     删除已经停止的容器:【docker-compose rm】 加-f 强制删除无效, 且不会删除镜像和数据卷。

     停止并删除运行中的 Compose 应用(包含镜像、容器、数据卷、networks):【docker-compose down】

     创建并启动容器:【docker-compose up -d】 -d表示以后台的方式运行,不要省略,而且它属于up的参数,必须加在up的后面,启动的过程中,如果没有images,会先构建镜像。

    PS:镜像和容器的命名规则,默认是前置都会以目录命名,且默认加上 _1 _2 _3 ,可以用-p来指定名称,代替以目录命名。

    (3). 常用的命令组合

     创建并启动容器(指定yml的路径):【docker-compose -f ./xxx/xx.yml up -d】

     查看容器情况(指定yml的路径):【docker-compose -f ./xxx/xx.yml ps】

     创建并启动容器(指定yml的路径和容器命名):【docker-compose -f ./nginx_api_compose.yml -p yxy up -d】

     查看容器情况(指定yml的路径和容器命名):【docker-compose -f ./nginx_api_compose.yml -p yxy ps】

    二. yaml及docker compose参数剖析

    1. 版本对应关系

     关于docker和docker-compose的版本对应关系,详见:https://docs.docker.com/compose/compose-file/compose-versioning/

     

    2. Yaml和Json转换

     yaml和json 校验转换地址为:http://www.bejson.com/validators/yaml_editor/ 

     docker-compose.yml (或docker-compose.yaml)编写格式支持yml或json,个人喜好json格式

    3. docker compose配置文件详解

    参考地址:

      官方介绍:https://docs.docker.com/compose/compose-file/     (推荐)

      中文翻译:https://blog.csdn.net/qq_36148847/article/details/79427878  (仅供参考)

    分享两个docker-compose.yml文件

    a. 基于发布包构建镜像

    {
      "version": "3.8",
      "services": {
        "myapi1": {
          "build": "../ypfwebapi1/",
          "ports": [
            "8100:9000"
          ]
        },
        "myapi2": {
          "build": "../ypfwebapi2/",
          "ports": [
            "8101:9001"
          ]
        }
      }
    }

     b. stack中构建镜像

    {
      "version": "3.8",
      "services": {
        "api1": {
        "image": "ypfwebapi1",
          "ports": [
              "8301:9001"
          ],
          "deploy": {
            "mode": "replicated",
            "replicas": 2
          }
        },
        "api2": {
        "image": "ypfwebapi2",
          "ports": [
              "8302:9002"
          ],
          "deploy": {
            "mode": "replicated",
            "replicas": 2
          }
        }
      }
    }

    (1). version:版本号,对应关系详见 https://docs.docker.com/compose/compose-file/compose-versioning/

    (2). build:发布包目录

    (3). images:镜像名称

    (4). ports:端口映射,前面是容器暴露端口,后面是镜像端口

    (5). expose:对外暴露端口

    (7). volumes:数据卷

    (9). replicas : 代表在n个节点上进行任务

    三. 基于发布包构建多个webapi容器

    1.  准备项目发布包

      将ypfwebapi1和ypfwebapi2两个发布包复制到myprogram文件夹,两个的Dockerfile文件中暴露的端口分别为 9000 和 9001。

    两个Dockerfile文件如下:

    #1.依赖两个基础镜像
    FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim 
    FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster 
    
    #2.制作人
    MAINTAINER ypf <ypf@qq.com>
    
    #3.指定程序运行的端口(也可以在项目中通过UseUrls指定, 或者发布容器的时候通过--env ASPNETCORE_URLS=xxx动态指定) 
    ENV ASPNETCORE_URLS=http://*:9000
    
    #4.容器对外暴露的端口
    EXPOSE 9000
    
    #5.指定默认工作目录
    WORKDIR /userapi
    COPY . /userapi/
    
    #6.启动容器的时候执行shell命令:dotnet webapi1.dll,即运行该项目
    ENTRYPOINT ["dotnet", "webapi1.dll"]
    View Code
    #1.依赖两个基础镜像
    FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim 
    FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster 
    
    #2.制作人
    MAINTAINER ypf <ypf@qq.com>
    
    #3.指定程序运行的端口(也可以在项目中通过UseUrls指定, 或者发布容器的时候通过--env ASPNETCORE_URLS=xxx动态指定) 
    ENV ASPNETCORE_URLS=http://*:9001
    
    #4.容器对外暴露的端口
    EXPOSE 9001
    
    #5.指定默认工作目录
    WORKDIR /userapi
    COPY . /userapi/
    
    #6.启动容器的时候执行shell命令:dotnet webapi1.dll,即运行该项目
    ENTRYPOINT ["dotnet", "webapi1.dll"]
    View Code

    发布包截图:

     

    2. 编辑配置文件

     在myprogram文件夹下创建mycompose文件夹,用于存放各种docker compose配置文件的。

    docker-compose.yml 内容如下:

    {
      "version": "3.8",
      "services": {
        "myapi1": {
          "build": "../ypfwebapi1/",
          "ports": [
            "8100:9000"
          ]
        },
        "myapi2": {
          "build": "../ypfwebapi2/",
          "ports": [
            "8101:9001"
          ]
        }
      }
    }

    3.  创建并启动容器

     以后台的运行的方式构建容器,运行指令:【docker-compose up -d】,不要省略-d

    查看镜像:

     

    查看容器:

    4. 测试端口,成功。

     http://119.45.174.249:8100/weatherforecast

     http://119.45.174.249:8101/weatherforecast

     

    四. 基于镜像实现Nginx反向代理webapi

     1. 准备镜像  

    (1). 构建一个ypfwebapi1镜像,Dockerfile中暴露的端口为 9000 (详见前面章节)

    (2). 然后要下载一个nginx最新版本的镜像 【docker pull nginx】

     

    2. 准备配置文件

     在mycompose文件夹里,新建一个 nginx_api_compose.yml 文件.

    配置文件内容如下:

    {
      "version": "3.8",
      "services": {
        "cnginxcontainer1": {
          "image": "nginx",
          "ports": [
            "8080:8080"
          ],
          "links": [
            "cypfwebapicontainer1"
          ],
          "volumes": [
            "./nginx/conf.d:/etc/nginx/conf.d"
          ]
        },
        "cypfwebapicontainer1": {
          "image": "ypfwebapi1",
          "expose": [
            "9000"
          ]
        }
      }
    }

    3. 创建配置文件

     在当前目录下运行创建对应的文件夹

    mkdir -p ./nginx/conf.d

     

    并在该目录新建一个配置文件 ypfnginx.conf,会自动同步到容器中(数据卷挂载),内容如下:

    server {
        listen 8080;
        access_log off;
    
        location / {
            proxy_pass http://cypfwebapicontainer1:9000;
        }
       
    }

    4. 创建容器并启动

       回到mycompose文件夹,运行指令 【 docker-compose -f ./nginx_api_compose.yml up -d 】   ./是当前目录,可以省略

    查看镜像和容器:

                           

     

    5. 测试

     因为监听的是8080端口,所有直接访问 http://119.45.174.249:8080/weatherforecast, 测试成功。

    !

    • 作       者 : Yaopengfei(姚鹏飞)
    • 博客地址 : http://www.cnblogs.com/yaopengfei/
    • 声     明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
    • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
     
  • 相关阅读:
    the core or essence of a computer
    HEXADECIMAL NOTATION is Syntactic_sugar.
    Converting from Decimal Notation to Binary Notation for Fractions
    convert from base 10 to base 2
    MYSQL PASSWORD()
    Environment Variables
    Why Stored Procedures?
    delimiter
    page fault rate
    Segmentation
  • 原文地址:https://www.cnblogs.com/yaopengfei/p/13672708.html
Copyright © 2020-2023  润新知