docker-compose .netcoreapi、mysql、nginx多容器部署

摘要:
3、 修改netcoreapiSeedData代码并通过添加错误重试,直到MySQL容器成功启动。

前言:

​ 基于上一篇.NetCoreApi容器与MySql容器互联,此处利用docker-compose来快速配置启动mysql容器与.NetCoreApi容器。

注意:

​ docker-compose.yml的编写缩进不要用tab,要直接用空格(坑了我很久。。。)

一、编写docker-compose.yml文件

version: "3"
services:
  
  #mysql容器配置
  db:
    image: mysql/mysql-server  #使用镜像
    command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci  #相当于dockerfile中my.cnf中的配置,要以mysqld开头,否则不会生效
    container_name: db  #mysql容器名称 此处很关键,要与Web应用中连接字符串server保持一致(上面的db是只是services的名称)             
    restart: always
    ports:
      - "3306:3306"
    environment:
      - MYSQL_PASSWORD=password
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_USER=lzl
    volumes:  #数据库初始化sql脚本目录映射  本机目录:容器目录(按照官方的来) mysql启动的时候执行该脚本
      - C:/Users/Luo/source/repos/Api/Api/MySql-InitScript:/docker-entrypoint-initdb.d/
      
  #web应用配置
  web:
    build: .  #利用web应用的dockerfile来构建容器。 .为dockerfile所在的目录 
    container_name: "aspnetcoreapi"  #容器名
    ports:
      - "8004:3827"
    depends_on:  #web应用依赖于mysql容器,此处设置让mysql容器先启动,再让web容器再启动。(注意:并不会等待mysql容器完全启动)
      - db

二、初始化sql脚本(C:/Users/Luo/source/repos/Api/Api/MySql-InitScript)

#给用户授权(用于创建数据库以及数据表)
GRANT ALL PRIVILEGES ON *.* TO 'lzl'@'%' WITH GRANT OPTION;

#改变密码的加密方式(旧版本的navicat客户端不支持新版本mysql的密码加密方式,因此切换为原来的加密方式,否则连接不上mysql)
alter user 'lzl'@'%' identified with mysql_native_password by 'password';

注意:

​ 在映射初始化sql脚本的时候,启动的时候会提示驱动未共享。image-20200111200053441

​ 解决:

​ 右键docker for windows->settings->Shared Drives 勾选对应的盘符即可。

三、修改netcoreapi SeedData代码(由于mysql容器启动较慢,api启动较快,因此会报错连接不到mysql)

通过加入错误重试,直到mysql容器启动成功。

public void InitialDataBase(IApplicationBuilder app,int? retry=0)
        {
            var retryTimes = retry.Value;
            using (var scope = app.ApplicationServices.CreateScope())
            {
                try
                {
                    var context = scope.ServiceProvider.GetRequiredService<UserContext>();
                    context.Database.Migrate();
                    if (!context.Users.Any())
                    {
                        context.Users.Add(new User()
                        {
                            Company = "kingdee",
                            Name = "LZL",
                            Title = "2020",
                            Id = 1
                        });
                        context.SaveChanges();
                    }
                }
                catch (Exception ex)
                {
                    retryTimes ++;
                    if(retryTimes<10)
                    {
                        InitialDataBase(app, retryTimes);
                    }

                }
            }
        }

四、启动容器编排

依次执行以下命令启动:

1、构建docker-compose中的镜像
docker-compose build

查看构建的两个镜像

docker ps 

image-20200111204937419

2、启动docker-compose
docker-compose up
3、查看容器运行情况
docker-compose ps

image-20200111201029864

4、访问http://localhost:8004/User/Get

image-20200111204553897

PS:启动后连接不上mysql容器的话,试着重新启动以下web应用(docker restart aspnetcoreapi)。如果重启后能够访问,加大SeedData的容错次数即可。

五、.netcore、mysql、nginx多容器部署

加入nginx反向代理,修改docker-compose.yml以及加入proxy.conf配置文件。

1、修改docker-compose.ym
version: "3"
services:
  #mysql容器配置
  db:
    image: mysql/mysql-server  #使用镜像
    command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci  #相当于dockerfile中my.cnf中的配置,要以mysqld开头,否则不会生效
    container_name: db  #mysql容器名称 此处很关键,要与Web应用中连接字符串server保持一致(上面的db是只是services的名称)             
    restart: always
    ports:
      - "3306:3306"
    environment:
      - MYSQL_PASSWORD=password
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_USER=lzl
    volumes:  #数据库初始化sql脚本目录映射  本机目录:容器目录(按照官方的来) mysql启动的时候执行该脚本
      - ./MySql-InitScript:/docker-entrypoint-initdb.d/
      
  #web应用配置
  web:
    build: .  #利用web应用的dockerfile来构建容器。 .为dockerfile所在的目录 
    container_name: "aspnetcoreapi"  #容器名
    #ports:
    #  - "8004:3827"  #加入nginx后不需要在此处指定web的访问端口
    depends_on:  #web应用依赖于mysql容器,此处设置让mysql容器先启动,再让web容器再启动。(注意:并不会等待mysql容器完全启动)
      - db
  reverse-proxy:
    container_name: api.proxy
    image: nginx
    depends_on:
      - web
    ports:
      - "9090:8080"
    volumes:
      - ./proxy.conf:/etc/nginx/conf.d/default.conf
2、新增nginx配置文件 proxy.conf
server {
    listen 8080;

    location / {
        proxy_pass http://web:3827;#ip地址要与docker-compose.yml中web容器的名称一致
    }
}

注意:该文件最好不要用window的notepad编写,会因为编码的问题导致配置失效。

3、启动容器编排
docker-compose up -d
4、访问地址测试

http://localhost:9090/User/Get

image-20200120142541458

nginx成功转发到配置的api地址。

免责声明:文章转载自《docker-compose .netcoreapi、mysql、nginx多容器部署》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇镜像的各种版本区别简单爬虫,突破IP访问限制和复杂验证码,小总结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

windows下mysql数据库表名大小写不敏感

  最近新入职,领导让做个小功能先练练手。是一个添加分类的功能,有添加和列表,很简单。功能做完后提交,结果在线上出现一个大大的500。   但是我再本地环境下是正常的,我以为可能是php的版本不一致导致的问题,就仔细看代码,看看有没有什么不合理的地方,然后在提交,还是500。然后又看,又提,依然是500。很不解啊,只有问领导了,领导说,是线上mysql字段...

navicat for mysql 进行数据传输

完成不同数据库之间的数据库表传输 把一个数据库表由一个数据库中复制到另一个数据库表中,可以使用heidisql 或 navicat for mysql,先将数据库表从一个数据库会话导出,然后会话连接相应库进行导入,类似一个备份的操作,但这样操作繁琐。navicat for mysql具备数据传输功能,直接将一个数据库的数据库表,复制到另一个数据库中。 1....

hive权威安装出现的不解错误!(完美解决)两种方法都可以

   以下两种方法都可以,推荐用方法一! 如果有误,请见博客 MySQL用户权限(Host,User,Password)管理(mysql.user)   可以自己去增加和删除用户。别怕,zhouls! 方法一:   步骤一: yum -y install mysql-server   步骤二:service mysqld start   步骤三:my...

Linux配置 依赖安装

基础知识: 1 OS Operation System 作用:控制硬件,服务软件 2 VMware虚拟机: 虚拟出一台计算机环境 配置两个虚拟网卡,适配器里查看 3 在虚拟机上安装操作系统Linux 4 Linux版本: 版本:内核版本,发行版本(各个公司对其优化) 5 目录介绍 root:系统管理员登录的默认目录 home:其他用户进来的默认目录 usr...

prometheus监控多个MySQL实例

添加MySQL监控 添加MySQL监控主机,这里以添加10.10.20.14为例进行说明。解压exporter压缩包。 [root@localhost ~]# tar xf mysqld_exporter-0.10.0.linux-amd64.tar [root@localhost ~]# mv mysqld_exporter-0.10.0.linux-...

41.配置完善爬虫代码文件及图片下载文件重命名问题-2

解决图片下载重命名保存本地,直接上代码(在原来代码做了一定的修改)。总结:主要就是添加配置一个内置的函数,对保存的东西进行修改再存储,主要问题还是再piplines的设置里面。效果如图: hm5988.py #-*- coding: utf-8 -*- importscrapy from hm5988_web.items importHm5988We...