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

七、Java多人博客系统-2.0版本-docker部署的更多相关文章

  1. 四、Java多人博客系统-2.0版本

    由于时间关系,多人博客系统这里穿插一个2.0版本. 2.0版本本来是打算用于建立个人网站,但是后来发现个人建站需要购买域名服务器,还需要备案,很繁琐.最终放弃.完成此版本,最终也只是作为技术演练.此版 ...

  2. 五、Java多人博客系统-2.0版本-数据库设计

    数据库设计表如下:文章类别表.文章表.评论表.留言表. 文章列表表:存放文章类别,首页菜单生成也是从这个表取的. 文章表:存放文章标题.发表时间.内容等信息. 评论表:文章评论内容. 留言表:用户发表 ...

  3. 六、Java多人博客系统-2.0版本-代码实现

    1.前后端分离,后端使用spring boot,只负责提供数据,对外暴露Restful API.前端使用vue,只负责展示数据和向后台提交数据. 2.数据库使用mariadb,存储所有数据. 3.前端 ...

  4. 三、Java多人博客系统-技术架构

    多人博客系统1.0版本,架构和技术还是很简单和很传统的. 1.技术 前端:jsp.html.css.javascript.jquery.easyui.echarts 后端:spring mvc.Hib ...

  5. 二、Java多人博客系统-演变

    任何项目都是由小到大,逐步演变的.自己写的这个博客系统也不例外. 更新日志如下: 一.2014年底-2015年初 功能及技术: 1.定位为个人网站,介绍自己情况和发布文章等. 2.首页模块有:个人简介 ...

  6. 一、Java多人博客系统-开篇

    作为一个程序员,工作之外的不断学习是必须的.这个项目是我个人课外学习和练手的项目.最开始是一个个人网站.当时发现京东云可以免费部署网站的,就立即写了一个网站,当时就使用jsp技术,可以实现发布博客.评 ...

  7. 【完全开源】Django多人博客系统——支持MarkDown和tinyMce

    目录 说明 功能 如何使用 说明 这是一个用Django开发的多人博客系统,功能简单,但完全满足公司内部或个人的博客使用需求.支持普通富文本编辑器(tinyMCE)和MarkDown编辑器 由于嫌弃D ...

  8. 推荐一款自研的Java版开源博客系统OneBlog

    OneBlog 一款超好用的Java版开源博客      Introduction 简介 OneBlog 一个简洁美观.功能强大并且自适应的Java博客.使用springboot开发,前端使用Boot ...

  9. Java程序员博客系统推荐!我调研了100来个 Java 开源博客系统,发现这 5 个最好用!

    大家好!我是 Guide 哥,Java 后端开发.一个会一点前端,喜欢烹饪的自由少年. 最近想倒腾一下博客,看了很多现成的比较成熟的开源博客系统,自己也简单从下面几个维度总结对比了一下: star数量 ...

随机推荐

  1. git操作+一个本地项目推到github上+注意

    git init 创建新文件夹,打开,然后执行以创建新的 git 仓库. git config --global user.name "xxx" git config --glob ...

  2. #WEB安全基础 : HTML/CSS | 文章索引

    本系列讲解WEB安全所需要的HTML和CSS #WEB安全基础 : HTML/CSS | 0x0 我的第一个网页 #WEB安全基础 : HTML/CSS | 0x1初识CSS #WEB安全基础 : H ...

  3. 利用Azure虚拟机安装Dynamics CRM 2016实例

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复181或者20151215可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! Dynamics CRM Ser ...

  4. Get-CrmSetting返回Unable to connect to the remote server的解决办法

    摘要: 微软动态CRM专家罗勇 ,回复302或者20190125可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 在Dynam ...

  5. Android Studio撤销与SVN的关联

    为何会记录这一个问题,主要是在做项目的过程中出现了一个奇怪的现象,就是直接在文件目录下使用svn上传文件的话,可以看到该目录是与SVN相关联的,可是到了用Android Studio上传代码的时候却发 ...

  6. Git:修改Git Bash默认打开位置(win10)

    1.起因 大家写的代码不可能直接保存在根目录下,但是Git Bash每次一打开就是根目录,每次都要切换路径很麻烦. 2.修改Git Bash默认打开位置 1)Git Bash右键 -> 属性 2 ...

  7. 浅谈TCP IP协议栈(四)IP协议解析

    通过之前的网络层基础知识,IP地址以及路由器的简介,大家应该对于TCP/IP有一个大致的了解,在脑海里应该对于网络的几个基础概念有个大概的了解,简单点说整个协议栈就是在做一件事,规定网络报文(网络传输 ...

  8. 小程序的js处理步骤

    <!-- 包含请求路由 --> var hostUrl = require('../../config.js').hostUrl; Page({ <!-- 页面的初始数据 --> ...

  9. LeetCode算法题-Construct String from Binary Tree(Java实现)

    这是悦乐书的第273次更新,第288篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第141题(顺位题号是606).构造一个字符串,该字符串由二叉树中的括号和整数组成,并具 ...

  10. LeetCode算法题-Maximum Depth of N-ary Tree(Java实现)

    这是悦乐书的第261次更新,第274篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第128题(顺位题号是559).给定n-ary树,找到它的最大深度.最大深度是从根节点到 ...