centos7中docker制作并运行asp.net core webapi镜像并且和mysql容器互访

一、下载安装好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,如下图
centos7中docker制作并运行asp.net core webapi镜像并且和mysql容器互访_第1张图片
二、创建一个asp.net core 3.1的webapi项目testa
去掉HTTPS配置,具体如下图
centos7中docker制作并运行asp.net core webapi镜像并且和mysql容器互访_第2张图片
右键添加一个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
centos7中docker制作并运行asp.net core webapi镜像并且和mysql容器互访_第3张图片
上图中的这7个文件是要修改或添加的文件
appsettings.Development.json这个是开发时用的配置文件,我配置好mysql连接字符串IP地址为192.168.3.149,端口为8306,用户名root密码abc123
centos7中docker制作并运行asp.net core webapi镜像并且和mysql容器互访_第4张图片
然后是发布后生产时用的配置文件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);
            });
        }

编译项目并发布项目
centos7中docker制作并运行asp.net core webapi镜像并且和mysql容器互访_第5张图片
六、在WIN10本地建好目录结构
centos7中docker制作并运行asp.net core webapi镜像并且和mysql容器互访_第6张图片
将之前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了
centos7中docker制作并运行asp.net core webapi镜像并且和mysql容器互访_第7张图片
在win10的浏览器中访问,如下图就成功了
在这里插入图片描述
使用navicate工连接数据库192.168.3.149:8306,如下图
centos7中docker制作并运行asp.net core webapi镜像并且和mysql容器互访_第8张图片
关闭mysql的8306端口,除非开发要用navicate连接测试,否则不要暴露。
firewall-cmd --zone=public --remove-port=8306/tcp –permanent

最后重启CentOS后,再在win10的浏览器中访问webapi也是可以的,就OK了。

十、制作离线安装包和脚本
十一、制作在线安装包和脚本并将镜像上传到阿里个人镜像仓库
篇幅太长了,再新起一篇,https://blog.csdn.net/junshangshui/article/details/107476271

你可能感兴趣的:(docker)