一、下载安装好docker镜像
在线下载mysql8的镜像
docker pull mysql:8.0.21
在线下载 asp.net core的镜像
docker pull mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim
就以上面这两个镜像为例
如果下载镜像过慢,在其他人的电脑上有的话,则可以通过
命令docker save 8aa5a7e8b51a > /root/aspnet.tar
保存到root目录下
其中8aa5a7e8b51a是镜像ID,通过docker images可查看到,如下图
然后拷出来到自己电脑上
然后使用WinSCP等FTP工具将aspnet.tar上传到自己的虚拟机的centos里来
我这里上传到自己的centos的/root目录下
输入cd /root
进入此目录
输入docker load < aspnet.tar
导入镜像
输入docker images
查看镜像ID
输入docker tag 8aa5a7e8b51a mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim
修改为原来的镜像名称和tag名称,其中8aa5a7e8b51a是查出的ID,如下图
二、创建一个asp.net core 3.1的webapi项目testa
去掉HTTPS配置,具体如下图
右键添加一个Dockfile文件
编辑些文件,输入以下代码
#初始化自己命名为base的编译阶段,设置aspnet:3.1-buster-slim为基础镜像,设置阶段名为base
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
#创建项目在docker容器内的工作目录,容器启动时执行的命令会在该目录下执行
#WORKDIR 命令为后续的RUN、CMD、COPY、ADD等命令配置工作目录。设置后,接下来的COPY和ADD命令中的相对路径就是相对于WORKDIR指定的路径
WORKDIR /app
#EXPOSE 是声明运行时容器提供服务端口,将在docker run -p <宿主端口>:<容器端口>时用到
EXPOSE 80
#点并不是指本机目录下的文件,而是 docker引擎中展开的构建上下文中的文件
#即当前执行docker build构建时的所在目录,即在目录testah目录
#将当前上文下的文件复制到容器内的当前目录下
COPY . .
#设置容器启动时入口点程序和程序的参数
ENTRYPOINT ["dotnet", "testa.dll"]
三、制作好初始化数据库sql脚本testdb.sql
drop database if exists testdb;
create database testdb;
USE testdb;
DROP TABLE IF EXISTS user;
CREATE TABLE user (
UserId varchar(36) NOT NULL,
UserName varchar(255) NOT NULL,
UserPwd varchar(255) NULL DEFAULT NULL,
PRIMARY KEY (UserId)
) ;
INSERT INTO user VALUES ('1', 'admin', '123');
四、准备好mysql8.0的配置文件my.cnf
[mysqld]
default-authentication-plugin=mysql_native_password
lower_case_table_names=1
user=mysql
init_connect='SET NAMES utf8'
character-set-server=utf8
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
log-bin-trust-function-creators=1
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
五、WebApi相关代码编写
先下载安装两个连数据库操作必备的nuget包
Microsoft.EntityFrameworkCore
MySql.Data.EntityFrameworkCore
上图中的这7个文件是要修改或添加的文件
appsettings.Development.json
这个是开发时用的配置文件,我配置好mysql连接字符串IP地址为192.168.3.149,端口为8306,用户名root密码abc123
然后是发布后生产时用的配置文件appsettings.json
,这时连接字符串就要注意了
server=test_mysql;port=3306;database=testdb;uid=root;pwd=abc123;sslmode=none
其中test_mysql是约定好将来运行mysql docker容器时用这个名字,容器内端口默认3306不要动
2.然后分别新建这三个类
[Table("user")]
public class User
{
[Key]
public string UserId { get; set; }
public string UserName { get; set; }
public string UserPwd { get; set; }
}
public class TestDbContext: DbContext
{
public TestDbContext(DbContextOptions<TestDbContext> options) : base(options)
{
}
public DbSet<User> Users { get; set; }
}
[ApiController]
[Route("[controller]/[action]")]
public class UserController : ControllerBase
{
private readonly TestDbContext _testDbContext;
public UserController(TestDbContext testDbContext)
{
_testDbContext = testDbContext;
}
[HttpGet]
public IEnumerable<User> GetUsers()
{
return _testDbContext.Users.ToList();
}
}
修改Startup类的这个方法
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
var connectionString = Configuration.GetConnectionString("DefaultConnectionString");
services.AddDbContext<TestDbContext>(options =>
{
options.UseMySQL(connectionString);
});
}
编译项目并发布项目
六、在WIN10本地建好目录结构
将之前publish目录下的文件全选并复制到WebApi目录下。注意Dockfile文件没在发布后的目录里,手动复制过来,或者在发布前设置此文件属性为内容吧。
将之前testdb.sql
放到scripts
目录下。Mysql启动时会自动执行这个。
将之前my.cnf
放到config
目录下。
data目录是mysql存储数据的目录,启动mysql的容器后会看到有很多文件。
七、在win10中通过winSCP等FTP工具将TestAll文件夹上传到centOS里
我这里上传到/root
目录下。注意生产环境要放到数据盘而不是系统盘
。
八、制作webapi镜像
在centOS命令行输入cd /root/TestAll/WebApi
进入此目录
输入docker build -t testapi:1.0 .
制作镜像(注意1.0后面有个空格再有个点)
完成后输入docker images
可看到testapi镜像了。
好了,webapi镜像和之前准备的mysql镜像都有了。
九、启动webapi容器和mysql容器
开放centos的8306端口以供宿主机win10里的Navicate访问mysql8.0
firewall-cmd --zone=public --add-port=8306/tcp --permanent
开放centos的8999端口以供宿主机通过浏览器地址192.168.3.149:8999来访问webapi
firewall-cmd --zone=public --add-port=8999/tcp –permanent
创建一个专用网桥以供webapi和mysql容器互相访问
docker network create --driver bridge testBridge
启动mysql8.0容器,
注意容器名test_mysql和连接字符串的保持一致,
注意MYSQL_ROOT_PASSWORD是abc123也一致
注意src dst路径映射要正确
docker run --name=test_mysql --network=testBridge --restart=always \
-e MYSQL_ROOT_PASSWORD="abc123" \
--mount type=bind,src=/root/TestAll/MySql/config/my.cnf,dst=/etc/my.cnf \
--mount type=bind,src=/root/TestAll/MySql/data,dst=/var/lib/mysql \
--mount type=bind,src=/root/TestAll/MySql/scripts,dst=/docker-entrypoint-initdb.d \
-d -p 8306:3306 mysql:8.0.21
启动webapi容器
docker run --name=test_webapi --network=testBridge --restart=always \ -d -p 8999:80 testapi:1.0
输入docker ps查看容器情况,如下图就表示容器运行成功了,状态和端口号都OK了
在win10的浏览器中访问,如下图就成功了
使用navicate工连接数据库192.168.3.149:8306,如下图
关闭mysql的8306端口,除非开发要用navicate连接测试,否则不要暴露。
firewall-cmd --zone=public --remove-port=8306/tcp –permanent
最后重启CentOS后,再在win10的浏览器中访问webapi也是可以的,就OK了。
十、制作离线安装包和脚本
十一、制作在线安装包和脚本并将镜像上传到阿里个人镜像仓库
篇幅太长了,再新起一篇,https://blog.csdn.net/junshangshui/article/details/107476271