摘要:在容器化开发环境中分享了如何容器化本地的开发环境。对于一个应用,数据库似乎是必不可少的东西。下面会通过例子来介绍一下如何一个容器中的数据库。例子将会使用的技术栈在目录下新建文件,用于控制数据库的启动。
在 容器化开发环境 中分享了如何容器化本地的开发环境。对于一个Web应用,数据库似乎是必不可少的东西。下面会通过例子来介绍一下如何Setup一个容器中的数据库。例子将会使用的技术栈:
MySQL
Flyway
...
Setup Codebase
clone hello-dockerize repo
$ git clone https://github.com/aikin/hello-dockerize.gitInstall 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 webUse 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 flywayMigrateCheck Migrate Result On Intellij IDEA
安装 Intellij IDEA plugin Database Navigator,配置connections:
查看User表数据
结束了吗?并没有,如何将应用和数据库分离成两个独立的容器。
原文链接
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/26762.html
摘要:服务网关服务网关涵盖的功能包括路由,鉴权,限流,熔断,降级等对入站请求的统一拦截处理。具体可以进一步划分为外部网关面向互联网和内部网关面向服务内部管理。应用服务应用服务是企业业务核心。到此实际上已经完成服务迁移工作。 导读 Spring Cloud基于Spring Boot开发,提供一套完整的微服务解决方案,具体包括服务注册与发现,配置中心,全链路监控,API...
摘要:宋体本文从拉勾网的业务架构日志采集监控服务暴露调用等方面介绍了其基于的容器化改造实践。宋体此外,拉勾网还有一套自研的环境的业务发布系统,不过这套发布系统未适配容器环境。写在前面 拉勾网于 2019 年 3 月份开始尝试将生产环境的业务从 UHost 迁移到 UK8S,截至 2019 年 9 月份,QA 环境的大部分业务模块已经完成容器化改造,生产环境中,后台管理服务已全部迁移到 UK8...
摘要:本文内容节选自由主办的第七届,架构师高欣分享的的实践实录。当然,在部署完成后,我们要做一个监测以便掌握它的运行状况。规划配置运行环境在正式部署前,还要考虑如何规划并配置好运行环境。在使用部署时,可以利用这些命令做验证,检验部署是否正常。 showImg(https://segmentfault.com/img/bVblRHj?w=2880&h=1920); 本文内容节选自由msup主办...
摘要:优化网络在今年早些时候,我们公布了许多关于的新的网络功能,包括原生集群,共享,原生容器负载均衡以及原生容器的网络服务,它们服务于上的应用程序以及在谷歌云上的。 showImg(https://segmentfault.com/img/bVbnY8w);许多企业机构正在把全部或部分 IT 业务迁移到云端,帮助企业更好的运营。不过这样的大规模迁移,在企业的实际操作中也有一定难度。不少企业保...
阅读 2352·2021-09-08 09:45
阅读 3285·2021-09-08 09:45
阅读 3050·2019-08-30 15:54
阅读 3311·2019-08-26 13:54
阅读 1345·2019-08-26 13:26
阅读 1358·2019-08-26 13:23
阅读 875·2019-08-23 17:57
阅读 2144·2019-08-23 17:14