使用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:\Users\douchuzi> 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
可以看到返回了正確的結果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM