• 使用docker安装mysql5.7


    比起原本要下载mysql然后安装、配置、之后以service方式运行的方式,我们现在可以用mysql官方的image然后以容器的方式运行它,这样使得本机的系统十分干净,容器进程停掉之后本机系统上什么mysql相关的进程都不会存在,不用安装数据库。

    创建卷和网络

    先创建卷,用来持久化data and configuration,这里我们用named volume方式,另外还有 bind mounts.

    docker volume create mysql_data
    docker volume create mysql_config
    

    接下来创建一个network,用于应用容器和mysql容器之间的通信,还记得吗?隔离的两个容器进程之间通信的唯一方式是通过网络。
    docker network create mysqlnet
    这个网络被称为用户定义的网桥网络,它为我们提供了一个很好的DNS查找服务,我们可以在后续的java应用容器创建连接字符串时使用它。

    获得镜像并启动容器

    先去docker hub上看一下可选的mysql官方镜像都有哪些版本,看到有5.7.36版本。
    然后拉取这个镜像:

    docker pull mysql:5.7.36
    

    然后看一下本地镜像,就可以看到刚才拉下来的这个镜像了:

    docker images
    REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
    mysql        5.7.36    938b57d64674   12 days ago   448MB
    

    然后我们启动容器

    PS C:Usersdouchuzi> docker run --name mysqlserver --rm `
    >> -v mysql_data:/var/lib/mysql `
    >> -v mysql_config:/etc/mysql/conf.d `
    >> --network mysqlnet `
    >> -e MYSQL_ROOT_PASSWORD=douchuzi@000 `
    >> -p 3306:3306 -d mysql:5.7.36
    27b14615c9428feb7da0b193b0ebc88ad2cb5cada4cd6840d2b4b81372bae0a1
    

    这里解释一下上面的几个参数:

    --name mysqlserver表示启动的这个容器名字为mysqlserver
    --rm 容器停止后就删除这个容器
    -v mysql_data:/var/lib/mysql表示把容器里的/var/lib/mysql挂载到mysql_data这个volume卷上。这里我们用named volume方式,另外还有 bind mounts。
    --network mysqlnet表示加入mysqlnet这个网络
    -e MYSQL_ROOT_PASSWORD=douchuzi@000表示在容器里创建一个名为MYSQL_ROOT_PASSWORD的环境变量,mysql的root密码。
    -p 3306:3306是把容器的3306端口映射为本机的3306端口,宿主机port:容器port
    -d 表示后台运行这个docker run命令
    最后mysql:5.7.36我们用的镜像。

    另外,这里用的是win10的powershell,换行符是` , 如果是mac或者linux换行符是
    接下来可以看一下容器是否启动成功 docker ps -a,应该可以看到类似如下信息:

    CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                               NAMES
    083272ee96b4   mysql:5.7.36   "docker-entrypoint.s…"   9 minutes ago   Up 9 minutes   0.0.0.0:3306->3306/tcp, 33060/tcp   mysqlserver
    
    测试和使用这个mysql数据库

    可以用DBeaver工具连一下本地容器里这个mysql试试,insert点数据,然后docker stop containerID停止容器再docker run重新启动,可以看到数据仍然还在。这就是因为前面我们使用了volume持久化了mysql的数据文件。
    我们用IntelliJ IDEA开发一个简单的springboot应用来连一下这个数据库:
    build.gradle

    plugins {
        id 'org.springframework.boot' version '2.1.13.RELEASE'
        id 'io.spring.dependency-management' version '1.0.10.RELEASE'
        id 'java'
    }
    
    group = 'com.wangan'
    version = '0.0.1-SNAPSHOT'
    sourceCompatibility = '1.8'
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        //jpa
        implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
        runtimeOnly 'mysql:mysql-connector-java'
        //spring mvc
        implementation 'org.springframework.boot:spring-boot-starter-web'
        //lombok
        annotationProcessor 'org.projectlombok:lombok:1.18.2'
        compileOnly 'org.projectlombok:lombok:1.18.2'
        testAnnotationProcessor 'org.projectlombok:lombok:1.18.2'
        testCompileOnly 'org.projectlombok:lombok:1.18.2'
        //test
        testImplementation('org.springframework.boot:spring-boot-starter-test') {
            exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
        }
        implementation 'com.alibaba:fastjson:1.2.73'
    }
    
    test {
        useJUnitPlatform()
    }
    

    application.properties

    # 应用名称
    spring.application.name=springboot2
    server.servlet.context-path=/springboot2
    # 应用服务 WEB 访问端口
    server.port=8080
    # 数据库驱动:
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    # 数据源名称
    spring.datasource.name=defaultDataSource
    # 数据库连接地址
    spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
    # 数据库用户名&密码:
    spring.datasource.username=root
    spring.datasource.password=root
    
    spring.jpa.hibernate.ddl-auto=update
    spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
    

    Repository

    import com.wangan.springboot2.entity.Token;
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
    
    public interface TokenRepository extends JpaRepository<Token, Long>, JpaSpecificationExecutor<Token> {
        Token findByMobile(String mobile);
    }
    

    Controller

    @Slf4j
    @RestController
    @RequestMapping("rest")
    public class RestfullController {
    
        @Autowired
        private TokenRepository tokenRepository;
    
        @RequestMapping(value = "getTokenByMobile", method = RequestMethod.GET)
        public Token getTokenByMobile(String mobile){
            log.info(mobile);
            Token token = tokenRepository.findByMobile(mobile);
            log.info(JSON.toJSONString(token));
            return token;
        }
    }
    

    用Postman测试一下GET http://localhost:8080/springboot2/rest/getTokenByMobile?mobile=13700000000
    可以看到返回了正确的结果。

  • 相关阅读:
    Java 8 Lambda 表达式
    OSGi 系列(十二)之 Http Service
    OSGi 系列(十三)之 Configuration Admin Service
    OSGi 系列(十四)之 Event Admin Service
    OSGi 系列(十六)之 JDBC Service
    OSGi 系列(十)之 Blueprint
    OSGi 系列(七)之服务的监听、跟踪、声明等
    OSGi 系列(六)之服务的使用
    OSGi 系列(三)之 bundle 事件监听
    OSGi 系列(三)之 bundle 详解
  • 原文地址:https://www.cnblogs.com/lyhero11/p/15490672.html
Copyright © 2020-2023  润新知