dotnet跨平台 - 使用Nginx+Docker Compose运行.NETCore项目
参考文档:
https://docs.docker.com/install/linux/docker-ce/centos/
http://www.dockerinfo.net/document
https://dotnet.microsoft.com/download/linux-package-manager/centos/sdk-current
https://www.cnblogs.com/JulianHuang/p/10919346.html
https://blog.csdn.net/wulex/article/details/81842258
环境
服务器系统:CentOS Linux release 7.2.1511
相关工具:VS2017 xftp putty
服务器软件:.net core 2.0,docker 18.09.6,docker-compose 1.23.2
面向对象:NetCore和Docker的初学者
因为前面一篇文章已经写了怎么用docker部署项目,所以本文默认服务器系统已安装好docker环境,
不太了解的同学可以查看这篇文章【DotNet跨平台 - docker部署.net core2.0项目】。
1.安装Docker Compose
1.1 什么是Dock Compose?
Compose是一个用于定义和运行多容器Docker应用程序的工具。使用Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用单个命令,您可以从配置中创建并启动所有服务。
Compose适用于所有环境:生产,登台,开发,测试以及CI工作流程。您可以在常见用例中了解有关每个案例的更多信息。
使用Compose基本上是一个三步过程:
-
定义您的应用程序环境,
Dockerfile
以便可以在任何地方进行复制。 -
定义构成应用程序的服务,
docker-compose.yml
以便它们可以在隔离的环境中一起运行。 -
Run
docker-compose up
和Compose启动并运行整个应用程序。
上面是官方文档里的介绍,想具体了解的可以参考官方文档:https://docs.docker.com/compose/
使用Docker容器化部署项目,一个项目中肯定会涉及到多个容器,比如Nginx、MySql、NETCore都是一个独立的容器,我们每次部署都需要执行多次创建镜像与运行容器的命令,Docker Compose的出现就很好的解决了这些问题,有了Docker Compose我们就可以通过一条命令,生成多镜像与运行容器了。
网上各种文章都在说Docker Compose很香,具体有多香,咱们就来试一试。
1.2 Docker Compose的安装
//下载 sudo curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose (上面地址如果速度慢的话可以试试下面这个:curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
)
//设置执行权限 sudo chmod +x /usr/local/bin/docker-compose
//查看是否安装成功
docker-compose --version
官方安装文档:https://docs.docker.com/compose/install/
2.服务器部署NETCore项目
2.1 通过xftp将发布后的项目上传到CentOS服务器
部署项目的路径为:/home/app9001,然后新建文件夹app,将发布后的项目文件上传至app文件夹。
2.2 编辑Dockerfile
Dockerfile存放在站点的根目录也就是app文件夹内,我们设置站点的端口为9001。
# 添加基础镜像:docker会从网络下载这个镜像 FROM microsoft/dotnet:2-sdk #容器中系统的工作空间 WORKDIR /app #拷贝当前文件夹下的文件到容器中系统的工作空间(注意:“.”后面有空格) COPY . /app #设置Docker容器对外暴露的端口 EXPOSE 9001 #容器中使用 ["dotnet","系统启动的dll"] 来运行应用程序 #使用ENTRYPOINT ["dotnet","系统启动的dll"] #或使用 CMD ["dotnet","系统启动的dll"] ENTRYPOINT ["dotnet", "WebTest.dll"]
3.Nginx的配置
.NET Core中默认的Web Server为Kestrel。
Kestrel
可以很好的用来为ASP.NET
提供动态内容,然而在Web
服务方面没有IIS、Apache、Nginx这些全功能的服务器完善。我们可以借助一个反向代理服务器接收来自互联网的HTTP请求并在经过一些初步处理(比如请求的缓存和压缩、提供静态内容、SSL Termination)后将其转发给Kestrel
。
在app站点的同级目录,创建nginx文件夹,nginx文件夹内创建nginx.conf和Dockfile两个文件。
$ mkdir nginx
$ cd nignx
$ vi Dockerfile
Dockerfile文件的内容如下:
FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
按【Esc】键,然后输入:wq保存退出。
nginx.conf文件的内容如下:
worker_processes 4; events { worker_connections 1024; } http { sendfile on; upstream app_servers { server app:9001; } server { listen 9001; location / { proxy_pass http://app_servers; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; } } }
【upstream app_servers】配置为 server app:9001,其中app是在docker-compose.yml 文件中指定的服务名称。【proxy_pass】配置为:http://app_servers,【app_servers】为第五行upstream的名字。
4. 编辑Docker-compose.yml
这个文件与app文件夹和nginx文件夹在同级目录下,这个配置指定将启动两个容器,一个是站点app,一个是反向代理proxy。
version: '3.7' services: app: build: context: ./app dockerfile: Dockerfile expose: - "9001" extra_hosts: - "dockerhost:172.22.0.2" environment: TZ: Asia/Shanghai proxy: build: context: ./nginx dockerfile: Dockerfile ports: - "9001:9001" environment: TZ: Asia/Shanghai links: - app
-
对于每个服务,【build】 告诉Docker Compose怎样为每个服务构建镜像
-
【expose】和【ports】控制服务与 network bridge、宿主机交互的方式
-
【links】表明链接另外的容器,意味着nginx启动的时会去启动app服务
version:'3.7',这个是根据docker的版本来确定的:
5.启动docker-compose
路径定位到app9001下,然后使用命令启动docker-compose:$ docker-compose up -d
看到了两个绿色的done,说明我们的配置没有问题,下面访问一下9001端口看一下结果http://172.X.X.X:9001/,可以看到网站可以正常访问了。
6.总结
本文简单实现了通过docker-compose来部署NetCore站点,并使用nginx作为反向代理,希望大家看完本文,可以对容器化部署有一个大概的了解,
如果觉得本文知识点比较多,也有简单的入门级NetCore跨平台文章,可以看下我之前写的:
CentOS直接部署NetCore项目:《DotNet跨平台 - .net core项目部署到centos7》
CentOS通过Docker部署NetCore:《DotNet跨平台 - docker部署.net core2.0项目》