七、Java多人博客系统-2.0版本-docker部署

  docker是当下很热门的技术,是对之前的部署系统方式的彻底改变。之前部署系统,需要安装数据库、初始化数据库,安装jdk,配置jdk,部署应用程序,修改配置文件等,很繁琐。一般现场运维人员很难搞定,现场也会出现很多公司开发环境没有的问题。使用docker技术,只需要运行镜像即可,省去了环境安装、变量配置等繁琐的事情,现场运维人员经过简单培训后可以独立部署系统。移植性好,公司开发环境直接可以部署到现场。

  使用docker技术,主要有两个个关键步骤:1、构建镜像 2、运行镜像。构建镜像,需要将基础支持软件、业务系统打成镜像包。运行镜像,需要将构建的镜像运行起来,外部可以访问。

一、docker理解

  docker镜像可以理解为一个高度内聚的应用包,包含运行环境、配置等,可以移植到各个环境中运行。例如一个java应用镜像,运行这个镜像只需要准备一台Linux服务器,服务器上不需要装任何jdk,只需要安装docker,就可以运行该镜像。省去了常规的安装运行环境,配置环境变量,启动各种服务等各种繁琐步骤。

二、本地构建docker应用

  对于一个信息系统,镜像一般包括:

  1. mariadb镜像:包含数据库安装文件和业务数据库。数据库安装文件,是数据库基础支持软件。业务数据库是业务系统需要的数据库,业务系统需要提供初始化脚本。

  2. nginx镜像:包含nginx基础镜像和业务前端代码。nginx基础镜像是nginx运行软件。作为前后端分离的项目,nginx中存放前端静态页面。

  3. java镜像:包含jdk和业务应用程序。jdk是java应用运行基础环境。业务应用是后端系统,向前端提供展示数据。

  以上是信息系统一种部署方式,另外可以将基础镜像和初始化镜像分开,例如mariadb镜像可以分为mariadb安装镜像和业务系统初始化镜像。

  先在本地环境安装docker,docker中配置仓库地址,指明了镜像存放路径,例如tim:5000,同时需要在hosts中配置tim的映射。

  

  在系统的hosts文件中配置映射127.0.0.1 tim

  1) mariadb镜像:

  1、 准备业务系统初始化脚本。

  2、 修改数据库配置文件等

  需要准备的文件如下:

   

  utf8mb4.cnf 修改数据库编码字符集为utf8格式,解决中文汉字乱码问题。

  run.txt 运行镜像命令。构建镜像非必需文件,这里只是记录运行命令。

  blog.sql 初始化脚本。业务系统的初始化镜像,包含建库脚本、建表脚本、初始化数据脚本等。

  Dockerfile 生成镜像说明文档。说明镜像如何生成,已经运行时执行的命令。

  install_data.sh 数据库启动后执行的脚本。因为mariadb镜像需要在镜像运行后,初始化业务系统数据库,需要该脚本执行业务系统初始化脚本。

  Makefile 执行make命令后,执行的镜像生成命令。一般是移除上次的镜像,再生成新的镜像。

  重点是Dockerfile文件,内容如下:

#基础镜像使用daocloud.io/library/mysql:8,新构建的镜像以此镜像为基础
FROM daocloud.io/library/mysql:8

#定义工作目录变量
ENV WORK_PATH /usr/local/work

#定义会被容器自动执行的目录
ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d

#定义sql文件名,这里指向业务系统初始化脚本
ENV FILE_0 blog.sql

#定义shell文件名,指向待指向的shell脚本
ENV INSTALL_DATA_SHELL install_data.sh

#执行shell命令,创建文件夹
RUN mkdir -p $WORK_PATH

#把数据库初始化数据的文件复制到工作目录下
COPY ./$FILE_0 $WORK_PATH/

#把要执行的shell文件放到/docker-entrypoint-initdb.d/目录下,高版本mysql容器会自动执行这个shell(5.7.4不能执行)
COPY ./$INSTALL_DATA_SHELL $AUTO_RUN_DIR/

#mysql默认字符集是latain,而它是不支持中文的,utf8mb4 是 utf8 的超集并完全兼容utf8。修改字符集
COPY utf8mb4.cnf /etc/mysql/conf.d/

#给执行文件增加可执行权限
RUN chmod a+x $AUTO_RUN_DIR/$INSTALL_DATA_SHELL

  install_data.sh文件主要是镜像在运行后,自动执行的命令,主要是登录到已经启动的mysql镜像中,执行初始化脚本。内容如下:

#!/bin/bash
mysql -uroot -p$MYSQL_ROOT_PASSWORD <<EOF
source $WORK_PATH/$FILE_0;

  utf8mb4.cnf内容如下:

# 设置服务器、客户端编码格式
[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE  # 忽略客户端的字符集,使用服务器的设置 
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

  Makefile包含两个命令,也可以拿出来单独执行,内容如下:

build-image:
	docker rmi tim:5000/blog-mariadb:dev-test
	docker build -t tim:5000/blog-mariadb:dev-test .

  生成镜像:

  通过命令进入到镜像生成命令中,执行make命令,或者拷贝Makefile文件中内容执行也可以。例:

  docker build -t tim:5000/blog-mariadb:dev-test .
  最后的点不能省略,表明在当前目录中构建镜像,镜像名称为tim:5000/blog-mariadb:dev-test,指明了镜像存放地址,镜像名称,镜像版本。
  使用docker images查看镜像是否生成成功。
  运行镜像:
docker run --name mysql-blog -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d tim:5000/blog-mariadb:dev-test

   --name mysql-blog 取名为mysql-blog

  -p 3306:3306 将容器的3306端口暴露到宿主机中,外部可以通过3306访问容器,如同访问本机上的数据库一样

  -e MYSQL_ROOT_PASSWORD=root 数据库密码为root

  -d 以后台进程方式运行

  tim:5000/blog-mariadb:dev-test 运行的镜像

 

  2) nginx镜像

  需要准备的文件如下:

  static是开发的业务系统前端静态页面,前后端分离的,所以这里是html、css、js之类的文件。

  

  Dockerfile文件内容:

# 使用的基础镜像,这个是nginx运行软件
FROM hub.c.163.com/library/nginx

# 将业务系统静态页面拷贝到nginx的页面目录中,static会自动创建
COPY static/ /usr/share/nginx/html/static/

# 将blog站点nginx配置文件拷贝到nginx站点配置文件中,可以拷贝多个,端口不同即可
COPY blog.conf /etc/nginx/conf.d/

  blog.conf是nginx配置,内容如下:

# nginx支持配置多个站点,配置文件拷贝到/etc/nginx/conf.d下即可
server {
    listen       9001; # 监听的端口
    server_name  localhost; # 服务器名称
    location / {
     # 静态页面拷贝到这里来
      root   /usr/share/nginx/html/static;
      index  index.html;

      # 跨域
      if ($request_method ~* "(GET|POST|DELETE|PUT)") {
		add_header "Access-Control-Allow-Origin" *;
	}
        	
      if ($request_method = OPTIONS ) {
		add_header "Access-Control-Allow-Origin" *;
		add_header "Access-Control-Allow-Methods" 'GET, POST, PUT, DELETE, OPTIONS';
		add_header "Access-Control-Allow-Headers" 'Authorization,Content-Type';
		return 200;
	}
    }
}

  同样,进入到该目录中,执行make命令。

  运行命令:

docker run --name blog-web -d -p 8080:9001 tim:5000/blog-web:dev-test  

  blog站点nginx配置文件监听端口是9001,暴露出来,外部可以通过8080端口访问系统。

    

  3) java应用镜像

   需要准备的文件如下:

  

  Dockerfile:生成镜像的命令,指明了基础镜像来源,镜像中包含的文件,镜像运行的命令等。

  下面两个文件是java应用需要的文件,application.properties将应用的参数拿出来,可以进行修改,运行时会覆盖应用中的配置文件,不需要修改应用内部的配置文件,再重新生成jar包。

  重点看下Dockerfile文件

# java应用需要java支持,先使用hub.c.163.com/library/java:8作为基础镜像
FROM hub.c.163.com/library/java:8

# 运行的环境变量
ENV TZ Asia/Shanghai
ENV LANG zh_CN.UTF-8 
ENV LANGUAGE zh_CN:zh 
ENV LC_ALL zh_CN.UTF-8

# 工作目录
WORKDIR /opt/project

# 将文件加到镜像中的目录中。application.properties是配置文件,不再需要进入jar包中修改配置。blog-1.0-SNAPSHOT.jar是业务应用运行jar
ADD application.properties /opt/project/config/application.properties
ADD blog-1.0-SNAPSHOT.jar /opt/project/

# 镜像运行后执行的命令
CMD ["java", "-jar", "blog-1.0-SNAPSHOT.jar"]

  生成镜像:

  进入到镜像制作目录中,执行命令: docker build -t tim:5000/tim-blog:dev-test . 或者执行make命令。

  查看镜像是否生成成功

  docker images

  运行镜像

docker run -p 9091:9091 --link mysql-blog:mysql-blog --name blog tim:5000/blog:dev-test

  将端口映射到9091。同时链接到mysql-blog数据库,注意这里是数据库镜像运行时的名称,连接mysql:mysql(容器名:别名),应用名称为blog。

  域名需使用连接的容器的别名(即上述所提的mysql-blog:mysql-blog中的第二个mysql-blog),例如应用中数据库连接字符串写法如下:

  spring.datasource.url=jdbc:mysql://mysql-blog:3306/blog?useUnicode=true&characterEncoding=utf-8

    查看容器运行情况:

  docker ps -a 

CONTAINER ID        IMAGE                            COMMAND                  CREATED              STATUS              PORTS                               NAMES
9f1a03cf3555        tim:5000/blog-web:dev-test       "nginx -g 'daemon ..."   45 seconds ago       Up 50 seconds       80/tcp, 0.0.0.0:8080->9001/tcp      blog-web
aec1c87b63ed        tim:5000/blog:dev-test           "java -jar blog-1...."   55 seconds ago       Up About a minute   0.0.0.0:9091->9091/tcp              blog
0c5dcc8543ca        tim:5000/blog-mariadb:dev-test   "docker-entrypoint..."   About a minute ago   Up About a minute   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql-blog

  这样系统需要的3个镜像就运行起来了,在浏览器通过8080端口就能访问系统。

  

   附docker常用命令:

docker images 查看所有镜像

docker ps -a 查看所有容器

docker stop containerID 停止容器

docker rm containerID 移除容器

docker rmi imagesID 移除镜像

docker exec -it containerId /bin/bash 进入到容器内部

 

三、使用docker-compose运行项目

  看以上的运行过程,需要输入三次命令,依次启动数据库、后端、nginx,命令中指明了端口、容器间的依赖等,很繁琐。其实,这3个镜像是构成这个项目不可分割的部分,相互之间有依赖,而且有先后启动顺序。就是说应该当成一个整体来看待。

  docker-compose就诞生了。

  docker-compose是一组组合命令,融合了镜像生成和镜像运行等一些列命令,用于需要使用多个镜像才能使一个项目运行起来的情况,例如web应用,需要数据库、nginx、后端等服务,使用docker-compose组合这些镜像,快速启动项目。不再需要依次输入docker run命令启动各个镜像。甚至不需要依次构建各个镜像。

  下面以已经存在镜像为例,讲解如何使用docker-compose。

1、首先编写Dockfile,生成镜像。

  这一步上面已经讲解过。需要手动依次调用docker build命令,得到需要的3个镜像,当然可以在docker-compose中生成,不需要依次调用。但是按照一般的思路,先是有镜像,然后才是镜像之间的组合,形成一个完整的项目。

2、编写docker-compose.yml文件

主要包括两部分:version、services。

services中就包括需要的3个镜像,可以看到services中各个服务其实就是docker run中的各个参数。

version: "3"
services:
  mysql-blog:  # 容器别名
    image: tim:5000/blog-mariadb:dev-test # 使用的镜像
    volumes:
      - /opt/mysql/data:/var/lib/mysql    # 挂载目录,将容器内部的目录挂载到外部宿主机上
    ports:
      - 3306:3306       # 端口映射
    restart: always
    environment:        # 数据库密码
      MYSQL_ROOT_PASSWORD: root

  blog:
    depends_on:
      - mysql-blog # 依赖mysql-blog,这个服务要求先运行
    image: tim:5000/blog:dev-test
    links:  
      - mysql-blog   # 链接到数据库,这里使用数据库容器的别名
    ports:
      - 9091:9091
    restart: always

  blog-web:
    depends_on:
      - blog
    image: tim:5000/blog-web:dev-test
    ports:
      - 8080:9001
    restart: always

3、启动

进入到docker-compose.yml目录,运行:

docker-compose up -d

再使用docker ps -a 可以看到services中的3个容器都运行起来了。

- 停止
docker-compose down

转载于:https://www.cnblogs.com/leanfish/p/9719264.html

免费个人博客系统(兼多用户博客系统)是支持一个空间2个网站的全能型网站管理系统,本免费个人博客系统通用和拓展性强,博客、文章系统、商城、企业网站、个性化论坛等类型网站都可以使用,将来网站无论如何转型或拓展,只需要修改模板就可以实现,无需重建网站。本系统不同于以往任何逻辑架构的网站程序。本软件开发者希望通过注重商业化开发,助力用户通过网络创业和赚钱,当然您也可以通过这个软件在互联网高效地展示自己。 详细说明: 1.本个人博客系统可以用于商业用途,本软件官方、开发者不收取任何授权费用; 2.本个人博客系统是支持一个空间2个网站的全能型博客系统; 3.本个人博客系统通用和拓展性强,博客、文章系统、商城、企业网站、个性化论坛等类型网站都可以使用; 4.本个人博客系统功能强大,代码少,运行效率更高,程序运行速度是其它主流同类软件的3~4倍,内存占用不到其它主流同类软件的五分之一; 5.开启和关闭会员注册,开启和关闭普通会员投稿功能; 6.会员功能拓展到了兼职专题功能,SEO设置和开放特约编辑的多用户不同权限管理功能等; 7.超级管理员可无密码一键登录任意会员后台,管理员用受限登录会员身份后台发布信息,也可让网站攻击者无法猜解密码; 8.自动生成手机版网站,系统默认带www的域名为PC模板站,不带www的顶级域名为手机站,不增加维护难度,就可以同时拥有2个网站; 9.博客程序还包含订单、秒杀、限时抢购和数量虚拟功能,助力用户互联网创业和商业化运营,就看脑洞大开的你怎么使用了; 10.本个人博客系统能够适应各种界面浏览器,后台可手机随时随地访问、管理和更新网站; 11.可一键切换成.shtml、.html、.htm、.asp、.aspx、.cgi、.php、.jsp、.cgi、/ 等网页后缀,模拟不同语言编程的网站程序; 12.前端页面精简,前端编码不用div标签,不用id、class规则的CSS样式,最大限度精简前端代码,鼓励用户抛弃div+CSS前端代码编写模式,我们这样做不是为了迎合HTML5,只是为了更合理的应用HTML标签; 13.安装程序自动识别和设置伪静态; 14.全站无死角SEO设置; 15.强大的内链逻辑,特别适应大数据类型网站使用; 16.强大的广告和精准广告设置; 17.数据缓存模式,不依赖外部服务器组件和其它插件,不额外占用服务器系统内存资源; 18.删除局部缓存和一键清除全部缓存; 19.可设置邮件实时通知新订单和访客留言; 20.可设置管理员回复留言可同时邮件通知留言者; 21.可查看和删除无用上传文件,为将来数据备份节省时间和空间; 22.特色的tag标签功能; 23.分类、tag标签、url表单填写自动补缺; 24.url表单可自动生成拼音,也可以用汉字,自动转码,有利于SEO搜索引擎排名; 25.开放式PHP原生态模板,用户任意修改、穿插内容或广告,无需花时间研究额外规则,模板修改成本更低; 26.可对模板备份,使用备份模板,并可对模板恢复系统初始状态; 27.模板修改全站页面秒更新; 28.可自定义SQL语句的图片展示页面; 29.后台可控制各个模块是否开启验证码、设置验证码长度,以及设置验证码破解难度; 30.访客留言关键词过滤; 31.可自定义导航; 32.可在线编辑js和CSS文件; 33.本免费个人博客系统(兼多用户博客系统)无后门。
LxBlog 多用户博客个人主页系统,一套基于php+mysql 数据库平台架构的多用户博客系统,该系统融合了Blog的最新元素,拥有强大的个人主页系统,独立的二级域名功能,灵活的用户模版系统,丰富的朋友圈和个性相册功能。 部分修正改进功能 1.改进个人页面的日志列表页的摘要 2.改进相册个人后台发表方式 3.改进音乐前台列表页为显示歌曲列表,点击试听后弹出播放窗口,取消音乐上传 4.改进个人首页中显示所加入朋友圈的更新信息功能  5.改进最新推送的文章在朋友圈的其他圈友中显示功能  6.改进日志同时推送到多个朋友圈的支持功能 7.改进朋友圈系统页列表、会员排行列表 8.改进朋友圈系统页 9.改进圈主推荐文章列表 10.改进写朋友圈写文章功能,即在圈子中加入"写文章"功能,转入个人后台编写,写文章后默认推送到该圈子 11.改进朋友圈邀请功能 12.改进头像大小控制 13.改进书签功能 部分新增功能: 1.增加日志、评论、留言表情 2.增加验证问题 3.增加在article.php页面中和该文章tag相关的文章 4.增加tags广告词锁定 5.增加列表页"隐藏日志","好友可见日志" 链接. 6.增加心情,天气在发表日志页 7.增加"上一篇","下一篇",在文章阅读页 8.增加"转移个人分类"功能,在个人后台日志列表页 9.增加日志管理的搜索功能 10.增加附件批量上传 11.增加文件和商品集成格式在日志发布过程中 12.增加相册前台图片列表页,单个图片显示页面 13.增加相册个人页面单图显示页面功能,增加图片播放器 14.增加短消息功能 15.增加系统首页博客文章、人数、今日文章数、评论数量的显示 16.增加最新博客内容在论坛首页的显示 17.增加个人分类在论坛推送到blog的文章 18.增加推送设定,即当博客向论坛推送时,管理员可以设置只允许推送至哪个或者哪些版块 19.增加随机访问列表 20.增加好友日志更新列表,在个人日志页面 21.增加可视化风格编辑 22.增加论坛文集 23.增加找回密码功能 24.增加好友分类 25.增加摘要分界符 26.增加自定义关键字链接 27.增加博主回复评论 28.增加转载功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值