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., 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:;
server web-service-:;
server web-service-:;
} server {
listen ;
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- ... done
Creating composeapi- ... done

三、查看运行结果

1. `docker-compose`状态
sudo docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------------
composeapi dotnet composeAPI.dll Up 0.0.0.0:->/tcp
composeapi- dotnet composeAPI.dll Up 0.0.0.0:->/tcp
composeapi- dotnet composeAPI.dll Up 0.0.0.0:->/tcp
composeapi-nginx nginx -g daemon off; Up 0.0.0.0:->/tcp
composeapi-redis docker-entrypoint.sh redis ... Up /tcp, 0.0.0.0:->/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

Docker-Compose运行Nginx+Redis+NetCoreAPI的更多相关文章

  1. Docker中运行nginx

    Docker中运行nginx 1.Docker中运行nginx 2.配置文件 2.1 nginx.conf 2.2 default.conf 3.docker的镜像可以挂什么卷 部分内容原文地址: C ...

  2. dotnet跨平台 - 使用Nginx+Docker Compose运行.NETCore项目

    参考文档: https://docs.docker.com/install/linux/docker-ce/centos/ http://www.dockerinfo.net/document htt ...

  3. Docker Compose 部署Nginx服务实现负载均衡

    Compose简介: Compose是Docker容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器,使用Docker Compose,不再需要使用shell脚本来启动容器.Comp ...

  4. 容器(docker)内运行Nginx

    容器内运行nginx其实很简单,但是一开始还是浪费了我很多时间.这里写下来给大家省点时间. 1.创建nginx文件夹,放置各种配置及日志等. mkdir /docker/nginx docker 文件 ...

  5. Docker 自动运行Nginx容器

    Dockerfile文件如下: FROM ubuntu #基础镜像 RUN apt-get update #更新apt RUN apt-get -y install nginx #安装nginx VO ...

  6. 阿里云服务器用Docker配置运行nginx并访问

    一.Docker拉取nginx镜像 docker pull nginx:1.12.2 这里是下载的是nginx的1.12.2版本,其他版本的镜像请访问https://hub.docker.com/r/ ...

  7. [Docker] Win10中安装Docker并运行Nginx镜像

    一.安装Docker 进入官网:https://www.docker.com/products/docker-desktop 可能需要先注册登录,很简单的. 点击 Download Desktop f ...

  8. Docker教程:使用Docker容器运行Nginx并实现反向代理

    一.前言 我们知道,为了安全考虑,我们一般会设置反向代理,用来屏蔽应用程序真实的IP和端口号.在Linux系统上最常用的反向代理就是Nginx.本篇文章中,我们会通过Docker容器分别运行一个Ngi ...

  9. Docker Compose部署 nginx代理Tomcat集群

    一.简介 使用Docker镜像部署Nginx代理的多个Tomcat集群: 使用Dockerfile构建nginx镜像 使用Dockerfile构建tomcat镜像 mysql镜像使用docker hu ...

随机推荐

  1. x86和x64下指针的大小

    根据测试 int main() { ; )); )); int n1 = sizeof(a); int n2 = sizeof(p); // int n3 = sizeof(*p); error in ...

  2. poj1734 Sightseeing trip[最小环]

    一个最小环裸题.最小环的两种求法dijkstra和Floyd直接参见这里我就是从这里学的,不想写了. 注意这里最重要的一个点是利用了Floyd的dp过程中路径上点不超过$k$这一性质,来枚举环上最大编 ...

  3. tbdr+mrt

    有关mrt的在tbdr的架构下的内存排布 system memory肯定是dither 我对这里把握比较大 rt0 rgba8 rt1 r8 这样像素排列是rgba8r8rgba8r8rgba8r8. ...

  4. IOS下图片不能显示问题的解决办法

    最近遇到这样一个问题,在HTML5手机页面中,直接给<img>标签设置宽高,即便图片路径正常,在IOS真机下也是无法显示的,而在安卓以及浏览器的模拟真机上都是正常显示的,这是为什么呢? h ...

  5. WPF界面开发技巧大放送!DevExpress WPF在TreeListView中扩展N级

    DevExpress广泛应用于ECM企业内容管理. 成本管控.进程监督.生产调度,在企业/政务信息化管理中占据一席重要之地.通过DevExpress WPF Controls,您能创建有着强大互动功能 ...

  6. BZOJ 1951: [Sdoi2010]古代猪文 ExCRT+欧拉定理+Lucas

    欧拉定理不要忘记!! #include <bits/stdc++.h> #define N 100000 #define ll long long #define ull unsigned ...

  7. CSS3选择器:nth-child和:nth-of-type的差异

    p:nth-child(2)表示这个元素要是p标签,且是第二个子元素,是两个必须满足的条件. <section> <div>我是一个普通的div标签</div> & ...

  8. codeforces340C

    Tourist Problem CodeForces - 340C Iahub is a big fan of tourists. He wants to become a tourist himse ...

  9. MySQL_(Java)【事物操作】使用JDBC模拟银行转账向数据库发起修改请求

    MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC向数据库中插入(insert)数据 传送门 MySQL_(Java)使用JDBC向数据库中删除(d ...

  10. 关于SpringBoot跨域的问题

    直接在启动类里面加这一段代码就行: @Bean public CorsFilter corsFilter() { final UrlBasedCorsConfigurationSource sourc ...