资讯专栏INFORMATION COLUMN

容器化开发环境 - 数据库连接和迁移

Jensen / 1769人阅读

摘要:在容器化开发环境中分享了如何容器化本地的开发环境。对于一个应用,数据库似乎是必不可少的东西。下面会通过例子来介绍一下如何一个容器中的数据库。例子将会使用的技术栈在目录下新建文件,用于控制数据库的启动。

在 容器化开发环境 中分享了如何容器化本地的开发环境。对于一个Web应用,数据库似乎是必不可少的东西。下面会通过例子来介绍一下如何Setup一个容器中的数据库。例子将会使用的技术栈:

MySQL

Flyway

...

Setup Codebase

clone hello-dockerize repo

$ git clone https://github.com/aikin/hello-dockerize.git

Install MySQL On Docker Image

dockerize目录下新建文件docker-entrypoint.sh,用于控制MySQL数据库的启动。

修改Dockerfile,添加安装MySQL的配置:

# === Install Mysql ===
RUN groupadd -r mysql && useradd -r -g mysql mysql

RUN mkdir /docker-entrypoint-initdb.d

ENV MYSQL_MAJOR 5.7
ENV MYSQL_VERSION 5.7.11-1ubuntu14.04

# gpg: key 5072E1F5: public key "MySQL Release Engineering " imported
RUN apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys A4A9406876FCBD3C456770C88C718D3B5072E1F5

RUN echo "deb http://repo.mysql.com/apt/ubuntu/ trusty mysql-${MYSQL_MAJOR}" > /etc/apt/sources.list.d/mysql.list

# the "/var/lib/mysql" stuff here is because the mysql-server postinst doesn"t have an explicit way to disable the mysql_install_db codepath besides having a database already "configured" (ie, stuff in /var/lib/mysql/mysql)
# also, we set debconf keys to make APT a little quieter
RUN { 
echo mysql-community-server mysql-community-server/data-dir select ""; 
echo mysql-community-server mysql-community-server/root-pass password ""; 
echo mysql-community-server mysql-community-server/re-root-pass password ""; 
echo mysql-community-server mysql-community-server/remove-test-db select false; 
} | debconf-set-selections

RUN apt-get update
RUN apt-get install -y mysql-server="${MYSQL_VERSION}"
RUN rm -rf /var/lib/apt/lists/*
RUN rm -rf /var/lib/mysql && mkdir -p /var/lib/mysql

# comment out a few problematic configuration values
# don"t reverse lookup hostnames, they are usually another container
RUN sed -Ei "s/^(bind-address|log)/#&/" /etc/mysql/my.cnf 
&& echo "skip-host-cache
skip-name-resolve" | awk "{ print } $1 == "[mysqld]" && c == 0 { c = 1; system("cat") }" /etc/mysql/my.cnf > /tmp/my.cnf 
&& mv /tmp/my.cnf /etc/mysql/my.cnf

VOLUME /var/lib/mysql

COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat
ENTRYPOINT ["docker-entrypoint.sh"]

EXPOSE 3306
CMD ["mysqld"]

新建文件dev.env,用于配置数据库账号和密码。

MYSQL_USER=mysql
MYSQL_PASSWORD=mysql
MYSQL_DATABASE=hello_dockerize
MYSQL_ROOT_PASSWORD=12345678

修改docker-compose.yml

web:
  build: ./dockerize
  env_file: ./dockerize/dev.env
  environment:
- LANG=C.UTF-8
- TERM=xterm
- DEBUG=true
  ports:
- "8080:8080"
- "3306:3306"
- "5005:5005"
  volumes:
- .:/hello-dockerize
- /var/lib/mysql:/var/lib/mysql

启动容器

$ docker-compose run --service-ports web

Use Database Migrations Flyway

新建文件db.mysql.gradle

flyway {
    driver = "com.mysql.jdbc.Driver"
    url = "jdbc:mysql://dockerhost:3306/hello_dockerize"
    user = "mysql"
    password = "mysql"
    table = "hello_dockerize_schema_version"
    initOnMigrate = true
    locations = ["filesystem:${projectDir}/src/main/resources/db/migration/mysql"]
    sqlMigrationPrefix = "MySQL-"
}

dependencies {
    compile "mysql:mysql-connector-java:5.1.34"
}

修改build.gradle文件,添加

buildscript {
    repositories {
        jcenter()
        maven { url "http://repo.spring.io/snapshot" }
        maven { url "http://repo.spring.io/milestone" }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.5.RELEASE")
        classpath "org.flywaydb:flyway-gradle-plugin:3.0"
    }
}
apply plugin: "flyway"
apply from: "db.mysql.gradle"

新建目录 src/main/resources/db/migration/mysql,添加 migration sql 脚本MySQL-1_1__create_user.sql

CREATE TABLE User (
    ID          BIGINT PRIMARY KEY   AUTO_INCREMENT,
    FIRST_NAME  varchar(64) NOT NULL,
    LAST_NAME   varchar(64) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8;

insert into User (FIRST_NAME, LAST_NAME) values ("Laijin", "Lu");

执行 migrate 命令:

$ ./gradlew flywayClean flywayInit flywayMigrate

Check Migrate Result On Intellij IDEA

安装 Intellij IDEA plugin Database Navigator,配置connections

查看User表数据

  结束了吗?并没有,如何将应用和数据库分离成两个独立的容器。

原文链接

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26762.html

相关文章

  • 服务迁移之路 | Spring Cloud向Service Mesh转变

    摘要:服务网关服务网关涵盖的功能包括路由,鉴权,限流,熔断,降级等对入站请求的统一拦截处理。具体可以进一步划分为外部网关面向互联网和内部网关面向服务内部管理。应用服务应用服务是企业业务核心。到此实际上已经完成服务迁移工作。 导读 Spring Cloud基于Spring Boot开发,提供一套完整的微服务解决方案,具体包括服务注册与发现,配置中心,全链路监控,API...

    rickchen 评论0 收藏0
  • 拉勾网基于 UK8S平台的容器改造实践

    摘要:宋体本文从拉勾网的业务架构日志采集监控服务暴露调用等方面介绍了其基于的容器化改造实践。宋体此外,拉勾网还有一套自研的环境的业务发布系统,不过这套发布系统未适配容器环境。写在前面 拉勾网于 2019 年 3 月份开始尝试将生产环境的业务从 UHost 迁移到 UK8S,截至 2019 年 9 月份,QA 环境的大部分业务模块已经完成容器化改造,生产环境中,后台管理服务已全部迁移到 UK8...

    CoorChice 评论0 收藏0
  • TOP100summit分享实录 | JFrog高欣:Kubernetes is hard!JFro

    摘要:本文内容节选自由主办的第七届,架构师高欣分享的的实践实录。当然,在部署完成后,我们要做一个监测以便掌握它的运行状况。规划配置运行环境在正式部署前,还要考虑如何规划并配置好运行环境。在使用部署时,可以利用这些命令做验证,检验部署是否正常。 showImg(https://segmentfault.com/img/bVblRHj?w=2880&h=1920); 本文内容节选自由msup主办...

    邹强 评论0 收藏0
  • 内涵福利 | 加速业务交付,从谷歌云上使用 Kubernetes Istio 开始

    摘要:优化网络在今年早些时候,我们公布了许多关于的新的网络功能,包括原生集群,共享,原生容器负载均衡以及原生容器的网络服务,它们服务于上的应用程序以及在谷歌云上的。 showImg(https://segmentfault.com/img/bVbnY8w);许多企业机构正在把全部或部分 IT 业务迁移到云端,帮助企业更好的运营。不过这样的大规模迁移,在企业的实际操作中也有一定难度。不少企业保...

    王岩威 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<