Java Web微服务自动化构建

Wesley13
• 阅读 458

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

一、下载安装Docker

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

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

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

Java Web微服务自动化构建

我们主要使用第一个快速启动终端,第二个是用来查看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文件。

Java Web微服务自动化构建

Java Web微服务自动化构建

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

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

Java Web微服务自动化构建

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

Java Web微服务自动化构建

二、安装镜像

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)  .

Java Web微服务自动化构建

运行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

Java Web微服务自动化构建

此处尽管共享了本地数据库的数据 /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 Java Web微服务自动化构建

六、 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

Java Web微服务自动化构建

Java Web微服务自动化构建

十一、ubuntu 项目部署实例

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

Java Web微服务自动化构建

最终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安装路径 Java Web微服务自动化构建

Java Web微服务自动化构建

Java Web微服务自动化构建

系统设置 Java Web微服务自动化构建

Java Web微服务自动化构建

Java Web微服务自动化构建

新建任务

Java Web微服务自动化构建

Java Web微服务自动化构建

Java Web微服务自动化构建

Java Web微服务自动化构建

Java Web微服务自动化构建

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

Java Web微服务自动化构建

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

Java Web微服务自动化构建

Java Web微服务自动化构建

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

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
2个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这