.NET Core+MySql+Nginx 容器化部署
.NET Core+MySql+Nginx 容器化部署
1. 引言
上两节我们通过简单的demo学习了docker的基本操作。这一节我们来一个进阶学习,完成ASP.NET Core + MySql + Nginx的容器化部署。
本文是基于CentOS 7.4环境进行演示,示例项目可以访问Docker.NetCore.MySql进行下载。
2. Hello MySQL
同样我们还是以循序渐进的方式来展开。首先来基于Docker来试玩一下MySQL。
2.1. 创建MySql实例
注:如果linux系统之前已经安装过mysql了,这里的 -p 3306:3306就不要用3306端口了,不然本机是能通,但远程连的时候就出岔子了,搞了半天报错:
Access denied for user 'root'@'
就是连不上,后来发现之前系统上面已经安装过mysql,停止服务时,用service mysqld stop都不行,原来安装的是mariadb,用下面命令禁止启动:
systemctl stop mariadb.service #停止MariaDB
systemctl disable mariadb.service #设置开机启动
一定要加上参数-p 3306:3306,这样端口是0.0.0.0:3306->3306/tcp就表示绑定成功,不用做多余设置,远程直接可以连接mysql
[[email protected] ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 18858ef84b82 mysql:5.6 "docker-entrypoint..." 9 seconds ago Up 8 seconds 0.0.0.0:3306->3306/tcp hello.mysql e19e2dc74ffa mycore "dotnet MyApi.dll" 2 hours ago Up 6 minutes 8080/tcp, 0.0.0.0:5002->80/tcp hello.netcore.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 -p 3306:3306 -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项目
4. 基于示例项目进行实操演练
这里略过,查看之前的随笔
4.3. 启动镜像并连接到指定数据库
docker提供了--link
参数用于在容器之间建立连接。下面我们实例化创建的镜像docker.netcore.mysql
并命名容器名为hello.netcore.mysql
,并使用--link参数与我们文章开头建立的hello.mysql
容器建立连接。
docker run --name hello.netcore.mysql --link hello.mysql:db -d -p 5002:80 mycore
--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;" }
[[email protected] tmp]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e19e2dc74ffa mycore "dotnet MyApi.dll" 20 minutes ago Up 20 minutes 8080/tcp, 0.0.0.0:5002->80/tcp hello.netcore.mysql 1c00e198b2e6 mycore "dotnet MyApi.dll" 23 minutes ago Up 22 minutes 8080/tcp, 0.0.0.0:5001->80/tcp mycore fc19cb375752 mysql:5.6 "docker-entrypoint..." 42 minutes ago Up 42 minutes 3306/tcp hello.mysql [[email protected] tmp]# curl http://192.168.1.120:5002/api/user [{"id":1,"nickName":"ss","email":"ddd"}][[email protected] tmp]#
如上,访问http://192.168.1.120:5002/api/user可以看到mysql数据库连接成功,并且自动创建好了库和表