Docker-Compose运行Nginx+Redis+NetCoreAPI
1、准备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
2、准备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个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
3、查看运行结果
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