上两节我们通过简单的demo学习了docker的基本操作。这一节我们来一个进阶学习,完成ASP.NET Core + MySql + Nginx的容器化部署。
本文是基于CentOS 7.4环境进行演示,示例项目可以访问*\Docker.NetCore.MySql*进行下载。
同样我们还是以循序渐进的方式来展开。首先来基于Docker来试玩一下MySQL。
2.1. 创建MySql实例
1 | 复制代码//拉取mysql镜像 |
下面我们直接在容器中连接到我们刚刚创建的mysql数据库:
1 | 复制代码$ docker exec -it hello.mysql \ |
2.2. 挂载数据卷
上面创建的mysql实例其数据都在容器内部存储,这样就暴露了一个问题,如果容器销毁,那么对应的数据库数据就会丢失。那如何持久化存储容器内数据呢?我们可以通过挂载数据卷的方式来解决这一问题。
1 | 复制代码//创建数据卷 |
上面是使用使用了docker volume create
命令创建了一个数据卷,当然我们也可以自行挂载某个目录作为数据卷。
为了演示方便,我准备了一个ASP.NET Core+EFCore+MySql的示例项目。其结构如下所示:
是基于.NET Core Mvc模板项目,其中定义了一个Product
实体,并通过ProductsController
暴露WebApi接口。核心代码如下:
Product实体类:
1 | 复制代码public class Product |
DbContext类:
1 | 复制代码public class MySqlDbContext : DbContext |
数据库初始化类:
1 | 复制代码public class DbInitializer |
该数据库初始化类会在项目启动时运行。详细代码可参考**Docker.NetCore.MySql**。
4.1 安装Git并Clone示例项目
1 | 复制代码$ yum install git |
4.2. 构建镜像
细心的你会发现,项目中已经定义了Dockerfile,所以我们可以直接使用docker build
构建镜像。
1 | 复制代码# cd Docker.NetCore.MySql |
4.3. 启动镜像并连接到指定数据库
docker提供了--link
参数用于在容器之间建立连接。下面我们实例化创建的镜像docker.netcore.mysql
并命名容器名为hello.netcore.mysql
,并使用–link参数与我们文章开头建立的hello.mysql
容器建立连接。
1 | 复制代码# docker run --name hello.netcore.mysql --link hello.mysql:db -d -p 5000:5000 |
这里需要特别注意一下
--link=hello.mysql:db
,这个参数就是告诉Docker容器需要使用hello.mysql
容器,并将其别名命名为db,这样在hello.netcore.mysql
这个容器中就可以使用db来作为提供mysql数据库服务的服务器。这也就是为什么我们.NET Core项目中连接字符串设置为server=db;
的原因。"ConnectionStrings": { "MySql": "server=db;database=MySqlDbContext;uid=root;pwd=123456;" }
1 | 复制代码//查看运行中容器列表 |
从上图可知,我们完成了.NET Core与MySql的连接。
结合上一篇文章.NET Core容器化之多容器应用部署@Docker-Compose,我们来使用docker-compose完成asp.net core + mysql + nginx的多容器部署。
5.1. 定义 docker-compose.yml
1 | 复制代码version: '2' |
其中定义了三个服务:
- db:使用mysql镜像,并挂载当前项目下的mysql文件夹来持久化存储。
- web:基于当前项目构建的容器服务,依赖于db服务。
- reverse-proxy:使用nginx定义反向代理服务,其中挂载了当前项目下的proxy.conf文件作为反向代理配置文件。其中proxy.conf的配置如下(注意proxy_pass指定的url为http://web:5000):
1 | 复制代码server { |
5.2. 启动Compose
在启动Compose之前,建议清空上面创建的容器。也可以使用docker rm $(docker ps -qa)
清除所有容器。
1 | 复制代码//启动compose |
上面的运行结果显示,我们已经成功完成了ASP.NET Core+MySql+Nginx的多容器应用部署。通过浏览器访问http:<ipaddress>:9090/api/products
即可访问我们暴露的api。
5.3. 数据库验证
我们来验证一下数据库是否成功创建:
1 | 复制代码[root@iZ288a3qazlZ Docker.NetCore.MySql]# ls mysql |
从上面的运行结果可知,我们成功将项目文件夹下的mysql文件夹挂载到容器内部进行数据持久化。
本文通过先介绍如何基于Docker实例化MySQL容器,再介绍如何通过挂载数据卷来持久化MySQL数据,以及如何使用–Link参数进行容器之间的连接,完成了.NET Core连接MySQL数据库。
最后,使用Docker-Compose综合ASP.NET Core+MySQL+Nginx完成了容器化部署。
下一节我们来介绍下如何使用Docker-Swarm进行集群部署。
本文转载自: 掘金