• Docker-Compose运行Nginx+Redis+NetCoreAPI


    Docker-Compose运行Nginx+Redis+NetCoreAPI

    一、准备Docker-Compose 

    Docker

    开始安装Docker-compose之前你需要先确认已经安装了Docker
    Docker安装可以参考我之前的【Docker安装教程】:https://blog.go99.top/2019/04/09/docker-install/ 
    也可以参考官网教程安装:https://docs.docker.com/install/

    安装Docker-compose 

    • 参考官网:https://docs.docker.com/compose/install/
    1. 安装
    sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    2. 修改`docker-compose`权限,确保当前用户有执行权限
    sudo chmod +x /usr/local/bin/docker-compose
    3. 测试是否安装成功
    $ docker-compose --version
    docker-compose version 1.24.0, build 0aa59064
    4. 如果没有成功,可以尝试下面操作,`docker-compose`建立软连接到`/usr/bin`目录
    sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

    二、准备NetCoreAPI项目

    1. 创建api项目
    dotnet new webpai -n composeAPI --no-https
    2. 演示项目中我们涉及了`Redis`操作,所以先引入`Redis`程序包
    dotnet add package Microsoft.Extensions.Caching.StackExchangeRedis
    3. 修改`appsettings.json`,加入`redis`连接字符串配置(注意这里有密码,需要后续修改redis配置文件的访问密码)
    {
      "ConnectionStrings": {
        // 这里需要注意,server的名称需要与docker-compose.yml文件中的services名称一致
        "Redis": "redis-service:6379,password=test123"
      }
    }
    4. 修改`StartUp.cs`注入`Redis`服务
    public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    
            services.AddStackExchangeRedisCache(options => {
                options.Configuration = Configuration.GetConnectionString("Redis");
            });
    
            services.AddHttpContextAccessor();
        }
    5. 修改`ValuesController`内容,到时候在使用nginx访问网站的时候区分放到的是哪个服务
        [HttpGet("{name}")]
        public ActionResult<string> Get(string name)
        {
            var connection = _httpContextAccessor.HttpContext.Connection;
            var ipv4 = connection.LocalIpAddress.MapToIPv4().ToString();
            var cacheKey = $"test:{name}";
            _distributedCache.SetString(cacheKey, $"{ipv4}  {name}");
            var message = _distributedCache.GetString(cacheKey);
    
            return message;
        }
    6. 创建`Dockerfile`(打包api项目镜像使用)
    FROM microsoft/dotnet:2.2-sdk AS build
    WORKDIR /src
    COPY . ./
    RUN dotnet restore
    RUN dotnet publish -c Release -o out
    
    
    FROM microsoft/dotnet:2.2-aspnetcore-runtime
    WORKDIR /app
    COPY --from=build /src/out .
    ENTRYPOINT [ "dotnet", "composeAPI.dll" ]
    7. 创建`docker-compose.yml`配置文件
    • 查看`version`地址:https://docs.docker.com/compose/compose-file/compose-versioning/ 里面有docker与compose对应关系
    • `docker-compose`配置可以参考:https://docs.docker.com/compose/compose-file/
        version: "3.7"
        services: 
        web-service:
            container_name: composeapi
            build: 
            context: .
            dockerfile: Dockerfile
            restart: always
            ports: 
            - "10001:80"
            volumes: 
            - ./appsettings.json:/app/appsettings.json
        web-service-2:
            container_name: composeapi-2
            depends_on: 
            - web-service
            image: composeapi_web-service
            restart: always
            ports: 
            - "10002:80"
            volumes: 
            - ./appsettings.json:/app/appsettings.json
        web-service-3:
            container_name: composeapi-3
            depends_on:
            - web-service
            image: composeapi_web-service
            restart: always
            ports: 
            - "10003:80"
            volumes: 
            - ./appsettings.json:/app/appsettings.json
        nginx-service:
            container_name: composeapi-nginx
            image: nginx
            restart: always
            ports: 
            - "80:80"
            volumes: 
            - ./conf/nginx.conf:/etc/nginx/conf.d/default.conf
        redis-service:
            container_name: composeapi-redis
            image: redis
            restart: always
            ports: 
            - "6379:80"
            volumes: 
            - ./conf/redis.conf:/etc/redis/redis.conf
    上面的配置文件中一共包含了5个服务:
    • 3个webapi服务(由于webapi服务所依赖的镜像都是一样的,所以后面2个我直接使用第一个服务创建出来的镜像,`docker-compose`创建出来的镜像名称格式`project_service`)
    • 1个redis服务,直接使用redis镜像
    •  1个nginx服务,直接使用nginx镜像(反向代理3个webapi服务,实现负载均衡)
     
    8. 创建`nginx`配置文件:
    • 在上一步`docker-compose.yml`文件中我们看到,需要将`./conf/nginx.conf`文件映射到容器的nginx默认配置文件,方便后续维护nginx配置,不然每次修改配置文件都需要进入docker容器再修改比较麻烦。
    新建文件
    mkdir conf && cd conf
    touch nginx.conf
    `nginx.conf`添加如下配置内容:
        upstream composeapi {
            # 这里需要注意,server的名称需要与docker-compose.yml文件中的services名称一致
            server web-service:80;
            server web-service-2:80;
            server web-service-3:80;
        }
    
        server {
            listen 80;
            location / {
                proxy_pass http://composeapi;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
        }
    9. `redis`配置文件:
    直接到官网拉取基本配置文件:
    wget http://download.redis.io/redis-stable/redis.conf
    查找`requirepass`配置文件,删除注释,密码修改成与`webapi`项目中的一直,我这边是`test123`
     
    10. OK,所有准备工作都已经完毕,使用`docker-compose`跑起来
    docker-compose up -d
    # 如果提示没有权限,加上sudo
    sudo docker-compose up -d
    # 运行结果
    Creating composeapi-nginx ... done
    Creating composeapi-redis ... done
    Creating composeapi ... done
    Creating composeapi-2 ... done
    Creating composeapi-3 ... done

    三、查看运行结果

    1. `docker-compose`状态
    sudo docker-compose ps
    Name Command State Ports
    ------------------------------------------------------------------------------------------
    composeapi dotnet composeAPI.dll Up 0.0.0.0:10001->80/tcp
    composeapi-2 dotnet composeAPI.dll Up 0.0.0.0:10002->80/tcp
    composeapi-3 dotnet composeAPI.dll Up 0.0.0.0:10003->80/tcp
    composeapi-nginx nginx -g daemon off; Up 0.0.0.0:80->80/tcp
    composeapi-redis docker-entrypoint.sh redis ... Up 6379/tcp, 0.0.0.0:6379->80/tcp
    2. 网站访问情况(直接使用浏览器打开,我这里的地址是`http://172.16.102.111/api/values/hello`)
    172.18.0.3 hello
    172.18.0.5 hello
    172.18.0.6 hello
    •  上面的结果每次刷新都会循环显示

    总结

    总体来说使用docker-compose部署多容器应用还是比较简单的,看完文档自己动手去实践一下会理解的更加深刻。
    本次测试的代码我已经上传到`Github`地址:https://github.com/yasewang987/Hz.DonetDemo/tree/master/composeAPI
  • 相关阅读:
    『Python』装饰器
    『Yaml』配置文件读写包
    『Python CoolBook』数据结构和算法_字典比较&字典和集合
    『TensorFlow』滑动平均
    在ASP.NET 5中如何方便的添加前端库
    使用VS把ASP.NET 5的应用发布到Linux的Docker上
    CQRS及.NET中的参考资料
    ASP.NET Identity 3.0教程
    对ASP.NET 5和ASP.NET MVC 6应用程序进行集成测试
    Bootstrap看厌了?试试Metro UI CSS吧
  • 原文地址:https://www.cnblogs.com/hzgod/p/10842928.html
Copyright © 2020-2023  润新知