常見三款開源博客系統(jpress、b3log-solo、mblog)搭建網站
三款好用的基於java開發的開源博客系統
mblog:
mblog開源免費的博客系統, Java語言開發, 支持mysql/h2數據庫, 采用spring-boot、jpa、shiro、bootstrap等流行框架開發
JPress:
一個類似 WordPress 的系統,使用 JFinal 和 Jboot 開發。模板安裝 模板卸載 在線編輯,完善的開發文檔 極致的開發體驗 用戶獨立登錄和注冊入口手機短信和郵箱激活配置,對於新手來講有點部署難度
b3log-solo:
Solo 是一個專業、簡約、穩定、極速的開源 Java 博客程序。你可以自己搭建使用,也可以通過購買我們搭建好的服務來直接使用,社區活躍,功能齊全,部署難度同 jpress
====================================================================================================================
JPress 使用 Java8 開發,基於流行的JFinal和Jboot框架。
目前JPress已經內置的文章和頁面其實是兩個模塊,可以移除和新增其他模塊,因此,可以通過新增模塊的方式,使用JPress來做博客、論壇、問答社區,商城等幾乎可以用來做任何類型的網站。
JPress充分利用中國互聯網生態、原生支持和微信公眾號、小程序對接。基於LGPL開源協議。
https://gitee.com/fuhai/jpress.git
一、通過docker-compose安裝 jpress
1、確認你已經安裝了 docker Engine 與 docker-compose。
(1)安裝docker:
更新 yum 緩存: sudo yum makecache fast 安裝 Docker-ce: sudo yum -y install docker-ce 啟動 Docker 后台服務 sudo systemctl start docker 測試運行 hello-world docker run hello-world
Docker分成了兩個版本:Docker EE和Docker CE,即:企業版(EE)和社區版(CE)。
CentOS7如何將Docker升級到最新版
步驟
- 卸載舊版 docker
> rpm -qa | grep docker # 也可以使用 yum list installed | grep docker docker-engine-1.13.0-1.el7.centos.x86_64 docker-engine-selinux-1.13.0-1.el7.centos.noarch > yum remove docker-engine-1.13.0-1.el7.centos.x86_64 > yum remove docker-engine-selinux-1.13.0-1.el7.centos.noarch
- 升級至最新版
> curl -fsSL https://get.docker.com/ | sh
yum install -y docker-ce
- 重啟docker
> systemctl restart docker # centos 7 > service docker restart # centos 6
- 查看升級后的版本
> docker version
# docker -v
(2)安裝 docker-compose:
# 方法一: $ curl -L https://github.com/docker/compose/releases/download/1.8.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose $ chmod +x /usr/local/bin/docker-compose # Linux下等效於 $ curl -L https://github.com/docker/compose/releases/download/1.8.1/docker-compose-Linux-x86_64 > /usr/local/bin/docker-compose; chmod +x /usr/local/bin/docker-compose # 方法二:使用pip安裝,版本可能比較舊 $ yum install python-pip python-dev $ pip install docker-compose # 方法三:作為容器安裝 $ curl -L https://github.com/docker/compose/releases/download/1.8.0/run.sh > /usr/local/bin/docker-compose $ chmod +x /usr/local/bin/docker-compose # 方法四:離線安裝 # 下載[docker-compose-Linux-x86_64](https://github.com/docker/compose/releases/download/1.8.1/docker-compose-Linux-x86_64),然后重新命名添加可執行權限即可: $ mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose; $ chmod +x /usr/local/bin/docker-compose # 百度雲地址: http://pan.baidu.com/s/1slEOIC1 密碼: qmca # docker官方離線地址:https://dl.bintray.com/docker-compose/master/ 安裝完成后可以查看版本: # docker-compose --version docker-compose 1.8.1
安裝pip yum -y install epel-release yum -y install python-pip 確認版本 pip --version
更新pip pip install --upgrade pip
安裝docker-compose pip install docker-compose
查看版本 docker-compose version
一般步驟:
1、定義Dockerfile,方便遷移到任何地方;
2、編寫docker-compose.yml文件;
3、運行docker-compose up
啟動服務;
Docker Compose 運行Tomcat 先測試一下好不好用
- 准備需要的鏡像
- NGINX
- tomcat:8.5.0(使用最新版的看不到Tomcat主頁,所以就用這個版本了)
准備nginx.conf配置文件,下一步需要掛載到nginx容器中(t01和t02待會創建Tomcat容器時掛載使用該別名,也可以更改)
user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; #include /etc/nginx/conf.d/*.conf; upstream tomcat_docker { server t01:8080 weight=1; server t02:8080 weight=1; } server { server_name ""; listen 80 default_server; location / { proxy_pass http://tomcat_docker; proxy_redirect default; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } }
docker-compose.yml 配置文件
services:
mytomcat01:
image: tomcat:8.5.0
restart: "always"
container_name: tomcat01
ports:
- "8081:8080"
mytomcat02:
image: tomcat:8.5.0
restart: "always"
container_name: tomcat02
ports:
- "8082:8080"
nginx:
image: nginx
volumes:
- "./nginx.conf:/etc/nginx/nginx.conf"
ports:
- "8000:80"
- "443:443"
links:
- mytomcat01:t01
- mytomcat02:t02
修改 tomcat01:
docker exec -it tomcat01 /bin/bash
echo "<html><head><title>tomcat01</title></head><body>server01</body></html>" > index.jsp
修改tomcat02:
docker exec -it tomcat02 /bin/bash
echo "<html><head><title>tomcat02</title></head><body>server02</body></html>" > index.jsp
訪問host-ip:8000
二、linux 安裝非常簡單,只需要兩條命令:能找到docker-compose.yml
文件就可以,版本更新可能就找不到了,需要去github上找一下
$ wget https://github.com/JpressProjects/jpress/blob/master/docker-compose.yml
$ docker-compose up -d
3、執行完畢以上命令之后,訪問 http://host-ip:8080
即可。
docker-compose.yml對應的內容:數據庫改成 5.7
version: '3.1' services: db: image: mysql:5.7 command: --default-authentication-plugin=mysql_native_password restart: always environment: MYSQL_ROOT_PASSWORD: jpress MYSQL_DATABASE: jpress MYSQL_USER: jpress MYSQL_PASSWORD: jpress volumes: - "./mysql:/var/lib/mysql" jpress: depends_on: - db links: - db image: fuhai/jpress:v2.0.1 ports: - "8080:8080" restart: always
container_name: jpress-server environment: TZ: Asia/Shanghai JPRESS_DB_HOST: db JPRESS_DB_PORT: 3306 JPRESS_DB_NAME: jpress JPRESS_DB_USER: jpress JPRESS_DB_PASSWORD: jpress volumes: - "./attachment:/opt/jpress/webapp/attachment"
- "./addons:/opt/jpress/webapp/addons"
- "./addonjars:/opt/jpress/webapp/WEB-INF/addons"
- "./wp-content:/opt/jpress/webapp/wp-content"
- "./templates:/opt/jpress/webapp/templates/dockers"
container_name
Compose 的容器名稱格式是:<項目名稱><服務名稱><序號> 雖然可以自定義項目名稱、服務名稱,但是如果你想完全控制容器的命名,可以使用這個標簽指定: container_name: jpress-server 這樣容器的名字就指定為 jpress-server 了。
網站根目錄的反爬蟲協議路徑:robots.txt
/opt/jpress/webapp/robots.txt
# 自定義的robots.txt協議覆蓋:
docker cp robots.txt jpress-server:/opt/jpress/webapp
# 重新啟動容器:
docker restart jpress-server
如果是前面 配置有nginx 可能存在緩存的情況,瀏覽器清理緩存 或者重啟nginx容器
安裝jpress

jboot是基於springcloud的分布式開源框架,部署通過內置 tomcat


三、構建自己的centos7+jdk8+tomcat8的docker鏡像
以下tomcat官方鏡像中tomcat:7 和tomcat:8的目錄。
CATALINA_BASE: /usr/local/tomcat CATALINA_HOME: /usr/local/tomcat CATALINA_TMPDIR: /usr/local/tomcat/temp JRE_HOME: /usr CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
先將war包上傳到服務器放在任意目錄,我的war包是jpress.war, 這里是放在/usr/local/webapps,執行如下命令
docker run --name mytomcat8080 -d -p 8080:8080 -v webapps:/usr/local/tomcat/webapps tomcat:8.5
-it
# 是-i和 -t的簡寫, 表示以交互式的方式運行容器,加上-d表示后台運行,這里為了截圖輸出啟動日志我用了-it,也可以用-d,再用"docker logs 容器名"命令輸出日志
--
rm
#當容器被停止時自動刪除容器
-p 8080:8080
#8080是為容器中的tomcat設置的端口, 這里表示將80映射到宿主機8080端口, 如果只寫-p 8080 容器會隨機取值32768~61000中較大的端口號來映射到80端口上
-
v
# 將tomcat中的usr/local/tomcat/webapps目錄映射到宿主機當前目錄的webapps目錄,后面更新jar包直接扔到被映射的宿主機目錄中即可
tomcat:8.5
# 鏡像名:tag標簽
插播的內容,實現servlet的打印
創建工程prod

pom文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.servlet</groupId> <artifactId>prod</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> <scope>provided</scope> </dependency> </dependencies> <build> <finalName>prod</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.0.0</version> <configuration> <warSourceExcludes>src/main/resources/**</warSourceExcludes> </configuration> </plugin> <!-- 在項目中的pom.xml指定jdk版本 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.0</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
HelloServlet.java
package com.servlet;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloServlet extends HttpServlet {
private String message;
public void init() throws ServletException {
// 初始化
message = "Hello, First Servlet!";
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//設置response使用的碼表,以控制response以什么碼表向瀏覽器寫出數據
response.setCharacterEncoding("UTF-8");
//指定瀏覽器以什么碼表打開瀏覽器發送的數據
response.setContentType("text/html;charset=UTF-8");
// 轉發可以攜帶參數,重定向不可以帶參數
request.setAttribute("message","測試消息");
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/helloServlet</url-pattern> </servlet-mapping> </web-app>
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <body> <% System.out.println("Hello JSP !!!");%> <%= request.getAttribute("message") %> <div>Hello JSP !!!</div> </body> </html>
http://localhost:8080/prod/helloServlet
測試docker容器是否正常運行:
docker cp prod.war mytomcat8080:/usr/local/tomcat/webapps
IP:8080/jpress
1、下載 jpress的jar文件
官網地址:http://jpress.io/
倉庫:https://github.com/JpressProjects/jpress
mv jpress-web-newest.war jpress.war
2、git clone 某個分支或者所有分支
clone 某個分支:
git clone -b 0.4.0 https://gitee.com/fuhai/jpress.git
clone 所有分支:
git clone https://gitee.com/fuhai/jpress.git
git branch -r
git checkout 0.4.0
git clone默認會把遠程倉庫整個給clone下來;
但只會在本地默認創建一個master分支
如果遠程還有其他的分支,此時用git branch -a查看所有分支
3、將war拷貝到容器
docker cp jpress.war mytomcat8080:/usr/local/tomcat/webapps
tomcat8080是容器的名字
# 外網可以訪問的 mysql容器 $ docker run --name wd-mysql -d -p 3306:3306 \ -v /data/mysql-data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -e MYSQL_DATABASE=jpress \ mysql:5.7
頁面卡住不動了,需要重新啟動容器:
docker restart mytomcat8
配置根路徑,直接域名訪問
在tomcat/conf/server.xml文件中,在<Host>下面添加 <Context path="/" docBase="項目文件所在位置" debug="0" reloadable="true" />,然后重啟tomcat即可
進入tomcat8080容器得知:
配置文件具體的路徑為: /usr/local/tomcat/conf/server.xml
項目的具體路徑為: /usr/local/tomcat/webapps/jpress
煩人的是容器的里邊vi命令不好用,實在沒有辦法我的方式是通過cp先拷貝出來,改完了在拷貝進去
docker cp mytomcat8080:/usr/local/tomcat/conf/server.xml ./
修改內容:
<Context path="/" docBase="/usr/local/tomcat/webapps/jpress" debug="0" reloadable="true" />
#拷貝回去:
docker cp server.xml mytomcat8080:/usr/local/tomcat/conf
#重新tomcat啟動容器:
docker restart mytomcat8080
IP:8080就可以正常訪問了
配置域名解析(略)
http://www.xxx.com:8080/jpress/
根據需要配置nignx代理:
www.xxx.com 請替換為已經備案過的真實域名
#user nobody;
user nginx;
worker_processes 2;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
upstream backend {
server www.xxx.com:8080 weight=4 max_fails=2 fail_timeout=30s;
server www.xxx.com:8081 weight=4 max_fails=2 fail_timeout=30s;
}
server {
listen 80;
server_name www.xxx.com;
location / {
# proxy_pass http://www.xxx.com:8080;
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_404 http_500 http_502 http_504;
}
}
}
參考:
安裝nginx:
docker search nginx
# 初級
$ docker run -it -p 80:80 nginx /bin/bash
# 進階
主機網絡
$ docker run -d -p 80:80 --name new-nginx --net=hostnginx
橋接網絡
$ docker run -d -p 80:80 --name new-nginx --net=bridge nginx
#進入容器: docker exec -it new-nginx /bin/bash
cd /usr/share/nginx/html
echo
"hello docker"
>index.html
**************************************************************************
Docker在創建容器時有四種網絡模式,bridge為默認不需要用–net去指定,其他三種模式需要在創建容器時使用–net去指定。
bridge模式,使用–net=bridge指定,默認設置。
none模式,使用–net=none指定。
host模式,使用–net=host指定。
container模式,使用–net=container:容器名稱或ID指定
cat /etc/passwd
cat /etc/passwd|grep 用戶名
cat /etc/group
cat /etc/group|grep 組名
***********************************************************************************
# 高級 docker run --name nginx --restart=always -p 80:80 \ -v /data/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro \ -v /data/docker/nginx/conf/conf.d:/etc/nginx/conf.d \ -v /data/docker/nginx/html:/usr/share/nginx/html \ -v /data/docker/nginx/logs:/var/log/nginx \ -d nginx:latest
dockerhub上的鏡像 沒有yum命令,使用不方便,所以自己創建一個nginx鏡像基於centos的基礎鏡像。
下載地址:http://nginx.org/download/
wget http://nginx.org/download/nginx-1.17.0.tar.gz
編寫Dockfile:
#vim Dockerfile
FROM centos:latest #基於centos鏡像
#標注作者聯系方式等信息
MAINTAINER 2019-05-12 abc@163.com
RUN yum -y install libtool make wget unzip git tar
#當前工作目錄 ,自動解壓 WORKDIR /usr/local/src/ #本地文件在當前目錄,ADD則直接解壓到當前工作目錄 ADD nginx-1.17.0.tar.gz ./
#工作目錄進入到解壓后目錄 WORKDIR nginx-1.17.0/ #運行shell命令 RUN yum install -y gcc gcc-c++ && \ yum install -y pcre pcre-devel && \ yum install -y zlib zlib-devel && \ yum install -y openssl openssl-devel libssl-dev && \ ./configure --prefix=/usr/local/nginx && \ make && make install
#暴露80端口
EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
創建鏡像
docker build -t mynginx:latest .
# 測試
$ docker run -d -p 80:80 --name web-nginx --net=host mynginx
$ docker cp nginx.conf web-nginx:/usr/local/nginx/conf/nginx.conf
#進入容器: docker exec -it web-nginx /bin/bash
重新啟動nginx容器(這是關鍵一步,否則拷貝進去配置文件也不會生效,這個我也經常忘記,這里重點提一下)
docker restart web-nginx
網站域名:80/jpress 可以正常訪問了。 域名需要備案的

雖然配置了負載均衡,但是我們目前才啟動了一個tomcat服務:我們可以通過下面的方式再次啟動另外一個容器
docker run --name mytomcat8081 -d -p 8081:8080 -v webapps:/usr/local/tomcat/webapps tomcat:8.5 docker cp jpress.war mytomcat8081:/usr/local/tomcat/webapps
但是有個問題,就是文件多了,這么拷貝是不是很麻煩,忘了配置哪個文件了,就尷尬了!!! 那么能不能將配置好的容器復制一份呢?
1.用export & import 還是 save & load ?
export & import 和 save & load 是 docker 中的兩組命令,我們先主要看看他們的區別:

具體的區別可以查看這篇博客docker save與docker export的區別,寫得很清晰。基於以上對比,save&load 方式可以保留數據,所以使用save&load這種方式。
總結一下docker save和docker export的區別:
- docker save保存的是鏡像(image),docker export保存的是容器(container);
- docker load用來載入鏡像包,docker import用來載入容器包,但兩者都會恢復為鏡像;
- docker load不能對載入的鏡像重命名,而docker import可以為鏡像指定新名稱
命令參考:https://www.runoob.com/docker/docker-save-command.html
由於save&load實際操作的是image。
所以導出之前,要先使用commit命令把容器中相對於其底層鏡像的修改提交為一層文件系統。
與原有的image結合構成一個新的image。新的image中會包含所有修改的內容。
單純的是復制一個容器(只需要執行1和5),備份到其他服務器(1~5都要執行)
# 1、commit 提交修改的鏡像,將修改一層文件系統累加到原來的鏡像
# 保存的格式:
# docker commit [選項] [容器ID或容器名] [倉庫名:標簽]
# 示例:
-a
:修改人-m
:備注
docker commit -a '隔壁老王' -m 'tomcat部署了jpress項目' mytomcat8080 mytomcat8080:latest
# 2、創建一個隨后可以由docker load
使用的備份(文件比較大,等等時間比較長,耐心點~~~)
$ docker save -o mytomcat8080-save.tar mytomcat8080:latest
# 3、查看大小(456M)
$ ls -sh mytomcat8080-save.tar
# 4、load容器(在其他安裝docker服務器上恢復時使用的,本示例只是重新啟動一個新的容器,可以省略此步驟)
$ docker load -i mytomcat8080-save.tar
# 5、運行容器
$ docker run --name mytomcat8081 -d -p 8081:8080 -v webapps:/usr/local/tomcat/webapps mytomcat8080:latest
一篇關於docker run -rm參數的說明:
https://docs.docker.com/engine/reference/run/

我的理解是這樣:
1、首先,你像下面這樣攜帶 --rm 參數創建了容器,
docker run --rm --name mytomcat8080 -d -p 8080:8080 -v webapps:/usr/local/tomcat/webapps tomcat:8.5
2、之后你又通過docker cp 方式拷貝文件到容器,
docker cp jpress.war mytomcat8080:/usr/local/tomcat/webapps
3、之后你發下文件太多了,想在當前容器保存一份作為基礎image鏡像文件,然后你就執行commit命令,docker commit -a '隔壁老王' -m 'tomcat部署了jpress項目' mytomcat8080 mytomcat8080:latest
4、在然后你就又執行了基於新的鏡像創建容器就run了一下
docker run --name mytomcat8081 -d -p 8081:8080 -v webapps:/usr/local/tomcat/webappsmytomcat8080:latest
5、訪問ip:8081/jpress 發現沒有正常顯示,吼吼吼~~~啥情況
# 進入容器一探究竟
docker exec -it mytomcat8081 /bin/bash
cd /usr/local/tomcat/webapps 一看,球毛沒有,原因就很清楚了,攜帶 --rm 參數 創建的容器 做基礎鏡像但不能保存修改后的數據,所以在進行容器備份時,必須保證創建時的容器部署 --rm 參數創建的
查看容器信息( docker inspect --format '{{.Name}}' 容器名稱 ):
docker inspect --format '{{.Name}} {{.State.Running}} {{.HostConfig.Binds}} {{.NetworkSettings.IPAddress}}' mytomcat8080
====================================================================================================================
和上邊沒關系了,下面是擴展內容(說一說為什么要自己制作鏡像,在進入容器操作時發現有些容器不能執行yum和wget、vi等等命令,很煩躁有沒有~~)
1、自定義創建Dockerfile 制作tomcat8 的鏡像
2、准備文件和安裝包(這3個文件在同一個相對路徑):
jdk-8u20-linux-x64.tar.gz
apache-tomcat-8.5.9.tar.gz
Dockerfile
FROM centos
MAINTAINER tomcat-image abc@163.com
RUN
yum install -y
gcc* zlib zlib-devel make proc-devel net-tools
openssl
openssl-devel
RUN yum install -y wget tar git unzip
WORKDIR /home
RUN echo "Asia/Shanghai" > /etc/timezone
ADD jdk-8u20-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/jdk1.8.0_20 /usr/local/java
ENV JAVA_HOME /usr/local/java ENV PATH $PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin ENV CLASSPATH $JAVA_HOME/jre/bin:$JAVA_HOME/lib:$JAVA_HOME/jre/lib/charsets.jar ADD apache-tomcat-8.5.9.tar.gz /usr/local/
RUN mv /usr/local/apache-tomcat-8.5.9 /usr/local/tomcat
WORKDIR /usr/local/tomcat
EXPOSE 8080
CMD ["/usr/local/tomcat/bin/catalina.sh", "run","-Djava.security.egd=file:/dev/./urandom"]
最后行CMD在調試時可以先不寫,等到目錄和命令調試完畢無誤后在加上,最后完成一鍵的生成
3、生成鏡像
docker build -t base-tomcat:latest .

4、交互式啟動容器檢查jdk 和tomcat路徑
docker run --name tomcat01 -p 8090:8080 -it base-tomcat:latest /bin/bash //運行容器,將本地8090端口映射到容器的8080端口 [root@2539333b06d6 tomcat]#cd /usr/local/tomcat/bin [root@2539333b06d6 tomcat]# ./startup.sh //容器中啟動Tomcat
5、完善Dockerfile文件
訪問能夠正常,就可以放心的在Dockerfile文件末尾加上最后一行啟動tomcat的命令,重新生成鏡像就OK啦 (/usr/local/tomcat/catalina.sh路徑要寫對哦)
startup.sh和catalina.sh的區別這里不過多介紹了,自行了解吧
CMD ["/usr/local/tomcat/bin/catalina.sh", "run","-Djava.security.egd=file:/dev/./urandom"]
6、測試完善后生成的容器
重新bulid鏡像后,按照正常的 -d 后台啟動方式試試好不好用
docker run -d --name tomcat01 -p 8090:8080 -it base-tomcat:latest
能夠正常訪問tomcat,那么就恭喜你咯
7、把項目加進去試試:
FROM centos MAINTAINER tomcat-image abc@163.com RUN yum install -y gcc* zlib zlib-devel make proc-devel net-tools openssl openssl-devel RUN yum install -y wget tar git unzip WORKDIR /home RUN echo "Asia/Shanghai" > /etc/timezone ADD jdk-8u20-linux-x64.tar.gz /usr/local/ RUN mv /usr/local/jdk1.8.0_20 /usr/local/java ENV JAVA_HOME /usr/local/java ENV PATH $PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin ENV CLASSPATH $JAVA_HOME/jre/bin:$JAVA_HOME/lib:$JAVA_HOME/jre/lib/charsets.jar ADD apache-tomcat-8.5.9.tar.gz /usr/local/ RUN mv /usr/local/apache-tomcat-8.5.9 /usr/local/tomcat WORKDIR /usr/local/tomcat ADD ./jpress.war /usr/local/tomcat/webapps
EXPOSE 8080
CMD ["/usr/local/tomcat/bin/catalina.sh", "run","-Djava.security.egd=file:/dev/./urandom"]
重新執行 3步和 6步
訪問:ip:8090/jpress
很榮幸,看到這里還有心情把它看完,說明你夠執着,已經無法自拔
https://www.cnblogs.com/starhu/p/5599773.html
該文件描述了如何啟動Tomcat Server.xml <Server> <Listener /> <GlobaNamingResources> </GlobaNamingResources <Service> <Connector /> <Engine> <Logger /> <Realm /> <host> <Logger /> <Context /> </host> </Engine> </Service> </Server>
對於目錄而言,COPY 和 ADD 命令具有相同的特點:只復制目錄中的內容而不包含目錄自身。比如我們在 Dockerfile 中添加下面的命令:
WORKDIR /app COPY nickdir ./
如果想讓 file1 和 file2 還保存在 nickdir 目錄中,需要在目標路徑中指定這個目錄的名稱,比如:
WORKDIR /app COPY nickdir ./nickdir
如果我們有一個壓縮文件包,並且需要把這個壓縮包中的文件添加到鏡像中。
需不需要先解開壓縮包然后執行 COPY 命令呢?當然不需要!我們可以通過 ADD 命令一次搞定:
WORKDIR /app ADD nickdir.tar.gz .
===============================================================================================================
tomcat修改banner,隱藏版本號
為了避免黑客針對某些版本進行攻擊,因此我們需要隱藏或者偽裝 Tomcat 的版本信息。
針對該信息的顯示是由一個jar包控制的,該jar包存放在 Tomcat 安裝目錄下的lib目錄下,名稱為 catalina.jar
兩種方式
方式一:是修改catalina.jar文件
進入tomcat的lib目錄找到catalina.jar文件
$ docker exec -it tomcat01 /bin/bash
[root@6b138d0d3725 ~]#cd /usr/local/tomcat/lib

2、解壓
unzip catalina.jar
會多出兩個文件夾(org、META-INF )
進入org/apache/catalina/util/目錄,編輯 ServerInfo.properties來實現來更改我們tomcat的版本信息
vi org/apache/catalina/util/ServerInfo.properties
3、修改為:
server.info=Apache Tomcat server.number=0.0.0.0
server.built=Dec 5 2016 20:18:12 UT
4、將修改后的信息壓縮回jar包
# cd /usr/local/tomcat/lib # jar uvf catalina.jar org/apache/catalina/util/ServerInfo.properties

5、重啟tomcat容器
docker restart tomcat01
發現上邊的大字體的版本沒有了但是還是有小字樣的大版本,不知道小版本號此時也很難進行版本漏洞的攻擊,大版本的通用bug也許會好下手
方式二、修改server屬性
在Connector中添加server屬性就可以了,具體如下:
cd /usr/local/tomcat/conf ,找到 server.xml
vi server.xml
修改后如下:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"
useBodyEncodingForURI="true" server="JBOSS 10.0.0.Final"/>
偽裝成 JBOSS 10.0.0.Final 服務器
3、Tomcat 默認是開啟了對war包的熱部署。為了防止被植入木馬等惡意程序,因此我們要關閉自動部署。
<Host name="localhost" appBase="" unpackWARs="false" autoDeploy="false">
線上是不使用 Tomcat 默認提供的管理頁面的,因此都會在初始化的時候就把這些頁面刪掉。這些頁面是存放在 Tomcat 安裝目錄下的webapps目錄下的ROOT。
我們只需要刪除該目錄下的所有文件即可。另外conf/Catalina/localhost目錄下的2個配置文件 host-manager.xml 和 manager.xml 也需要一並刪掉
4、建議使用專用用戶 tomcat 或者 nobody 用戶來啟動 Tomcat,為了防止 Tomcat 被植入 web shell 程序后,可以修改項目文件。
Tomcat啟動時卡在 INFO HostConfig.deployDirectory Deploying web application directory
今天在服務器上部署網站時 啟動tomcat無錯 tail -f catalina.out日志 和 catalina.sh
找到的辦法:
-
將vi $JAVA_HOME/jre/lib/security/java.security
-
將securerandom.source的內容改為file:/dev/./urandom即可

有2種解決方案:
1. 在Tomcat環境中解決:
可以通過配置 JRE 使用非阻塞的 Entropy Source:
在 catalina.sh 中加入這么一行:
JAVA_OPTS=
"$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom"
或者
./catalina.sh run -Djava.security.egd=file:/dev/./urandom
2. 在 JVM 環境中解決:
打開jdk安裝路徑 $JAVA_PATH/jre/lib/security/java.security 這個文件,找到下面的內容:
替換成:
這里值為何要在 dev 和 random 之間加一個點呢?是因為一個 JDK 的 bug,有人反饋即使對 securerandom.source 設置為 /dev/urandom 它也仍然使用的 /dev/random,有人提供了變通的解決方法,其中一個變通的做法是對 securerandom.source 設置為 /dev/./urandom 才行。也有人評論說這個不是 bug,是有意為之。
但是還是沒有卵用,不研究了(放棄折騰了),有時間再說吧~~~
java.security.SecureRandom源碼分析
https://blog.51cto.com/leo01/1795447
==================================================================================
使用yum查找jdk: yum search java|grep jdk
yum install java-1.8.0-openjdk
輸入y即可
安裝成功后,默認安裝路徑在/usr/lib/jvm/下邊,
如/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.144-0.b01.el6_9.x86_64
查看安裝路徑:
which java
ls -lrt /usr/bin/java
java -version
查看java是否可用:javac
錯誤原因:默認安裝完只有運行環境,java安裝目錄下只有jre文件夾
安裝開發環境yum install java-1.8.0-openjdk-devel.x86_64
安裝完可看到java安裝目錄下出現bin、lib等文件夾:
設置環境變量
修改/etc/profile文件:vi /etc/profile
在profile文件末尾新增如下內容:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH
source /etc/profile
[root@hadoop-01 ~]# java -jar -Djava.security.egd=file:/dev/./urandom app.jar --server.port=9090
Docker的spingboot部署實踐
下載 cmall-eureka.jar
重命名為app.jar 1.創建dockerfile的內容如下:
FROM openjdk:8 COPY ./app.jar /usr/local/
EXPOSE 9090 ENTRYPOINT ["java","-jar","-Djava.security.egd=file:/dev/./urandom","/usr/local/app.jar","--server.port=9090
"]
創建的鏡像文件確實夠大的,動不動就1~2GB
檢查jdk
docker run -it --name openjdk openjdk:8 /bin/bash
root@45adc4a695b9:/# java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-b04)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)
創建鏡像:
docker build -t eureka:latest .
啟動交互式容器
docker run -it --name eureka -p 9080:9090 eureka:latest /bin/bash
測試瀏覽器訪問:host-ip:9080
完美收工~~~
改成后台啟動
docker run -d --name eureka -p 9080:9090 eureka:latest
====================================================================================================================================================
補充一條solo的docker部署命令:
dockerhub上搜索 b3log/solo
獲取最新鏡像:docker pull b3log/solo
使用 MySQL
先手動建庫(庫名 solo
,字符集使用 utf8mb4
,排序規則 utf8mb4_general_ci
),然后啟動容器:
docker run -d --name solo -p 5000:8080 \
-e RUNTIME_DB="MYSQL" \
-e JDBC_USERNAME="root" \
-e JDBC_PASSWORD="123456" \
-e JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \
-e JDBC_URL="jdbc:mysql://www.****.com:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" \
b3log/solo --listen_port=8080 --server_scheme=http --server_host=www.****.com
-
這里的數據庫通過連接另外一個MySQL容器。
-
使用 H2 Database
docker run --detach --name solo --volume ~/solo_h2/:/opt/solo/h2/ --publish 5000:8080 \ --env RUNTIME_DB="H2" \ --env JDBC_USERNAME="root" \ --env JDBC_PASSWORD="123456" \ --env JDBC_DRIVER="org.h2.Driver" \ --env JDBC_URL="jdbc:h2:/opt/solo/h2/db;MODE=MYSQL" \ b3log/solo --listen_port=8080 --server_scheme=http --server_host=
www.****.com
啟動參數說明:
--listen_port
:進程監聽端口--server_scheme
:最終訪問協議,如果反代服務啟用了 HTTPS 這里也需要改為https
--server_host
:最終訪問域名或公網 IP,不要帶端口號
完整啟動參數的說明可以使用 -h
來查看。
NGINX 反代 upstream backend { server www.****.com:5000; # Solo 監聽端口 } server { listen 80; server_name 88250.b3log.org; # 博客域名 access_log off; location / { proxy_pass http://backend$request_uri; proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; client_max_body_size 10m; } }
使用說明:
https://hacpai.com/article/1492881378588
公告欄-視頻嵌套:
<h3 color="red">公告欄 廣告位招募</h3>
<!-- 公告欄可使用 HTML、JavaScript,比如可以在此加入第三方統計 js -->
<video src="https://1251101074.vod2.myqcloud.com/40efee9dvodtransgzp1251101074/cd4908ff5285890788507737188/v.f30.mp4"
controls="controls" autoplay
width="250px;" height="140px;">
您的瀏覽器不支持 video 標簽。
</video>
<!-- <img src="https://www.imooc.com/static/img/index/logo.png" alt="" /> -->
====================================================================================================================================================
1.創建dockerfile的內容如下:
FROM openjdk:8
COPY ./app.jar /usr/local/
EXPOSE 6000
ENTRYPOINT ["java","-jar","-Djava.security.egd=file:/dev/./urandom","/usr/local/app.jar","--server.port=6000"]
2.創建docker-compose.yml的內容如下:
version: "3"
services:
web:
build:
context: .
dockerfile: Dockerfile
ports:
- 6060:6000
restart: always
container_name: regist
3、啟動容器:
docker-compose up -d
docker-compose down
5、docker-compose實現單機的負載均衡
修改docker-compose.yml文件(容器名稱container_name和端口ports需要自動生成不需要手動指定)
version: "3" services: web: build: context: . dockerfile: Dockerfile restart: always
docker-compose up --scale web=3 -d
docker-compose.yml追加如下內容,創建容器halb並 link 到 web
halb:
image: dockercloud/haproxy
links:
- web
ports:
- 5060:80
volumes:
- /var/run/docker.sock:/var/run/docker.sock
暫停容器進行測試
docker pause tmp_web_1 docker pause tmp_web_2 docker pause tmp_web_3
全部暫停會報如下圖提示:
docker unpause tmp_web_3 docker unpause tmp_web_2 docker unpause tmp_web_1
docker-compose 適用於本地開發測試環境,並不適用於生產環境
查看端口占用
[root@hadoop-01 bin]# netstat -nlp | grep 8080
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 16927/java
[root@hadoop-01 bin]# kill -9 16927
markdown編輯器,程序員的最愛
Markdown 語法整理大集合2017
Docker 微服務教程(阮一峰)
http://www.ruanyifeng.com/blog/2018/02/docker-wordpress-tutorial.html