.NET Core+MySql+Nginx 容器化部署
.NET Core容器化@Docker
.NET Core容器化之多容器應用部署@Docker-Compose
.NET Core+MySql+Nginx 容器化部署
GitHub-Demo:Docker.NetCore.MySql
1. 引言
上兩節我們通過簡單的demo學習了docker的基本操作。這一節我們來一個進階學習,完成ASP.NET Core + MySql + Nginx的容器化部署。
本文是基于CentOS 7.4環境進行演示,示例項目可以訪問Docker.NetCore.MySql進行下載。
2. Hello MySQL
同樣我們還是以循序漸進的方式來展開。首先來基于Docker來試玩一下MySQL。
2.1. 創建MySql實例
//拉取mysql鏡像docker pull mysql $ docker images$ REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/mysql latest 7d83a47ab2d2 13 days ago 408.2 MB //創建一個mysql實例 $ docker run --name hello.mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e21bbd84e0b5 mysql "docker-entrypoint.sh" 3 minutes ago Up 3 minutes 3306/tcp hello.mysql下面我們直接在容器中連接到我們剛剛創建的mysql數據庫:
$ docker exec -it hello.mysql \ > mysql -uroot -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 5.7.20 MySQL Community Server (GPL)Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec)2.2. 掛載數據卷
上面創建的mysql實例其數據都在容器內部存儲,這樣就暴露了一個問題,如果容器銷毀,那么對應的數據庫數據就會丟失。那如何持久化存儲容器內數據呢?我們可以通過掛載數據卷的方式來解決這一問題。
//創建數據卷 $ docker volume create --name hello.db hello.db //查看數據卷信息 $ docker volume inspect hello.db [{"Name": "hello.db","Driver": "local","Mountpoint": "/var/lib/docker/volumes/hello.db/_data","Labels": {},"Scope": "local"} ] // 掛載數據卷啟動MySql實例 $ docker run --name hello.mysql \ > -v hello.db:/var/lib/mysql \ > -e MYSQL_ROOT_PASSWORD=123456 -d mysql上面是使用使用了docker volume create命令創建了一個數據卷,當然我們也可以自行掛載某個目錄作為數據卷。
3. 準備.NET Core+EFCore+MySql項目
為了演示方便,我準備了一個ASP.NET Core+EFCore+MySql的示例項目。其結構如下所示:
是基于.NET Core Mvc模板項目,其中定義了一個Product實體,并通過ProductsController暴露WebApi接口。核心代碼如下:
Product實體類:
public class Product {public int ProductId { get; set; }public string Name { get; set; }public decimal Price { get; set; }public int StockQty { get; set; } }DbContext類:
public class MySqlDbContext : DbContext {public MySqlDbContext (DbContextOptions<MySqlDbContext> options): base(options){}public DbSet<Product> Products { get; set; } }數據庫初始化類:
public class DbInitializer {public static void Initialize(MySqlDbContext context){context.Database.EnsureCreated();if (context.Products.Any()){return;}var products = new Product[]{new Product{Name="iphone 6",Price=5000,StockQty=10 },new Product{Name="iphone 7",Price=6000,StockQty=10 },new Product{Name="iphone 7 plus",Price=7000,StockQty=10 },new Product{Name="iphone x",Price=8000,StockQty=10 }};context.Products.AddRange(products);context.SaveChanges();} }該數據庫初始化類會在項目啟動時運行。詳細代碼可參考Docker.NetCore.MySql。
4. 基于示例項目進行實操演練
4.1 安裝Git并Clone示例項目
$ yum install git $ git --version git version 1.8.3.1 $ cd ~/demo $ git clone https://github.com/yanshengjie/Docker.NetCore.MySql.git Cloning into 'Docker.NetCore.MySql'... remote: Counting objects: 155, done. remote: Compressing objects: 100% (125/125), done. remote: Total 155 (delta 42), reused 123 (delta 25), pack-reused 0 Receiving objects: 100% (155/155), 534.30 KiB | 333.00 KiB/s, done. Resolving deltas: 100% (42/42), done.4.2. 構建鏡像
細心的你會發現,項目中已經定義了Dockerfile,所以我們可以直接使用docker build構建鏡像。
# cd Docker.NetCore.MySql [root@iZ288a3qazlZ Docker.NetCore.MySql]# ls appsettings.Development.json docker-compose.yml Program.cs Views appsettings.json Dockerfile proxy.conf wwwroot bundleconfig.json Docker.NetCore.MySql.csproj README.md Controllers LICENSE ScaffoldingReadMe.txt Data Models Startup.cs //構建鏡像 # docker build -t docker.netcore.mysql . Sending build context to Docker daemon 3.045 MB Step 1 : FROM microsoft/dotnet:latest---> 7d4dc5c258eb Step 2 : WORKDIR /app---> Using cache---> 98d48a4e278c Step 3 : COPY . /app---> 6b1bf8bb5261 Removing intermediate container b86460477977 Step 4 : RUN dotnet restore---> Running in 4e0a46f762bbRestoring packages for /app/Docker.NetCore.MySql.csproj...Installing Microsoft.CodeAnalysis.Razor 2.0.0......Restore completed in 216.83 ms for /app/Docker.NetCore.MySql.csproj.---> 4df70c77916e Removing intermediate container 4e0a46f762bb Step 5 : EXPOSE 5000---> Running in 11b421b3bd3e---> 3506253060fe Removing intermediate container 11b421b3bd3e Step 6 : ENV ASPNETCORE_URLS http://*:5000---> Running in 201aabbab72c---> 7f29963a8d96 Removing intermediate container 201aabbab72c Step 7 : ENTRYPOINT dotnet run---> Running in c79f73cba162---> 9d1fb6ee46cb Removing intermediate container c79f73cba162 Successfully built 9d1fb6ee46cb [root@iZ288a3qazlZ Docker.NetCore.MySql]# docker images docker.netcore.mysql REPOSITORY TAG IMAGE ID CREATED SIZE docker.netcore.mysql latest 9d1fb6ee46cb 13 seconds ago 1.756 GB4.3. 啟動鏡像并連接到指定數據庫
docker提供了--link參數用于在容器之間建立連接。下面我們實例化創建的鏡像docker.netcore.mysql并命名容器名為hello.netcore.mysql,并使用--link參數與我們文章開頭建立的hello.mysql容器建立連接。
# docker run --name hello.netcore.mysql --link hello.mysql:db -d -p 5000:5000 docker.netcore.mysql這里需要特別注意一下--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;" }
從上圖可知,我們完成了.NET Core與MySql的連接。
5. ASP.NET Core + MySql + Nginx
結合上一篇文章.NET Core容器化之多容器應用部署@Docker-Compose,我們來使用docker-compose完成asp.net core + mysql + nginx的多容器部署。
5.1. 定義 docker-compose.yml
version: '2' services:db:container_name: hello.dbenvironment:MYSQL_ROOT_PASSWORD: 123456volumes:- ./mysql:/var/lib/mysqlweb:container_name: hello.webbuild: .depends_on:- dblinks:- dbreverse-proxy:container_name: hello.proxyimage: nginxdepends_on:- webports:- "9090:8080"volumes:- ./proxy.conf:/etc/nginx/conf.d/default.conf其中定義了三個服務:
5.2. 啟動Compose
在啟動Compose之前,建議清空上面創建的容器。也可以使用docker rm $(docker ps -qa)清除所有容器。
//啟動compose [root@iZ288a3qazlZ Docker.NetCore.MySql]# docker-compose up -d Creating network "dockernetcoremysql_default" with the default driver Building web Step 1 : FROM microsoft/dotnet:latest---> 7d4dc5c258eb Step 2 : WORKDIR /app---> Using cache---> 98d48a4e278c Step 3 : COPY . /app---> d41b32323c0f Removing intermediate container 1259f5fb82bc Step 4 : RUN dotnet restore---> Running in d482e355de77Restoring packages for /app/Docker.NetCore.MySql.csproj...Installing Microsoft.CodeAnalysis.Razor 2.0.0......Restore completed in 216.83 ms for /app/Docker.NetCore.MySql.csproj.---> a0658008f161 Removing intermediate container d482e355de77 Step 5 : EXPOSE 5000---> Running in dc6eeb29fd5e---> a419314ece08 Removing intermediate container dc6eeb29fd5e Step 6 : ENV ASPNETCORE_URLS http://*:5000---> Running in c1d1474b14a0---> 9cc13c549042 Removing intermediate container c1d1474b14a0 Step 7 : ENTRYPOINT dotnet run---> Running in efdf0e857a84---> 830ac11428cf Removing intermediate container efdf0e857a84 Successfully built 830ac11428cf Creating hello.db ... done Creating hello.web ... done Creating hello.proxy ... done Creating hello.web ... Creating hello.proxy ... [root@iZ288a3qazlZ Docker.NetCore.MySql]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6253bf85682e nginx "nginx -g 'daemon off" 33 seconds ago Up 28 seconds 80/tcp, 0.0.0.0:9090->8080/tcp hello.proxy ea553a9e22f2 dockernetcoremysql_web "dotnet run" 37 seconds ago Up 32 seconds 5000/tcp hello.web a1f5aa981bfb mysql "docker-entrypoint.sh" 38 seconds ago Up 36 seconds 3306/tcp hello.db [root@iZ288a3qazlZ Docker.NetCore.MySql]# docker-compose psName Command State Ports ---------------------------------------------------------------------------------- hello.db docker-entrypoint.sh mysqld Up 3306/tcp hello.proxy nginx -g daemon off; Up 80/tcp, 0.0.0.0:9090->8080/tcp hello.web dotnet run Up 5000/tcp [root@iZ288a3qazlZ Docker.NetCore.MySql]# curl http://localhost:9090/api/products [{"productId":1,"name":"iphone 6","price":5000.0000000000000000000000000,"stockQty":10},{"productId":2,"name":"iphone 7","price":6000.0000000000000000000000000,"stockQty":10},{"productId":3,"name":"iphone 7 plus","price":7000.0000000000000000000000000,"stockQty":10},{"productId":4,"name":"iphone x","price":8000.000000000000000000000000,"stockQty":10}]上面的運行結果顯示,我們已經成功完成了ASP.NET Core+MySql+Nginx的多容器應用部署。通過瀏覽器訪問http:<ipaddress>:9090/api/products即可訪問我們暴露的api。
5.3. 數據庫驗證
我們來驗證一下數據庫是否成功創建:
[root@iZ288a3qazlZ Docker.NetCore.MySql]# ls mysql auto.cnf client-key.pem ib_logfile0 performance_schema server-key.pem ca-key.pem MySqlDbContext ib_logfile1 private_key.pem sys ca.pem ib_buffer_pool ibtmp1 public_key.pem client-cert.pem ibdata1 mysql server-cert.pem [root@iZ288a3qazlZ Docker.NetCore.MySql]# docker exec -it hello.db mysql -uroot -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 5.7.20 MySQL Community Server (GPL)Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +-----------------------+ | Database | +-----------------------+ | information_schema | | MySqlDbContext | | mysql | | performance_schema | | sys | +-----------------------+ 5 rows in set (0.00 sec)mysql> use MySqlDbContext; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -ADatabase changed mysql> show tables; +---------------------------------+ | Tables_in_MySqlDbContext | +---------------------------------+ | Products | +---------------------------------+ 1 row in set (0.00 sec)mysql> select * from Products; +-----------+---------------+-------------------------------------+----------+ | ProductId | Name | Price | StockQty | +-----------+---------------+-------------------------------------+----------+ | 1 | iphone 6 | 5000.000000000000000000000000000000 | 10 | | 2 | iphone 7 | 6000.000000000000000000000000000000 | 10 | | 3 | iphone 7 plus | 7000.000000000000000000000000000000 | 10 | | 4 | iphone x | 8000.000000000000000000000000000000 | 10 | +-----------+---------------+-------------------------------------+----------+ 4 rows in set (0.00 sec)從上面的運行結果可知,我們成功將項目文件夾下的mysql文件夾掛載到容器內部進行數據持久化。
6. 最后
本文通過先介紹如何基于Docker實例化MySQL容器,再介紹如何通過掛載數據卷來持久化MySQL數據,以及如何使用--Link參數進行容器之間的連接,完成了.NET?Core連接MySQL數據庫。
最后,使用Docker-Compose綜合ASP.NET?Core+MySQL+Nginx完成了容器化部署。
下一節我們來介紹下如何使用Docker-Swarm進行集群部署。
7. 參考資料
mysql -Docker Documentation
Hello Docker
.NET Core容器化@Docker
.NET Core容器化之多容器應用部署@Docker-Compose
總結
以上是生活随笔為你收集整理的.NET Core+MySql+Nginx 容器化部署的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对 Strong-Weak Dance的
- 下一篇: 9.6Gbps WiFi联盟宣布802.