文档章节

Java Web微服务自动化构建

无畏的老巨人
 无畏的老巨人
发布于 2017/06/19 10:42
字数 2069
阅读 129
收藏 4

网上很多docker介绍都是基于unix系统下,win7的资料较少,出现的错误,搜索的结果都是路唇不对马嘴,Holy Shitte!。所以记录下过程,使需要的人少走弯路,确实可以节省很多时间。

一、下载安装Docker

官网的说明是windows下必须是win10系统,而且下载缓慢,直接通过以下链接下载DockerToolBox最新版本,十秒搞定。

https://get.daocloud.io/toolbox/

下载完安装,选择安装目录,完成后会生成以下快捷方式。

输入图片说明

我们主要使用第一个快速启动终端,第二个是用来查看docker实例以及下载官方镜像的。

点击启动,等一会如果。

如果出现** Cannot connect to the Docker daemon. Is the docker daemon running on this host?**

更新安装目录和本地缓存目录(C:\Users\admin.docker\machine\cache\)下boot2docker镜像文件(.iso)。boot2docker最新镜像地址 https://github.com/boot2docker/boot2docker/releases 速度看运气。 下载完替换安装目录和本地缓存目录两个地方的iso文件。

输入图片说明

输入图片说明

此外要想运行成功,还必须开启BIOS(F10还是F4忘记了)中的虚拟化 (visualization security)为enabled状态。

如果一切正常,启动成功,会出现以下界面。

输入图片说明

检查是否运行的标志是 通过命令 docker version ,出现下面的结果,而且必须同时出现Server和Client信息(如果不使用快捷方式启动,可能只看到Server启动成功).

输入图片说明

二、安装镜像

docker images是查看容器已经安装的镜像。

运行成功docker后,需要安装项目镜像,依赖jdk镜像,数据库镜像等。所谓镜像,就是你需要运行的项目 及环境都要打包到docker中才可以运行成功。

其中通用的jdk库、mysql通过daocloud很方便的下载下来。

使用以下命令

 docker pull daocloud.io/ld00000/jdk-8

再使用docker images会发现images多出了刚下载的镜像。

项目打包成镜像需要运行Run as---maven中输入package命令,target文件下生成生成jar文件。

注意:默认的docker运行环境目录是C:\Users\Xerxes\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Docker 必须使用shell命令进入到你打包的jar文件所在目录运行打包命令,或者把jar拷贝到以上目录中运行打包命令。

然后输入命令,别忘了最后的.

 docker build -t 你的项目jar文件名(不包含后缀.jar)  .

输入图片说明

运行docker中spring boot项目镜像

**docker run -p 48080:80 -t treasure-0.0.1 **

提示mysql连接不上。

三、安装mysql

运行mysql容器(/my/datadir即/my/datadir . 指在当前目录下创建的存放数据的文件夹)

docker run --name mysql --volume-driver=local -v /my/datadir/treasure:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql

打开Kitematic

输入图片说明

此处尽管共享了本地数据库的数据 /my/datadir/treasure(mysql下data中指定库的文件拷贝到当前命令行运行目录下,也可以用其他地址,如D:/xx/yy/zz),在上面的VOLUME下面的存放mysql数据的容器文件夹上点击enable,数据才会真的共享

不导入已有数据的话,运行mysql容器 docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql

$ docker exec mysql5 sh -c 'exec source --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > f:/schema.sql 进入mysql容器

docker exec -it mysql-master bash

四、 容器增加volume

volume

五、 上传镜像到Docker Hub

  1. 注册https://hub.docker.com账号,新建一个public/private repository.

  2. docker tag image {docker-hub-username}/{default-repo-folder-name}:first-image

  3. docker push {docker-hub-username}/{default-repo-folder-name}:first-image 输入图片说明

六、 docker 容器交互

https://docs.docker.com/engine/userguide/networking/work-with-networks/#basic-container-networking-example

使用bridge模式自定义network

七、 maven中配置docker 使用dockerfile自动生成项目image。

spotify插件配置

https://github.com/spotify/docker-maven-plugin

https://eacdy.gitbooks.io/spring-cloud-book/content/3%20%E4%BD%BF%E7%94%A8Docker%E6%9E%84%E5%BB%BA%E5%BE%AE%E6%9C%8D%E5%8A%A1/3.7%20%E4%BD%BF%E7%94%A8Maven%E6%8F%92%E4%BB%B6%E6%9E%84%E5%BB%BADocker%E9%95%9C%E5%83%8F.html

八、 使用compose 一次配置web应用所有images

使用docker-compose插件可以编排多个容器实例,只需要配置docker-compose.yml文件即可。 如果使用数据库服务名是mysql,那么在项目中数据库URL中host直接改为mysql,这样来连接容器内数据库实例。具体看后面的demo。

其他:

kitmatic可以启动、停止、删除容器

docker自带终端不能直接粘贴地址,MINGW64点击左上角图标,粘贴

查看容器ip:docker inspect --format '{{ .NetworkSettings.IPAddress }}' angry_golick

** 如果项目build镜像用到的dockfile有expose 80 然后docker run -p 48080:80 -t treasure-0.0.1运行项目

会导致项目访问不了 必须去掉dockfile中expose 80 然后使用http://192.168.99.100:8080/swagger-ui.html即可。**

删除空白image

 docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

dockerhub 84795210

九、 终极Guide

9个docker菜单 项目容器与mysql容器互通

十、 docker-compose 配置network

docker-compose主要命令

docker-compose启动

十一、ubuntu 项目部署实例

首先做volumes ,sql文件初始化 ,dockerfile准备等环境配置 (在ubuntu对应目录做好volume映射(容器中文件路径与宿主机文件路径一一对应,此步骤也可以在jenkins shell command中编写脚本实现))

输入图片说明

最终docker-compose.yml参考

# Docker compose yml
# Author: Cruz
# site: https://github.com/gp15237125756
# notion: 
# 1. /var/lib/mysql or /var/lib/redis locate the default data paths inside the container which created while redis&mysql container starting
#    also /usr/bin/mysql represents the default path which created by mysql image
# 2. build: . point to the dockfile path for web application
# 3. volumes .:/code correspond to HOST:CONTAINER
# 4. create the essential directory in local computer before startup docker-compose to do some initiation 
# 5. create network:  docker network create ld
version: '2.1'  #docker-compose version
services:
########################### APPLICATION ##################################
  web:
    container_name: webapp
    build:
      context: ./app/dockfile
      dockerfile: Dockerfile
    ports:
      - "80:8088"
    volumes:
      - ./app/code:/app/code
    links:
      - redis
      - mysql
    networks:
      - ld
    depends_on:
      mysql:
          condition: service_healthy  #database health check before application startup
      #redis:
########################### REDIS ##################################
  redis:
    container_name: redis
    image: daocloud.io/library/redis
    volumes:
      - ./redis/data:/var/lib/redis
    networks:
      - ld
########################### MYSQL ##################################
  mysql:
    container_name: mysql
    #build: ./mysql
    image: daocloud.io/mysql:5.6
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/sql:/docker-entrypoint-initdb.d  # execute init sql
      - ./mysql/cnf:/etc/mysql/conf.d
      - ./mysql/data:/var/lib/mysql  # data location
    environment:
      MYSQL_ROOT_PASSWORD: root
    networks:
      - ld
    restart: always
    healthcheck:
      test: "/usr/bin/mysql --user=root --password=root --execute \"SHOW DATABASES;\""
      # test: "/usr/local/mysql/bin/mysql --user=foo --password=foo --execute \"SHOW DATABASES;\""
      interval: 30s
      timeout: 30s
      retries: 5
#volumes:
# ./mysql/data:/var/lib/mysql
# ./redis-data:/var/lib/redis
########################### NETWORKS ##################################
networks:
  ld:
    external:
      name: ld
    
   

部署后mysql如果中文出现乱码,./mysql/cnf下必须增加一个自定义配置文件custom.cnf

[mysqld]
character-set-server = utf8
collation-server = utf8_unicode_ci
skip-character-set-client-handshake

network配置

http://www.runoob.com/docker/docker-install-mysql.html http://www.cnblogs.com/baolong/p/5763412.html https://docs.docker.com/engine/reference/builder/#add https://docs.docker.com/samples/mysql/#where-to-store-data https://segmentfault.com/q/1010000003840346 https://yeasy.gitbooks.io/docker_practice/content/compose/compose_file.html

附上mysql权限准备sql

--mysql docker exec
use mysql;
delete from user where user='root';
flush privileges;

drop database if exists `treasure`;
create database `treasure`;
user `treasure`;
CREATE USER 'root' IDENTIFIED BY 'root';
-- 将docker_mysql数据库的权限授权给创建的docker用户,密码为123456:
grant all on treasure.* to root@'%' identified by 'root' with grant option;
-- 刷新权限
flush privileges;


docker run --name mysql-master -e MYSQL_ROOT_PASSWORD=root -d mysql
docker run --name mysql-master -v /my/own/datadir:/mysql/data -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

以上是win7环境下docker配置,生产环境下应该使用linux系统,安装简单多了。

十二、Jenkins自动化发布

正常项目以docker方式发布,可以配置docker-registery建立本地容器镜像仓库,使用Jenkins自动化发布到该仓库,以镜像方式交付给测试或生产环境。

由于以上ubuntu实例,以docker-compose方式在测试环境中运行,所以发布流程分为:

  1. 从svn拉取项目源码到Jenkins的workspace。

2.打包上面的代码,生成jar mvn clean package -a

3.使用SSH方式,将jar拷贝到./app/code目录下

4.执行shell脚本 重启docker-compose

首先,安装Jenkins插件,如Maven Integration plugin,Publish Over SSH,Subversion Plug-in等,有的已安装好了。 Global Tool Configuration配置jdk,maven安装路径 jdk

maven

global security

系统设置 mail插件地址

mail通知

ssh设置

新建任务

Subversion

构建触发器

构建

构建后操作

构建后操作

保存配置。选中Poll SCM 添写* * * * * 意思是 jenkins每隔一分钟去SVN版本库中看看有更新没,如果有更新,则触发构建。以上设置周期5分钟间隔检查svn,如有变化,才重新build。可打开控制台,查看或调试构建过程。 console log

console log

Jenkins构建后操作可以做一些优化,如删除之前的web容器和image,这样每次都会使用提交后代码编译,打包,构建容器实例。配置如下

last

last

即把传输文件和执行脚本分成2个transfer Set(如果放在一个transfer set默认先传输完文件,然后执行shell命令)

© 著作权归作者所有

上一篇: Java虚拟机
无畏的老巨人

无畏的老巨人

粉丝 17
博文 100
码字总数 101337
作品 0
宁波
CTO(技术副总裁)
私信 提问
在Kubernetes 部署基于 MicroProfile 的 Java 微服务

要在如今快节奏的开发环境中取得成功,利用容器技术和 DevOps 实践来构建并持续交付微服务非常重要。本篇 Code Pattern 将展示如何使用 MicroProfile 和 Kubernetes 并借助您已掌握的技能和经...

宋庆离
2018/02/05
4.5K
3
Oracle推出轻量级Java微服务框架Helidon

近日,Oracle 推出 了一个新的开源框架 Helidon ,该项目是一个用于创建基于微服务的应用程序的Java库集合。和 Payara Micro 、 Thorntail (之前的 WildFly Swarm )、 OpenLiberty 、TomEE...

小刀爱编程
2018/10/15
1K
2
Java EE 即将死去,毫无疑问!

在Java问世之初,包括IBM、BEA、Oracle在内的一些巨头公司看到了Java作为一门杰出的Web编程语言可能给他们带来的巨大商机。那么如何通过一门编程语言来赚钱呢?答案就是使用这门语言构建复杂...

局长
2016/11/29
24.5K
88
甲骨文最新推出的 Java 微服务框架 Helidon:轻量简单

据外媒报道,甲骨文在上周五宣布推出了 Helidon 的第一个版本,这是一个用于编写微服务的 Java 开源库,并且正式加入了 Eclipse MicroProfile。 Helidon 是一个开源的 Java 微服务框架,旨在...

局长
2018/09/12
10K
34
为什么Java大神,都在看Spring Boot和Spring Cloud的书?

如果你是一名Java开发人员,并且最近正打算学习Spring Boot和Spring Cloud框架并寻找一些关于它们的最好的书籍,那么,你今天就来对地方了。 本文,我们将讨论一些学习Spring Boot和Spring ...

Java小铺
2018/09/18
520
3

没有更多内容

加载失败,请刷新页面

加载更多

3_数组

3_数组

行者终成事
今天
7
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部