Posts tagged ‘blog’

Docker私服Sonatype Nexus的搭建与使用

为什么要建docker私服

  • 官服在国外,速度慢
  • 创建的镜像是私有的,不想公开传到外部服务器上

Sonatype Nexus介绍

Sonatype Nexus是一个仓库管理软件,支持Maven、Docker、Bower、PyPI、Yum等类型仓库。使用Maven管理依赖的Java程序员一定不陌生,搭建Maven私服基本是用这个。注意:3.x版本才支持docker。

今天我们就用Nexus作Docker的私服,管理我们自己的私有镜像。

Sonatype Nexus安装

很简单,下载,解压,我的路径是
/usr/local/nexus-3.11.0-01
创建开机启动脚本
vim /etc/systemd/system/nexus.service
内容如下:

[Unit]
Description=nexus service
After=network.target

[Service]
Type=forking
LimitNOFILE=65536
ExecStart=/usr/local/nexus-3.11.0-01/bin/nexus start
ExecStop=/usr/local/nexus-3.11.0-01/bin/nexus stop
Restart=on-abort

[Install]
WantedBy=multi-user.target

设置开机启动
systemctl enable nexus
启动
systemctl start nexus

nexus默认端口是8081, 现在打开浏览器,访问http://ip:8081, 应该能看到如下界面

点击右上角Sign in,账号admin 密码admin123,登录

点击admin ,把默认的密码改掉,安装完成。

创建仓库

点击顶部配置图标,切到配置页面,左侧菜单选Repositories, 打开仓库配置,点击Create repository 创建仓库。

我之前已经创建好,配置如下图

注意,这里HTTP设置了一个10008端口,仅供docker使用,找个不冲突的就行。

docker配置

docker仓库默认需要https支持,但nexus没有配ssl,需要将服务器加到insecure-registries。
vim /etc/docker/daemon.json

{
  "registry-mirrors": ["https://registry.docker-cn.com"],
  "insecure-registries":["192.168.0.201:10008"]
}

我的nexus部署在192.168.0.201 后面的端口10008与创建仓库时对应。

登录仓库:
docker login 192.169.0.201:10008
按提示输入nexus的账号密码。登录一次以后,会自动保存,以后pull/push都不需要再登录。

docker 提交镜像

  1. 将正在运行的container打包成image

    如图,nginx2容器基于nginx镜像,但是改了一些配置, 现在我们将其打包成image
    docker commit -m "nginx modified" -a "Exception" cb4cbbcde646 nginx-modified

    -m 描述
    -a 作者
    cb4cbbcde646 container id
    nginx-modified 生成的image名
    现在再看镜像列表:
    
    发现我们刚刚commit的image已经在里面了。

  2. 给image打标签
    docker tag f3b408f36cf7 192.168.0.201:10008/nginx-modified

    f3b408f36cf7 image id
    192.168.0.201:10008/nginx-modified 仓库地址和保存路径

  3. 推送镜像
    docker push 192.168.0.201:10008/nginx-modified

  4. 下载镜像
    在另一台服务器上,如果要下载镜像,重复上面的docker配置步骤,然后pull
    docker pull 192.168.0.201:10008/nginx-modified

systemctl开机启动zookeeper

用systemctl使zookeeper开机启动,网上看了好多章,没一个好使,自己琢磨折腾了一个下午总算把它搞定。
直接上脚本:/etc/systemd/system/zookeeper.service

[Unit]
Description=zookeeper.service
After=network.target
[Service]
Type=forking
Environment=ZOO_LOG_DIR=/usr/local/zookeeper-3.4.11/
Environment=PATH=/usr/local/jdk1.8.0_152/bin:/usr/local/jdk1.8.0_152/jre/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin
ExecStart=/usr/local/zookeeper-3.4.11/bin/zkServer.sh start
ExecStop=/usr/local/zookeeper-3.4.11/bin/zkServer.sh stop
ExecReload=/usr/local/zookeeper-3.4.11/bin/zkServer.sh restart
PIDFile=/tmp/zookeeper/zookeeper_server.pid
User=www
[Install]
WantedBy=multi-user.target

重点在两行Environment。

  • 第一行设置日志目录,如果没有设置,默认是当前目录,对www用户来说,可能没有权限。
  • 第二行是配置环境变量,systemd用户实例不会继承类似.bashrc中定义的环境变量,所以是找不到jdk目录的,而zookeeper又必须有。

保存后,reload

systemctl daemon-reload

启用开机自启

systemctl enable zookeeper

启动服务

systemctl start zookeeper

Springboot 启动脚本

Springboot项目可以直接通过

java -jar xxx.jar

命令启动,但是开启关闭还是有个脚本会比较方便。自己写了个shell脚本,功能是查找当前目录下的jar文件,然后启动,也可以关闭,重启。经过几次修改,个人觉得比较完美了,放出源码:

#! /bin/bash
# springboot的jar放同级目录下即可,只能有一个jar文件
export PATH=$JAVA_HOME/bin:$PATH
CURRENT_PATH=$(cd "$(dirname "$0")"; pwd)
JAR=$(find $CURRENT_PATH -maxdepth 1 -name "*.jar")
PID=$(ps -ef | grep $JAR | grep -v grep | awk '{ print $2 }')

case "$1" in
    start)
        if [ ! -z "$PID" ]; then
            echo "$JAR 已经启动,进程号: $PID"
        else
            echo -n -e "启动 $JAR ... \n"
            cd $CURRENT_PATH
        nohup java -jar $JAR >/dev/null 2>&1 &
            if [ "$?"="0" ]; then
                echo "启动完成,请查看日志确保成功"
            else
                echo "启动失败"
            fi
        fi
        ;;
    stop)
        if [ -z "$PID" ]; then
            echo "$JAR 没有在运行,无需关闭"
        else
            echo "关闭 $JAR ..."
              kill -9 $PID
            if [ "$?"="0" ]; then
                echo "服务已关闭"
            else
                echo "服务关闭失败"
            fi
        fi
        ;;
    restart)
        ${0} stop
        ${0} start
        ;;
    kill)
        echo "强制关闭 $JAR"
        killall $JAR
        if [ "$?"="0" ]; then
            echo "成功"
        else
            echo "失败"
        fi
        ;;
    status)
        if [ ! -z "$PID" ]; then
            echo "$JAR 正在运行"
        else
            echo "$JAR 未在运行"
        fi
        ;;
  *)
    echo "Usage: ./springboot {start|stop|restart|status|kill}" >&2
        exit 1
esac

脚本会找到当前目录下的jar文件,所以,只能放一个jar文件。

开机启动脚本:

[Unit]
Description=Dubbo-admin
Wants=network.target
[Service]
Environment=JAVA_HOME=/usr/local/jdk1.8.0_171
Type=forking
ExecStart=/usr/local/xxx/springboot start
ExecStop=/usr/local/xxx/springboot stop
[Install]
WantedBy=multi-user.target

Spring boot+mybatis+druid+SQL监控配置

之前写过一篇搭建Spring boot + mybatis + freemarker项目,Spring boot默认的数据库连接池是tomcat-jdbc,今天我们要用druid替换它。

什么是druid

druid是阿里巴巴开源的数据库连接池,自称是Java语言中最好的数据库连接池,提供强大的监控和扩展功能。

Continue reading “Spring boot+mybatis+druid+SQL监控配置” »

Spring boot 注册Servlet和Filter

使用Spring开发web程序,在大部分情况下,都是通过Spring默认的DispatcherServlet,转发请求到Controller,我们在Controller里处理请求。但有时候,可能有些请求我们不希望通过Spring,而是通过其他Servlet处理。如果是普通的Spring项目,注册Filter和Servlet只需在web.xml时添加filter、filter-mapping、servlet、servlet-mapping,但Spring boot项目里没有web.xml。

Spring boot有两种方法注册Servlet和Filter:代码注册、注解注册。
Continue reading “Spring boot 注册Servlet和Filter” »

Java jstack用法

jstack是jdk中自带的用于查看进程内线程栈的工具。当程序出现死锁时,我们可以通过jstack打印线程栈找到问题。

找出代码中的死锁

学习从一段简单的代码开始:

Continue reading “Java jstack用法” »

java jstat 用法

jstat是jdk自带的JVM内存统计工具,用于查看heap的内存和垃圾回收情况。

用法:

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

Continue reading “java jstat 用法” »

搭建Spring boot + mybatis + freemarker项目

Spring boot是什么?

可以将Spring boot理解为spring项目的脚手架,它会默认配置我们引入的第三方依赖模块(jar),我们无需再用繁琐的xml配置,也可以快速搭建spring项目。Spring boot还内嵌了web容器(默认tomcat),服务器上不再需要单独安装tomcat,只需运行jar包即可。非常适合开发现在流行的微服务,拆分独立业务。

Spring boot优点

  1. 降低开发成本。大大简化了项目搭建时xml配置。
  2. 降低运维成本。内嵌了tomcat,不再需要运维再搭建tomcat.
  3. ...

Continue reading “搭建Spring boot + mybatis + freemarker项目” »