GVKun编程网logo

Docker-Compose 运行 Nginx+Redis+NetCoreAPI(docker-compose 运行java)

11

对于想了解Docker-Compose运行Nginx+Redis+NetCoreAPI的读者,本文将是一篇不可错过的文章,我们将详细介绍docker-compose运行java,并且为您提供关于.Ne

对于想了解Docker-Compose 运行 Nginx+Redis+NetCoreAPI的读者,本文将是一篇不可错过的文章,我们将详细介绍docker-compose 运行java,并且为您提供关于.Net Core Web Api 实践(三).net core+Redis+docker 实现 Session 共享、.Net Core+Nginx+Mysql使用Docker-Compose实现多容器化部署、asp.netcore 自动挡Docker Nginx Redis(滴滴滴,自动挡)、AspNetCore容器化(Docker)部署(三) —— Docker Compose容器编排的有价值信息。

本文目录一览:

Docker-Compose 运行 Nginx+Redis+NetCoreAPI(docker-compose 运行java)

Docker-Compose 运行 Nginx+Redis+NetCoreAPI(docker-compose 运行java)

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

 

.Net Core Web Api 实践(三).net core+Redis+docker 实现 Session 共享

.Net Core Web Api 实践(三).net core+Redis+docker 实现 Session 共享

前言:上篇文章介绍了.net core+Redis+IIS+nginx 实现 Session 共享,本来打算直接说明后续填坑过程,但毕竟好多坑是用 docker 部署后出现的,原计划简单提一下.net core+Redis+docker 实现 Session 共享,但是发现篇幅也不小,所以还是单独起草一篇,除了 k8s 部署 docker,其它部分都有基本介绍。

1、环境准备

操作系统:Windows10

VS2019、本地 Redis 数据库、Windows docker

2、背景介绍

由于项目从 asp.net MVC 向.net core webapi 迁移,一方面是技术方面的迁移,另一方面是从业务方面切割,向微服务模式转型,项目最后完成部署的结构大致如下:

 

 

 总体上说,大家各自的项目有各自的部署方式,一旦做成分布式的,实现 Session 共享往往就不可避免了。

 

3、.net core+Redis+docker 实现 Session 共享

如果你的项目是用 IIS 或其它方式部署,那么这部分你可以直接跳过了,因为代码部分跟上篇文章是一样的。无非是使用 windows docker 命令进行部署。

(1)用 VS2019 新建一个 Web Api 项目(RedisSessionTest)

在 Startup.cs 文件中添加以下代码  

public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => false; //这里要改为false,默认是true,true的时候session无效
                options.MinimumSameSitePolicy = Microsoft.AspNetCore.Http.SameSiteMode.None;
            });

            services.AddDataProtection(configure =>
            {
                configure.ApplicationDiscriminator = "commonweb1";
            })
            .SetApplicationName("commonweb1")
            .AddKeyManagementOptions(options =>
            {
                //配置自定义XmlRepository
                options.XmlRepository = new SessionShare();
            });

            //services.AddSession();
            #region 使用Redis保存Session
            // 这里取连接字符串 
            services.AddDistributedRedisCache(option =>
            {
                //redis 连接字符串
                option.Configuration = "";
                //redis 实例名
                option.InstanceName = "Test_Session";
            });

            //添加session 设置过期时长分钟  
            //var sessionOutTime = con.ConnectionConfig.ConnectionRedis.SessionTimeOut;
            services.AddSession(options =>
            {
                options.IdleTimeout = TimeSpan.FromSeconds(Convert.ToDouble(3 * 60 * 60)); //session活期时间
                options.Cookie.HttpOnly = true;//设为httponly
            });
            #endregion

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        }


        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseSession();
            app.UseMiddleware<RequestMiddleware>();            
            app.UseCookiePolicy();
            app.UseMvc();
        }

  

为什么这么加请参考上篇文章,这里我只做一个简单的介绍:

services.Configure<CookiePolicyOptions>:配置可以读取 cookie 信息。

app.UseCookiePolicy ():表示使用 ConfigureServices 中配置 cookie 策略

services.AddDataProtection:配置应用程序名称,自定义 MachineKey,用于不同站点服务可以读取同一 Session。

services.AddDistributedRedisCache:将 Session 保存到 Redis 数据库。

services.AddSession:配置 Sesion 策略。

app.UseMiddleware<RequestMiddleware>():使用自定义中间件。

(2)添加自定义中间件 RequestMiddleware

public class RequestMiddleware
    {
        private readonly RequestDelegate _next;

        public RequestMiddleware(RequestDelegate next)
        {
            this._next = next;
        }

        public Task Invoke(HttpContext context)
        {
            context.Request.EnableRewind(); //支持context.Request.Body重复读取,内部调用了EnableBuffering方法,否则在使用部分方法或属性时会报错误System.NotSupportedException: Specified method is not supported,例如context.Request.Body.Position
            if (context.Request.ContentLength == null)
            {
                return this._next(context);
            }

            string sessionPhone = context.Session.GetString("phone");
            if (string.IsNullOrEmpty(sessionPhone))
            {
                context.Session.SetString("phone", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            }
            return this._next(context);
        }
    }

  在中间件中保存当前时间到 Session 中。

(3)在 ValuesController 中添加测试接口

[HttpPost]
        public string PostTest(dynamic @param)
        {            
            string phone = HttpContext.Session.GetString("phone");
            return JsonConvert.SerializeObject(@param) + phone;
        }

  为了方便我把路由从 api/[Controller] 改成了 [action]:

 

 (4)添加 dockerfile 文件如下(如果用别的方式部署,后续步骤可直接跳过,如果想了解 windows docker 的安装和部署,可以点击;如果想深入了解 docker,这里我也帮不了多少,自己还在进一步学习中):

 

 (5)使用 docker 命令(windows 版)部署测试项目

打开 cmd 命令,cd 定位到项目路径

 

 

生成镜像(最后面的。不能去掉): docker build -f /Redis 使用测试 / RedisSessionTest/RedisSessionTest/Dockerfile -t testcore .

映射容器端口:docker run --name testweb -p 7001:80 -d testcore

利用 fiddler 模拟请求,调用步骤 3 中创建的 PostTest 接口,验证是否部署成功:

点击 composer-> 输入接口地址 -> 设置 contentype 头信息 -> 添加参数为 {"qqq":147},最后得到结果是: {"qqq":147} 2020-01-13 09:16:58

特别留意下这个 cookie 信息,它将作为另外一个站点下,同 http://xxxx:7001/PostTest 接口共享 Session 的接口的请求头信息。

 

 

 

 可以发现 Session 缓存的时间是 2020-01-13 09:16:58,这里注意一下,docker 容器所在 linux 系统中的时间比 windows 当前时间早了 8 个小时,也就是说我实际做测试的时间是 2020-01-13 17:16:58,如果要解决这个问题,在 dockerfile 文件中加入时区设置:

#设置时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

(6)重复上面几个步骤,新增一个新的 web api 项目(RedisSessionTestNew)

在第(3)步的时候,将新增项目的接口 action 改为 PostTestNew,用于区别 RedisSessionTest 项目,即代码如下:

[HttpPost]
        public string PostTestNew(dynamic @param)
        {            
            string phone = HttpContext.Session.GetString("phone");
            return JsonConvert.SerializeObject(@param) + phone;
        }

  

在第(5)步的时候,将新的项目映射为 7002 端口,我的测试项目部署如下:

生成镜像(最后面的。不能去掉): docker build -f /Redis 使用测试 / RedisSessionTest/RedisSessionTestNew/Dockerfile -t testnewcore .

映射容器端口:docker run --name testnewweb -p 7002:80 -d testnewcore

 

接下来再使用 fiddler 去调用 7002 站点下的 PostTestNew 接口,注意带上 7001PostTest 测试结果中的 cookie 信息,参数为 {"qqq":258},结果如下:{"qqq":258} 2020-01-13 09:16:58

 

 

 

 

 

 

4、分析测试结果

这里对比下两次请求结果:

http://XXXX:7001/PostTest:{"qqq":147}2020-01-13 09:16:58

http://XXXX:7002/PostTestNew:{"qqq":258}2020-01-13 09:16:58

7002/PostTestNew 的结果中输出的请求参数值发生了变化,但是从 Session 中读取到的时间是 7001/PostTest 设置的 Session 值,而且访问 Redis 数据库,确实只保存了一个 Session 值,说明实现了 Session 共享。

 

 

 

最后尤其要注意,这里采用了 cookie 值作为 id 寻找 Session 值的方式,所以项目中需要保存第一次缓存 Session 产生的 cookie 值,在后面 http 请求的头中带上该 cookie 值;若是 session 值发生了变化,则将新的 cookie 值覆盖到原来的 cookie 值。

原文出处:https://www.cnblogs.com/BradPitt/p/12188732.html

.Net Core+Nginx+Mysql使用Docker-Compose实现多容器化部署

.Net Core+Nginx+Mysql使用Docker-Compose实现多容器化部署

 

 

 一:构建docker-compose.yml文件

version: '3'
services:
    MysqL.db:
     container_name: MysqL.db
     image: MysqL
     restart: always
     environment:
       MysqL_ROOT_PASSWORD: xxxxx
     command:
      --lower_case_table_names=1
      #--initialize-insecure
     volumes:
      - /home/MysqL/:/var/lib/MysqL
     ports:
      - 3306:3306
     
    dotnetapi:
        container_name: dotnetapicontains
        build: .
        depends_on:
          -  MysqL.db
        links:
          -  MysqL.db
    reverse-proxy:
        container_name: reverse-proxy
        image: Nginx
        depends_on:
        - dotnetapi
        ports:
         - "5002:5002"
        volumes:
         - ./proxy.conf:/etc/Nginx/conf.d/default.conf

其中定义了三个服务:

  1. myql.db:使用MysqL镜像,并挂载当前项目下的/home/MysqL/文件夹来持久化存储,参数顺序一定不要乱,不然会入坑。,
    --lower_case_table_names=1数据库忽略大小写
  2. dotnetapi:基于当前项目构建的容器服务,依赖于MysqL.db服务。
  3. reverse-proxy:使用Nginx定义反向代理服务,其中挂载了当前项目下的proxy.conf文件作为反向代理配置文件。其中proxy.conf的配置如下(注意proxy_pass指定的url为http://dotentapi:5002)

二:构建proxy.conf文件

server {
    listen 5002;
    location / {
      proxy_pass http://dotnetapi:5002;
    }
}

三:使用docker-compose命令发布

docker-compose up -d  #后台运行

docker-compose up

 

asp.netcore 自动挡Docker Nginx Redis(滴滴滴,自动挡)

asp.netcore 自动挡Docker Nginx Redis(滴滴滴,自动挡)

前言

上一章介绍了Docker通过多条命令创建启动运行Docker容器,由此可见这样一个个去创建单独的容器也是相当麻烦的,比如要在某个复杂项目中用DB、缓存、消息等等,这样我们还要去一个个再创建,为此这时候需要用上我们三剑客中的一员大将自动挡的(DockerCompose).Compose是一个用于定义和应用多个容器的工具(镜像、启动命令、端口映射等),一条命令便可配置我们引用中的所有服务.

分享图片

Base

Image

指定镜像名称或者镜像Id,如果该镜像不存在,会尝试pull下来。

build

指定Dockerfile文件的路径

build: ./dir

也可以是一个对象。

build: context: ./dir dockerfile: Dockerfile-alternate args: buildno: 1

command

覆盖容器启动后默认执行的命令。

command: bundle exec thin -p 3000

该命令也可以是列表,类似于 dockerfile:

command: ["bundle","exec","thin","-p","3000"]

链接到其他服务器中的容器,可以指定服务名称和链接的别名使用SERVICE:ALIAS的形式,或者只指定服务名称

links:
   - db
   - db:database
   - redis

表示链接到docker-compose.yml外部的容器,甚至并非Compose管理的容器,特别是对于那些提供共享容器或共同服务。格式跟links类似

external_links:
  - redis_1
  - project_db_1:MysqL
  - project_db_1:postgresql
ports

暴露端口信息。使用宿主端口:容器端口的格式,或者仅仅指定容器的端口(此时宿主机将会随机指定端口),类似于docker run -p

ports:
 - "3000"
 - "3000-3005"
 - "8000:8000"
 - "9090-9091:8080-8081"
 - "49100:22"
 - "127.0.0.1:8001:8001"
 - "127.0.0.1:5000-5010:5000-5010"
expose

暴露端口,只将端口暴露给连接的服务,而不暴露给宿主机

expose:
 - "3000"
 - "8000"
volumes

卷挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)

volumes:
  # Just specify a path and let the Engine create a volume
  - /var/lib/MysqL

  # Specify an absolute path mapping
  - /opt/data:/var/lib/MysqL

  # Path on the host,relative to the Compose file
  - ./cache:/tmp/cache

  # User-relative path
  - ~/configs:/etc/configs/:ro

  # Named volume
  - datavolume:/var/lib/MysqL
volumes_from

从另一个服务或者容器挂载卷。可以指定只读或者可读写,如果访问模式没有指定,则默认是可读写。

volumes_from:
 - service_name
 - service_name:ro
 - container:container_name
 - container:container_name:rw
environment

设置环境变量。可以使用数组或者字典两种方式。只有一个key的环境变量可以在运行Compose的机器上找到对应的值,这有助于加密的或者特殊主机的值。

environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET
env_file

从文件中获取环境变量,可以为单独的文件路径或列表。如果通过 docker-compose -f FILE 指定了模板文件,则 env_file 中路径会基于模板文件路径。如果有变量名称与 environment 指令冲突,则以envirment 为准。

env_file: .env

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env
extends

继承另一个服务,基于已有的服务进行扩展。

net

设置网络模式。

net: "bridge"
net: "host"
net: "none"
net: "container:[service name or container name/id]"
dns

配置DNS服务器。可以是一个值,也可以是一个列表。

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9

配置DNS的搜索域,可以是一个值,可以是一个列表。

dns_search: example.com
dns_search:
  - dc1.example.com
  - dc2.example.com

Dockerfile

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base
workdir /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
workdir /src
copY DockerComposeDemo/DockerComposeDemo.csproj DockerComposeDemo/
RUN dotnet restore "DockerComposeDemo/DockerComposeDemo.csproj"
copY . .
workdir "/src/DockerComposeDemo"
RUN dotnet build "DockerComposeDemo.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "DockerComposeDemo.csproj" -c Release -o /app

FROM base AS final
workdir /app
copY --from=publish /app .
ENTRYPOINT ["dotnet","DockerComposeDemo.dll"]

编辑 docker-compose.yml

version: '3.4'

services:
  dockercomposedemoo:
    image: ${DOCKER_REGISTRY-}dockercomposedemo
    build:
      context: .
      dockerfile: DockerComposeDemo/Dockerfile
   
  redis:
   container_name: redis
   image: redis
   ports:
      # 端口映射
      - 6379:6379

  Nginx:
   container_name: Nginx
   image: Nginx
   ports:
      # 端口映射
      - 8081:80
   volumes:
      - /Users/fenghui/projects/Nginx/Nginx.conf:/etc/Nginx/Nginx.conf

加入了redis和Nginx镜像,直接用Nginx进行部署该项目。
上面也体现了端口的映射以及文件的映射,演示的示例是Nginx.conf文件映射(切记一定要共享文件夹)

Nginx.conf
user  Nginx;
worker_processes  1;

error_log  /var/log/Nginx/error.log warn;
pid        /var/run/Nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/Nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/Nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    #include /etc/Nginx/conf.d/*.conf;
    
        server {
        listen       80;
        server_name  localhost;
        
        #charset koi8-r;

        #access_log  logs/host.access.log  main;
        #access_log logs/access.log main;
        #error_log logs/error.log;
     location / {
             
             proxy_pass http://172.17.0.1:8082;
  
             proxy_http_version 1.1;
   
             proxy_set_header Upgrade $http_upgrade;
 
             proxy_set_header Connection keep-alive;
    
             proxy_set_header Host $http_host;
           
             proxy_cache_bypass $http_upgrade;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header REMOTE-HOST $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

         }


    }
    
}

创建一个项目,演示访问次数,存储直接用redis存储

分享图片

package

using ServiceStack.Redis;

redis test
private readonly RedisManagerPool redismanger = new RedisManagerPool("172.17.0.1:6379");
        public void OnGet()
        {
            using (var db = redismanger.GetClient()) {
                ViewData["num"] = db.IncrementValue("count");
            } 
        }
aspx

@ViewData["num"]

Run

构建容器

分享图片

然后打开浏览器输入8081,8081为Nginx代理的端口,同时可以通过wappalyzer看见我们的web服务器是Nginx。

分享图片

分享图片

redis测试成功没问题

使用dockercompose编排工具进行构建容器是不是方便了好多。

概要

参考:https://docs.docker.com/compose/compose-file/

Demo: https://github.com/fhcodegit/DockerCompose

AspNetCore容器化(Docker)部署(三) —— Docker Compose容器编排

AspNetCore容器化(Docker)部署(三) —— Docker Compose容器编排

一.前言

上一篇部署了一个最基础的helloworld应用,创建了两个容器和一个network,还算应付得过来。

如果该应用继续引入mysql、redis、job等若干服务,到时候发布一次得工作量之大就可想而知了,这时候就需要用到Docker Compose。

Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。使用Compose,可以使用YAML文件来配置应用程序的服务,然后使用一条命令就可以从配置中创建并启动所有服务。

Docker Compose概述及命令使用 https://docs.docker.com/compose/reference/overview/

 

二.安装Compose

Windows下安装Docker Desktop时已经附带安装了Docker Compose

PS C:\Users\Administrator> docker-compose version
docker-compose version 1.23.2, build 1110ad01
docker-py version: 3.6.0
CPython version: 3.6.6
OpenSSL version: OpenSSL 1.0.2o  27 Mar 2018

 

Linux下需要自行安装

root@VM-16-9-ubuntu:~# apt install docker-compose

 

三.使用Compose

1.编排服务

在解决方案下创建docker-compose.yml文件

version: ''3.4''

services:
  helloworld:
    image: helloworld:v2.0
    build: #镜像构建
      context: . #工作目录
      dockerfile: HelloWorld/Dockerfile #Dockerfile位置
    environment: #环境变量
      - ASPNETCORE_ENVIRONMENT=Development
    ports: #端口映射
      - "81:80"
    container_name: netcore_helloworld #容器名
    deploy:
      restart_policy: #重启策略
        condition: on-failure
        delay: 5s
        max_attempts: 3
    networks: #指定network
      - default
      - newbridge
      
  mynginx:
    image: mynginx:v2.0
    build:
      context: MyNginx
      dockerfile: Dockerfile
    ports:
      - "80:80"
      - "801:801"
    container_name: mynginx
    deploy:
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
    networks:
      - default

networks:
  default: #定义一个docker中已存在的network
    external: 
      name: mybridge
  newbridge: #新的network
    #name: newbridge  #compose版本3.5开始才支持自定义名称

 

2.启动容器

https://docs.docker.com/compose/reference/up/

docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]

docker-compose up指令包含了docker-compose build,当yml文件services中配置的image(helloworld:v2.0和mynginx:v2.0)不存在时会先build这两个镜像,再创建container,

如果image已存在,则直接创建container

PS C:\Users\Administrator> cd C:\Users\Administrator\source\repos\AspNetCore_Docker
PS C:\Users\Administrator\source\repos\AspNetCore_Docker> docker-compose up -d
WARNING: Some services (helloworld, mynginx) use the ''deploy'' key, which will be ignored. Compose does not support ''deploy'' configuration - use `docker stack deploy` to deploy to a swarm.
Creating network "aspnetcore_docker_newbridge" with the default driver
Creating netcore_helloworld ... done
Creating mynginx            ... done
PS C:\Users\Administrator\source\repos\AspNetCore_Docker> docker images
REPOSITORY                             TAG                 IMAGE ID            CREATED             SIZE
mynginx                                v2.0                9c18561d7ab3        27 minutes ago      109MB
helloworld                             v2.0                c42e9f575fc4        24 hours ago        265MB
nginx                                  latest              62c261073ecf        9 days ago          109MB
mcr.microsoft.com/dotnet/core/sdk      2.2-stretch         e4747ec2aaff        3 weeks ago         1.74GB
mcr.microsoft.com/dotnet/core/aspnet   2.2-stretch-slim    f6d51449c477        3 weeks ago         260MB
docker4w/nsenter-dockerd               latest              2f1c802f322f        8 months ago        187kB
PS C:\Users\Administrator\source\repos\AspNetCore_Docker> docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                      NAMES
66ff08eda2ae        helloworld:v2.0     "dotnet HelloWorld.d…"   11 minutes ago      Up 11 minutes       0.0.0.0:81->80/tcp                         netcore_helloworld
5357b641a7b1        mynginx:v2.0        "nginx -g ''daemon of…"   11 minutes ago      Up 11 minutes       0.0.0.0:80->80/tcp, 0.0.0.0:801->801/tcp   mynginx

 

3.删除容器

PS C:\Users\Administrator\source\repos\AspNetCore_Docker> docker-compose down
WARNING: Some services (helloworld, mynginx) use the ''deploy'' key, which will be ignored. Compose does not support ''deploy'' configuration - use `docker stack deploy` to deploy to a swarm.
Stopping mynginx            ... done
Stopping netcore_helloworld ... done
Removing mynginx            ... done
Removing netcore_helloworld ... done
Network mybridge is external, skipping   #外部的bridge不会被删除,直接跳过
Removing network aspnetcore_docker_newbridge

 

四.远程镜像仓库

docker官方的只能创建一个免费私有仓库,国内各大云服务器商都有提供免费的、无限量的镜像仓库。


1.登录到远程registry

docker login --username=[username] ccr.ccs.tencentyun.com

PS C:\Users\Administrator> docker login --username=你的用户名 ccr.ccs.tencentyun.com
Password:
Login Succeeded

 

2.上传镜像

docker tag [ImageId] ccr.ccs.tencentyun.com/[namespace]/[ImageName]:[镜像版本号]

PS C:\Users\Administrator> docker tag c42e9f575fc4 ccr.ccs.tencentyun.com/wuuu/helloworld
PS C:\Users\Administrator> docker tag 9c18561d7ab3 ccr.ccs.tencentyun.com/wuuu/mynginx
PS C:\Users\Administrator> docker images
REPOSITORY                               TAG                 IMAGE ID            CREATED             SIZE
ccr.ccs.tencentyun.com/wuuu/mynginx      latest              9c18561d7ab3        2 days ago          109MB
mynginx                                  v2.0                9c18561d7ab3        2 days ago          109MB
ccr.ccs.tencentyun.com/wuuu/helloworld   latest              c42e9f575fc4        3 days ago          265MB
helloworld                               v2.0                c42e9f575fc4        3 days ago          265MB
nginx                                    latest              62c261073ecf        12 days ago         109MB
mcr.microsoft.com/dotnet/core/sdk        2.2-stretch         e4747ec2aaff        3 weeks ago         1.74GB
mcr.microsoft.com/dotnet/core/aspnet     2.2-stretch-slim    f6d51449c477        3 weeks ago         260MB
docker4w/nsenter-dockerd                 latest              2f1c802f322f        8 months ago        187kB
PS C:\Users\Administrator>

 
docker push ccr.ccs.tencentyun.com/[namespace]/[ImageName]:[镜像版本号]

PS C:\Users\Administrator> docker push ccr.ccs.tencentyun.com/wuuu/helloworld
The push refers to repository [ccr.ccs.tencentyun.com/wuuu/helloworld]
... latest: digest: sha256:d991fe759257905f727593cc09d8299462e20e31ada3a92023a48fbc130f7484 size:
1581 PS C:\Users\Administrator> docker push ccr.ccs.tencentyun.com/wuuu/mynginx The push refers to repository [ccr.ccs.tencentyun.com/wuuu/mynginx]
...
latest: digest: sha256:0eda000278411f5b6e034944993f6f5b94825125124f67cc7caf4e684aad5a85 size: 1155 PS C:\Users\Administrator>

 

2.通过远程镜像启动容器

在原yml文件基础上移除build项,修改image地址。

docker compose up会从远程仓库pull镜像并启动容器,如果是私有仓库,需要提前登录到远程registry。

version: ''3.4''

services:
  helloworld:
    image: ccr.ccs.tencentyun.com/wuuu/helloworld
    environment: #环境变量
      - ASPNETCORE_ENVIRONMENT=Development
    ports: #端口映射
      - "81:80"
    container_name: netcore_helloworld #容器名
    deploy:
      restart_policy: #重启策略
        condition: on-failure
        delay: 5s
        max_attempts: 3
    networks: #指定network
      - default
      - newbridge
      
  mynginx:
    image: ccr.ccs.tencentyun.com/wuuu/mynginx
    ports:
      - "80:80"
      - "801:801"
    container_name: mynginx
    deploy:
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
    networks:
      - default

networks:
  default: #定义一个docker中已存在的network
    external: 
      name: mybridge
  newbridge: #新的network
    #name: newbridge  #compose版本3.5开始才支持自定义名称

 

示例代码Github地址:https://github.com/wwwu/AspNetCore_Docker

 

  • AspNetCore容器化(Docker)部署(一) —— 入门
  • AspNetCore容器化(Docker)部署(二) —— 多容器通信
  • AspNetCore容器化(Docker)部署(三) —— Docker Compose容器编排
  • AspNetCore容器化(Docker)部署(四) —— Jenkins自动化部署

 

我们今天的关于Docker-Compose 运行 Nginx+Redis+NetCoreAPIdocker-compose 运行java的分享已经告一段落,感谢您的关注,如果您想了解更多关于.Net Core Web Api 实践(三).net core+Redis+docker 实现 Session 共享、.Net Core+Nginx+Mysql使用Docker-Compose实现多容器化部署、asp.netcore 自动挡Docker Nginx Redis(滴滴滴,自动挡)、AspNetCore容器化(Docker)部署(三) —— Docker Compose容器编排的相关信息,请在本站查询。

本文标签: