GVKun编程网logo

Docker 学习之 mysql 与 redis(二)(docker和mysql)

12

如果您对Docker学习之mysql与redis和二感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解Docker学习之mysql与redis的各种细节,并对二进行深入的分析,此外还有关于.NET

如果您对Docker 学习之 mysql 与 redis感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解Docker 学习之 mysql 与 redis的各种细节,并对进行深入的分析,此外还有关于.NET 6 + EF Core + MySQL + Docker + Identity +MVC 学习笔记 (二)、02.docker安装mysql,redis,nacos、Canal1.1.4使用RocketMQ同步MySQL到Redis(二)、centos 安装docker mysql redis 及配置的实用技巧。

本文目录一览:

Docker 学习之 mysql 与 redis(二)(docker和mysql)

Docker 学习之 mysql 与 redis(二)(docker和mysql)

在上一随笔中主要就是记录 docker 的基本使用以及 nginx 与 php 服务器的配置:在这一章将主要记录 docker 安装 mysql 与 redis。

本节随笔参考网址:https://www.runoob.com/docker/docker-install-redis.html

一。docker 安装 mysql

1.1 搜索 mysql

docker search mysql

 

 

1.2 拉取 mysql

docker pull mysql:5.7

 

1.3 查看 mysql 镜像文件

docker images mysql

 

 

1.4 映射配置文件

1.4.1 随便运行一个 mysql 容器

# 全命令
docker run -d -P --name mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

# 命令解析
docker run 
  -d # 后台运行
  -P # 自动分配映射IP
  --name mysql # 重命名
  -e MYSQL_ROOT_PASSWORD=123456 # 初始化密码,用于登录mysql数据库
  mysql:5.7  # 所要运行的容器及版本

 

 

1.4.2 复制出 mysql 的配置文件和日志文件以及 mysql 的数据

首先在本地创建相应的文件夹,如下图:

 

 复制文件到本地文件夹中

docker cp mysql:/var/log/mysql E:\docker\mysql\logs
docker cp mysql:/etc/mysql E:\docker\mysql\conf
docker cp mysql:/var/lib/mysql E:\docker\mysql\data

复制出来一般都是一个文件夹,我们需要将文件夹中的文件全部都复制出来,然后放到文件夹外面来,并且删除文件夹

 

1.4.4 强制删除容器

# 方式一:强制删除(可以将正在运行中的容器删除)
docker rm -f mysql

# 方式二:先停止容器,再删除容器
docker stop mysql
docker rm mysql

 

 

1.5 运行 mysql 容器

# 全命令
docker run -d -v E:\docker\mysql\conf:/etc/mysql -v E:\docker\mysql\data:/var/lib/mysql -v E:\docker\mysql\logs:/var/log/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7

# 命令解析
docker run 
  -d   # 后台运行
  -v E:\docker\mysql\conf:/etc/mysql   # 映射MySQL配置文件位置
  -v E:\docker\mysql\data:/var/lib/mysql # 映射MySQL数据存储文件位置
  -v E:\docker\mysql\logs:/var/log/mysql # 映射MySQL日志文件位置
  -p 3306:3306   # 映射文件端口号
  -e MYSQL_ROOT_PASSWORD=123456 # 初始化数据库密码
  --name mysql mysql:5.7  # 重命名

# 查看运行的容器
docker ps

 

 

1.6 本地连接测试

 

 二。docker 安装 redis

2.1 搜索 redis

docker search redis

 

 

 

2.2 拉取 redis

docker pull redis:3.2

 

 

 

2.3 映射文件

2.3.1 创建临时 redis 容器

# 全命令
docker run -d -p 6379:6379 redis:3.2 redis-server --appendonly yes

# 命令分析
docker run 
  -d # 后台运行
  -p 6379:6379  # 端口映射
  redis:3.2   # 运行容器及版本
  redis-server  # 在容器执行redis服务端启动命令
  --appendonly yes  # 打开redis持久化配置 

 

 

2.3.2 复制映射文件到本地

docker cp c673d3579d7b:/data E:\docker\redis\data

 

 

2.3.3 删除临时容器

docker rm -f redis

 

 

2.4 运行最终 redis 容器

docker run -d -p 6379:6379 -v E:\docker\redis\data:/data --name redis redis:3.2 redis-server --appendonly yes

docker run
  -d   # 后台运行
  -p 6379:6379   # 端口映射
  -v E:\docker\redis\data:/data   # 文件映射
  --name redis redis:3.2     # 容器重命名
  redis-server --appendonly yes  # 在容器执行redis-server启动命令,并打开redis持久化配置

  

2.5 测试

docker exec -it de985131953b redis-cli

info

 

 

到此基本上所已经了解了 docker 的基本运用,常用的拉取镜像,根据镜像创建容器,运行容器,将容器中的配置文件映射到本地等这些都基本包含了,后面将不再记录 docker 拉取镜像。进一步记录 docker 的镜像导入导出,推送到阿里云服务,从阿里云服务器中拉取镜像。

.NET 6 + EF Core + MySQL + Docker + Identity +MVC 学习笔记 (二)

.NET 6 + EF Core + MySQL + Docker + Identity +MVC 学习笔记 (二)

环境准备:

1、VS 2022 免费社区版

开工: 先实现 EF Core + MysqL + Identity

创建新项目 -> ASP.NET Core Web 应用 (MVC)

 

 

 

可以先不勾选Docker,后面再加,但是要用Identity 就需要勾上 配置HTTPS , 并选择身份验证类型为: 个人账户

 

 

 

 

 

默认情况下,是连接的本地sqlite数据库;

通过NuGet 安装 Pomelo.EntityFrameworkCore.MysqL

 

 

 修改 appsettings.json中 DefaultConnection 字符串,指向 Azure MysqL 

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=xxxxxdb.MysqL.database.chinacloudapi.cn; Port=3306; Database={your_database}; Uid=dbadmin@xxxxxdb; Pwd={your_password}; SslMode=Preferred;"
  },
  "Logging": {
    "LogLevel": {
      "Default": "information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}

修改 Program.cs中 builder.Services.AddDbContext ,如下红色字部分:

builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseMysqL(connectionString, new MysqLServerVersion(new Version(5, 7, 19))));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

准备开始数据库迁移,先进行一次编译,按F6 进行编译;

删除原先的 Migrations 目录:

 

 再用MysqL Workbench客户端先连上Azure MysqL 数据库看是空了,没有一个表:

 

 最后通过 程序包管理器控制台 来生成数据库迁移 及 执行数据库迁移:

 

 

 

 再通过MysqL Workbench客户端刷新后看看:

 

 至此,Identity默认格式的  role 、user 等基础表就创建好了;

跑起来看一下:

 

点右上角Register 按钮: 输入email和两次密码:

 

 进入Confirm页面,点击 Click here to confirm your account:

email确认页面,这个页面是个壳子,以后根据需要可以完善,用户注册后,需要通过邮箱里收到的号码进行确认:

 

 以上结束后,点右上角Login,试着 登录看一下:

 

 

 完美,爱死 Identity了,一句代码不写,一个基本应用的用户注册就搭好了:

 

 

用MysqL客户端看下数据库User表:

 

02.docker安装mysql,redis,nacos

02.docker安装mysql,redis,nacos

安装好docker后,在docker上安装MysqL , redis,nacos

1. MysqL

下载镜像

docker pull MysqL:5.7

创建实例并启动

docker run -p 3306:3306 --name MysqL 
-v/mydata/MysqL/log:/var/log/MysqL 
-v/mydata/MysqL/data:/var/lib/MysqL 
-v/mydata/MysqL/conf:/etc/MysqL 
-e MysqL_ROOT_PASSWORD=root 
-d MysqL:5.7
参数说明
-p 3306:3306  将容器的3306端口映射到主机的3306端口
-v/mydata/MysqL/log:/var/log/MysqL   将日志文件挂载到主机
-v/mydata/MysqL/data:/var/lib/MysqL  将数据文件挂载到主机
-v/mydata/MysqL/conf:/etc/MysqL      将配置文件挂载到主机
-e MysqL_ROOT_PASSWORD=root          初始化root用户密码

查看运行中的容器

docker ps 

配置MysqL

vi /mydata/MysqL/conf/my.cnf

[client]
default-character-set=utf8

[MysqL]
default-character-set=utf8

[MysqLId]
init_connect='SET collation_connection=utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skie-name-resolve

docker restart MysqL

2. redis

docker pull redis


mkdir -p /mydata/redis/conf

touch /mydata/redis/conf/redis.conf


docker run -p 6379:6379 --name redis 
-v /mydata/redis/data:/data 
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf 
-d redis redis-server /etc/redis/redis.conf

//redis持久化配置
vi redis.conf //编辑配置文件
appendonly yes  

3. nacos

docker pull nacos/nacos-server

mkdir -p /root/nacos/init.d /root/nacos/logs

touch /root/nacos/init.d/custom.properties

management.endpoints.web.exposure.include=*

docker run -d -p 8848:8848 
-e MODE=standalone -e PREFER_HOST_MODE=hostname 
-v /root/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties 
-v /root/nacos/logs:/home/nacos/logs --name nacos nacos/nacos-server

设置开机启动

docker update redis --restart=always

docker update MysqL --restart=always

docker update nacos --restart=always

Canal1.1.4使用RocketMQ同步MySQL到Redis(二)

Canal1.1.4使用RocketMQ同步MySQL到Redis(二)

一、Canal使用RocketMQ同步MySQL

Canal结合RocketMQ同步MySQL

二、 同步数据到Redis

2.1 安装Redis

2.2 Redis配置

2.3 SpringBoot配置

2.3.1 引入依赖

<dependency>
    <groupId>com.alibaba.otter</groupId>
    <artifactId>canal.client</artifactId>
    <version>1.1.4</version>
</dependency>

<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-spring-boot-starter</artifactId>
    <version>2.0.2</version>
</dependency>

<!-- 根据个人需要依赖 -->
<dependency>
    <groupId>javax.persistence</groupId>
    <artifactId>persistence-api</artifactId>
</dependency>

2.3.2 通用代码

SQLType.java

import lombok.AccessLevel;
import lombok.NoArgsConstructor;

/**
 * Canal监听SQL类型
 *
 * @author Yu
 * @date 2019/09/08 00:18
 **/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class SQLType {

    /**插入*/
    public static final String INSERT = "INSERT";
    /**更新*/
    public static final String UPDATE = "UPDATE";
    /**删除*/
    public static final String DELETE = "DELETE";

}

User.java

import lombok.Data;
import javax.persistence.Id;
import java.io.Serializable;

/**
 * UserPo对象
 *
 * @author Yu
 * @date 2019/09/08 14:13
 **/

@Data
public class User implements Serializable {

    private static final long serialVersionUID = -6845801275112259322L;

    @Id
    private Integer uid;

    private String username;

    private String password;

    private String sex;

}

CanalSynService.java

import com.alibaba.otter.canal.protocol.FlatMessage;
import java.util.Collection;

/**
 * Canal同步服务
 *
 * @author Yu
 * @date 2019/09/08 00:00
 **/

public interface CanalSynService<T> {

    /**
     * 处理数据
     *
     * @param flatMessage CanalMQ数据
     */
    void process(FlatMessage flatMessage);

    /**
     * DDL语句处理
     *
     * @param flatMessage CanalMQ数据
     */
    void ddl(FlatMessage flatMessage);

    /**
     * 插入
     *
     * @param list 新增数据
     */
    void insert(Collection<T> list);

    /**
     * 更新
     *
     * @param list 更新数据
     */
    void update(Collection<T> list);

    /**
     * 删除
     *
     * @param list 删除数据
     */
    void delete(Collection<T> list);

}

AbstractCanalMQ2RedisService.java

import com.alibaba.otter.canal.protocol.FlatMessage;
import com.google.common.collect.Sets;
import com.taco.springcloud.canal.constant.SQLType;
import com.taco.springcloud.core.component.ApplicationContextHolder;
import com.taco.springcloud.core.exception.BizException;
import com.taco.springcloud.core.exception.constants.BaseApiCodeEnum;
import com.taco.springcloud.core.utils.JsonUtil;
import com.taco.springcloud.redis.utils.RedisUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.util.ReflectionUtils;
import javax.annotation.Resource;
import javax.persistence.Id;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.util.*;


/**
 * 抽象CanalMQ通用处理服务
 *
 * @author Yu
 * @date 2019/09/08 00:05
 **/

@Slf4j
public abstract class AbstractCanalMQ2RedisService<T> implements CanalSynService<T> {

    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    @Resource
    private RedisUtils redisUtils;

    private Class<T> cache;

    /**
     * 获取Model名称
     *
     * @return Model名称
     */
    protected abstract String getModelName();

    @Override
    public void process(FlatMessage flatMessage) {

        if(flatMessage.getIsDdl()) {
            ddl(flatMessage);
            return;
        }

        Set<T> data = getData(flatMessage);

        if(SQLType.INSERT.equals(flatMessage.getType())) {
            insert(data);
        }

        if(SQLType.UPDATE.equals(flatMessage.getType())) {
            update(data);
        }

        if(SQLType.DELETE.equals(flatMessage.getType())) {
            delete(data);
        }

    }

    @Override
    public void ddl(FlatMessage flatMessage) {
        //TODO : DDL需要同步,删库清空,更新字段处理

    }

    @Override
    public void insert(Collection<T> list) {
        insertOrUpdate(list);
    }

    @Override
    public void update(Collection<T> list) {
        insertOrUpdate(list);
    }

    private void insertOrUpdate(Collection<T> list) {
        redisTemplate.executePipelined( (RedisConnection redisConnection) -> {
            for (T data : list) {
                String key = getWrapRedisKey(data);
                RedisSerializer keySerializer = redisTemplate.getKeySerializer();
                RedisSerializer valueSerializer = redisTemplate.getValueSerializer();
                redisConnection.set(keySerializer.serialize(key), valueSerializer.serialize(data));
            }
            return null;
        });
    }

    @Override
    public void delete(Collection<T> list) {

        Set<String> keys = Sets.newHashSetWithExpectedSize(list.size());

        for (T data : list) {
            keys.add(getWrapRedisKey(data));
        }

        //Set<String> keys = list.stream().map(this::getWrapRedisKey).collect(Collectors.toSet());
        redisUtils.delAll(keys);
    }

    /**
     * 封装redis的key
     *
     * @param t 原对象
     * @return  key
     */
    protected String getWrapRedisKey(T t) {
        return new StringBuilder()
                        .append(ApplicationContextHolder.getApplicationName())
                        .append(":")
                        .append(getModelName())
                        .append(":")
                        .append(getIdValue(t))
                        .toString();

    }

    /**
     * 获取类泛型
     *
     * @return 泛型Class
     */
    protected Class<T> getTypeArguement() {
        if(cache == null) {
            cache = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        }
        return cache;
    }

    /**
     * 获取Object标有@Id注解的字段值
     *
     * @param t 对象
     * @return  id值
     */
    protected Object getIdValue(T t) {
        Field fieldOfId = getIdField();
        ReflectionUtils.makeAccessible(fieldOfId);
        return ReflectionUtils.getField(fieldOfId, t);
    }

    /**
     * 获取Class标有@Id注解的字段名称
     *
     * @return id字段名称
     */
    protected Field getIdField() {

        Class<T> clz = getTypeArguement();
        Field[] fields = clz.getDeclaredFields();
        for (Field field : fields) {
            Id annotation = field.getAnnotation(Id.class);

            if (annotation != null) {
                return field;
            }
        }

        log.error("PO类未设置@Id注解");
        throw new BizException(BaseApiCodeEnum.FAIL);
    }

    /**
     * 转换Canal的FlatMessage中data成泛型对象
     *
     * @param flatMessage   Canal发送MQ信息
     * @return              泛型对象集合
     */
    protected Set<T> getData(FlatMessage flatMessage) {
        List<Map<String, String>> sourceData = flatMessage.getData();
        Set<T> targetData = Sets.newHashSetWithExpectedSize(sourceData.size());
        for (Map<String, String> map : sourceData) {
            T t = JsonUtil.mapConvertPojo(map, getTypeArguement());
            targetData.add(t);
        }
        return targetData;
    }

}

TestUsersConsumer.java

import com.alibaba.otter.canal.protocol.FlatMessage;
import com.taco.springcloud.canal.model.User;
import com.taco.springcloud.canal.service.AbstractCanalMQ2RedisService;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Service;


/**
 * Canal订阅消息
 *
 * @author Yu
 * @date 2019/09/04 23:10
 **/

@Slf4j
@Service
@RocketMQMessageListener(topic = "test_users", consumerGroup = "users")
public class TestUsersConsumer extends AbstractCanalMQ2RedisService<User> implements RocketMQListener<FlatMessage> {

    @Getter
    private String modelName = "user";

    @Override
    public void onMessage(FlatMessage s) {
        process(s);
    }
}

2.3.2 注意事项

代码应该放在Common模块下,需要canal同步服务依赖该模块,继承AbstractCanalMQ2RedisService即可,根据需要可以重写里面的方法,DDL处理暂时还没完成,只是整个Demo,有时间再完善吧。

centos 安装docker mysql redis 及配置

centos 安装docker mysql redis 及配置

centos环境

一.安装docker

1.设置yum源

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

2.安装需要的软件

yum install -y yum-utils device-mapper-persistent-data lvm2

3.查看docker版本号及安装

yum list docker-ce --showduplicates | sort -r


yum install docker-ce-18.03.1.ce

4.启动docker 并加入开机自启

systemctl start docker

systemctl enable docker

二.docker下安装mysql8

1.查询mysql镜像

docker search mysql

2.安装mysql,默认安装最新版本,需要指定版本号 docker pull mysql:版本号

docker pull mysql

3.创建挂载目录

mkdir -p /data/docker/mysql/data /data/docker/mysql/logs /data/docker/mysql/conf

4.创建配置文件

cd /data/docker/mysql/conf
vim my.conf

5.配置文件

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# Custom config should go here
# 不区分大小写配置
lower_case_table_names=1
# 解决远程连接慢
skip-name-resolve

6.启动容器

docker run \
-d -p 3306:3306 \
--name mysql8 \
-v /data/docker/mysql/conf:/etc/mysql/conf.d \
-v /data/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
--privileged=true \
--restart=always \
mysql

7.登录mysql 并创建用户远程访问及授权

docker exec -it mysql8 bash

mysql -u root -p

CREATE USER ''name''@''%'' IDENTIFIED WITH mysql_native_password BY ''xxxx'';

GRANT ALL PRIVILEGES ON *.* TO ''新用户名''@''%'';

flush privileges;

8.退出容器

ctrl+p+q

三.安装redis

redis 直接安装到服务器了,没有放在docker中

1.下载redis

cd /usr/local

wget http://download.redis.io/releases/redis-6.0.7.tar.gz

2.安装gcc 

yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash

3.编译

tar -zxvf redis-6.0.7.tar.gz 

cd redis-6.0.7

make

make install

4.配置

vim redis.conf

bind 0.0.0.0
daemonize yes
tcp-keepalive 20

5.设置启动

cd /etc

mkdir redis

cp /usr/local/redis-6.0.7/redis.conf /etc/redis/6379.conf

cp /usr/local/redis-6.0.7/utils/redis_init_script /etc/init.d/redis

cd /etc/init.d

chkconfig redis on

service redis start

 

今天关于Docker 学习之 mysql 与 redis的分享就到这里,希望大家有所收获,若想了解更多关于.NET 6 + EF Core + MySQL + Docker + Identity +MVC 学习笔记 (二)、02.docker安装mysql,redis,nacos、Canal1.1.4使用RocketMQ同步MySQL到Redis(二)、centos 安装docker mysql redis 及配置等相关知识,可以在本站进行查询。

本文标签: