基于容器docker搭建hybris集群

目录

[TOC]


1.环境准备

  1. 租用服务器
    开始我是在win10上学习使用docker,有许多不方便,后面选择了租用一个服务器,最终选择vultr,原因有二:
    1.初次使用会赠送10美元,相当于免费使用1G2核的服务器一个月。
    2.按小时计费,这样你就可以租用多台,学习集群相关的
    最终我租用了3台服务器,用于搭建多节点集群
环境 信息
系统 Ubuntu 17.10 x64
docker server 18.03.1-ce
docker client 18.03.1-ce

2.安装docker、docker-compose

安装步骤简单,详情参考:点我

3.编写Dockerfile

  1. 镜像一
FROM ubuntu:latest as basecontainer
MAINTAINER liangjun.gong <glj381413362@gmail.com>
ARG DEBIAN_FRONTEND=noninteractive
ARG HYBRIS_HOME=/home/hybrisUser/hybris
ARG HYBRIS_USER_HOME=/home/hybrisUser
ARG VCS_REF

LABEL version="1.0"

ENV GOSU_VERSION 1.10
# hybris needs unzip and lsof for the solr server setup
# hybris needs unzip and lsof for the solr server setup
RUN    apt-get update \
    && apt-get install -y --no-install-recommends ca-certificates wget subversion vim\
    && apt-get install -y --install-recommends dirmngr

# grab gosu for easy step-down from root
RUN set -x \
    && dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')" \
    && wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch" \
    && wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc" \
    && export GNUPGHOME="$(mktemp -d)" \
    && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
    && gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \
    && chmod +x /usr/local/bin/gosu \
    && gosu nobody true

# hybris needs the JAVA_HOME environment variable even if java is in path
ENV JAVA_HOME /usr/lib/jvm/java-8-oracle

# hybris needs unzip and lsof for the solr server setup
RUN    apt-get update \
    && apt-get install -y --no-install-recommends software-properties-common apt-utils ca-certificates net-tools curl unzip lsof wget vim \
    && add-apt-repository ppa:webupd8team/java \
    && echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections \
    && apt-get install -y oracle-java8-installer  \
    && apt-get autoclean && apt-get --purge -y autoremove \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /var/cache/* /usr/lib/jvm/java-8-oracle/*src.zip    

# set the PLATFORM_HOME environment variable used by hybris
ENV PLATFORM_HOME=${HYBRIS_HOME}/bin/platform/
ENV PATH=$PLATFORM_HOME:$PATH
ENV HYBRIS_HOME=${HYBRIS_HOME}    
ENV HYBRIS_USER_HOME=${HYBRIS_USER_HOME}

# add hybris user
 RUN useradd -d ${HYBRIS_USER_HOME} -u 1000 -m -s /bin/bash hybrisUser
ARG HYBRIS_DATA=/home/hybrisData
# define hybris home dir as volume
VOLUME ${HYBRIS_DATA}

# expose hybris ports
EXPOSE 9001
EXPOSE 9002

# expose default solr port
EXPOSE 8983

# expose the default debug port for connecting via IDE
EXPOSE 8000

# copy the entrypoint script over
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

# copy the update system config to image
# COPY updateRunningSystem.config ${HYBRIS_HOME}/updateRunningSystem.config

# WORKDIR ${HYBRIS_HOME}

# set entrypoint of container
ENTRYPOINT ["/entrypoint.sh"]

CMD ["run"]

镜像一里主要安装一些必要的工具和依赖,创建了一个用户hybrisUser用户,指定了hybrisUser用户主目录为${HYBRIS_HOME},基于该镜像运行的容器进入点为/entrypoint.sh脚本,当某个容器基于此镜像运行时,会执行/entrypoint.sh脚本

  • entrypoint.sh脚本,当容器启动时会运行此脚本
#!/bin/bash

export DOCKER_CONTAINER_IP=$(ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p')

if [ "$1" = 'run' ]; then

    if [ -z "$HYBRIS_HOME" ]; then
        HYBRIS_HOME="/home/hybrisUser/hybris"
    fi

    if [ ! -d "$HYBRIS_HOME/config" ]; then

        echo "cluster.broadcast.method.jgroups.tcp.bind_addr=$DOCKER_CONTAINER_IP" >> config/local.properties

    fi

    cd ${PLATFORM_HOME}

    # fix ownership of files
    chown -R hybrisUser $HYBRIS_HOME
    chmod +x hybrisserver.sh

    #hybris ant clean all
    #exec gosu hybris ant clean all

    # run hybris commerce suite as user hybrisUser
    exec gosu hybrisUser ./hybrisserver.sh $2

fi

exec "$@"

将镜像一放入私有仓库
构建镜像一:docker build -t hybris_base
将镜像打tag:docker tag hybris_base 45.76.175.5:5000/lz/hybris-base:v1
将镜像push到仓库:docker push 45.76.175.5:5000/lz/hybris-base

  1. 镜像二
FROM 45.76.175.5:5000/lz/hybris-base
ENV HYBRIS_VERSION 5.6.0.2
ARG HYBRIS_USER_HOME=/home/hybrisUser
# download hybris
# COPY hybris-commerce-suite-"${HYBRIS_VERSION}".zip ${HYBRIS_USER_HOME}/

COPY hybris-commerce-suite-"${HYBRIS_VERSION}".zip ${HYBRIS_USER_HOME}/temp/
COPY local.properties ${HYBRIS_USER_HOME}/temp/
COPY localextensions.xml ${HYBRIS_USER_HOME}/temp/
COPY jrebel ${HYBRIS_USER_HOME}

WORKDIR ${HYBRIS_USER_HOME}/temp/
ENV PLATFORM_HOME=${HYBRIS_HOME}/bin/platform
RUN unzip hybris-commerce-suite-"${HYBRIS_VERSION}".zip -d ${HYBRIS_USER_HOME}/ \
&& cd ${HYBRIS_HOME}/../installer \
&& chmod +x install.sh \
&& ./install.sh -r b2c_acc 
ENV ANT_OPTS="-Xmx512m -Dfile.encoding=UTF-8"
ENV ANT_HOME=$PLATFORM_HOME/apache-ant-1.9.1 
RUN chmod +x $ANT_HOME/bin/ant \
&& chmod +x $PLATFORM_HOME/license.sh 
ENV PATH=$ANT_HOME/bin:$PATH 
WORKDIR $PLATFORM_HOME
RUN ant clean all


WORKDIR ${HYBRIS_USER_HOME}/temp/
COPY local.properties ${HYBRIS_HOME}/config/
COPY localextensions.xml ${HYBRIS_HOME}/config/

WORKDIR ${HYBRIS_HOME}/bin/custom/hep
RUN svn checkout SVN_URL --username SVN_USER_NAME --password SVN_PASSWOD --non-interactive --trust-server-cert
RUN mv hep_prod hep

镜像二基于镜像一,镜像二主要是pull了svn里的代码,替换了local.properties和localextensions.xml
将镜像二放入私有仓库
构建镜像二:docker build -t hybris
将镜像打tag:docker tag hybris 45.76.175.5:5000/lz/hybris:v1
将镜像push到仓库:docker push 45.76.175.5:5000/lz/hybris

TIP:需要将hybris-commerce-suite-“${HYBRIS_VERSION}”.zip、local.properties 和localextensions.xml文件放在和Dockerfile同一级目录,替换成参数 SVN_URL 、SVN_USER_NAME、 SVN_PASSWOD

  1. Jenkins的Dockerfile
    为什么不直接Pull Jenkins的Image文件,因为待会需要进行dotnet core的Docker自动部署,需要对宿主机上的Docker进行直接操作,那么需要挂载Docker给Jenkins Image所以现在需要自己动手编写 Dockerfile 构建自定义的 Jenkins。
FROM jenkins as jenkinscontainer

USER root
#清除了基础镜像设置的源,切换成腾讯云的jessie源
#使用非腾讯云环境的需要将 tencentyun 改为 aliyun
RUN echo '' > /etc/apt/sources.list.d/jessie-backports.list \
 && echo "deb http://mirrors.tencentyun.com/debian jessie main contrib non-free" > /etc/apt/sources.list \
 && echo "deb http://mirrors.tencentyun.com/debian jessie-updates main contrib non-free" >> /etc/apt/sources.list \
 && echo "deb http://mirrors.tencentyun.com/debian-security jessie/updates main contrib non-free" >> /etc/apt/sources.list
#更新源并安装缺少的包
RUN apt-get update && apt-get install -y libltdl7 && apt-get update

ARG dockerGid=999

RUN echo "docker:x:${dockerGid}:jenkins" >> /etc/group 

# 安装 docker-compose 因为等下构建环境的需要
RUN curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

RUN chmod +x /usr/local/bin/docker-compose

  1. 安装docker-enter
    从Docker 1.3开始,您可以使用Docker exec来输入Docker容器,例如:
docker exec -it CONTAINER_NAME /bin/bash

nsenter和docker exec之间存在差异; 即nsenter不会进入cgroups,因此可以避免资源限制。这样做的潜在好处是调试和外部审计,但对于远程访问,docker exec是目前推荐的方法。

开始安装:

docker run --rm -v /usr/local/bin:/target jpetazzo/nsenter

安装完毕,进入容器内部:docker-enter 容器id/容器名字
退出:Ctrl+P Ctrl+Q

4.搭建私有仓

  1. pull + run Registry
    运行:docker run -d -p 5000:5000 -vpwd/data:/var/lib/registry --restart=always --name registry registry:2
  2. 打tag镜像
    运行:docker tag hi11 45.76.175.5:5000/lz/hybris-base:v1
    tip:镜像命名规则:ip:端口/镜像名称:版本号
  3. push镜像到仓库
    运行:docker push 45.76.175.5:5000/lz/hybris-base
    报错:Get https://45.76.175.5:5000/v2/: http: server gave HTTP response to HTTPS client
    从错误信息来看,client与Registry交互,默认将采用https访问
    解决方法:
    修改 /etc/default/docker 的 DOCKER_OPTS=”–insecure-registry 45.76.175.5:5000″
    然后重启docker 服务

    发现更改的设置并没有起效果,简单粗暴的方法直接修改:/lib/systemd/system/docker.service文件,在ExecStart后面加入需要修改的参数

    然后重载:systemctl daemon-reload
    重启docker:service docker restart

    发现更改已经生效。
    启动registry容器继续push:docker push 45.76.175.5:5000/lz/hybris-base
    push完查看仓库镜像:curl -X GET http://45.76.175.5:5000/v2/_catalog
    查看仓库某个镜像版本记录:curl http://45.76.175.5:5000/v2/lz/hybris-base/tags/list

    我们将本地的tag做untag处理,再从Registry pull相关image:
    运行:docker rmi 45.76.175.5:5000/lz/hybris-base:v1

    继续pull镜像:docker pull 45.76.175.5:5000/lz/hybris-base:v1

Tip:镜像存放位置:/var/lib/registry/docker/registry/v2/repositories

5.使用Registrator + Consul + Consul-template + nginx搭建集群

环境信息
这里我使用两台物理机搭建实现真正分布式的效果:

host name 物理机IP services
host-1 45.76.175.5 registrator、hybris、consul-server、consul-template、nginx
host-2 45.77.122.223 registrator、hybris、consul-server
  1. 在两台物理机上运行以下命令下载最新版本的docker-compose:
    运行:sudo curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compos
  2. 更改二进制文件的权限,使其能够运行
    运行:sudo chmod +x /usr/local/bin/docker-compose
  3. 查看版本
    运行:ocker-compose --version

物理机一

  1. 创建模板文件 docker-compose.yml
version: "3"
services:
  web:
    image: 45.76.175.5:5000/lz/hybris-empty:v1
    environment:
      SERVICE_TAGS: backend-1
      MY_HOST: host-1
    ports:
      - "9001"

  consulserver:
    image: progrium/consul:latest
    environment:
      SERVICE_TAGS: consul servers
    hostname: consulserver-node1
    ports:
      - "8300:8300"
      - "8301:8301"
      - "8301:8301/udp"
      - "8302:8302"
      - "8302:8302/udp"
      - "8400:8400"
      - "8500:8500"
      - "53"
    command: -server -ui-dir /ui -advertise 45.76.175.5 -bootstrap-expect 2

  lb:
    build:
      image: 45.76.175.5:5000/lb:v1
    hostname: lb
    ports:
      - "80:80"

  registrator:
    image: gliderlabs/registrator:master
    hostname: registrator
    volumes:
      - "/var/run/docker.sock:/tmp/docker.sock"
    command: -ip=45.76.175.5 consul://45.76.175.5:8500

这里的host-1是我自己设置的物理机的名称,不是操作系统那hostname,纯粹是为了在页面上好显示,以及后期多个物理机实验的时候好区分不同物理机器,所以自定义了一个临时名称。它对应docker-compose.yml中的MY_HOST环境变量,会通过docker容器传递到hybris-empty的运行环境中。
参数解释
* hostname:将来consul节点都靠这个来标识了,所以每个物理机上的节点名称都要区别开,以免冲突。
* -bootstrap-expect 2,这个参数的作用是,当consulserver-node1节点启动之后,等待另外一个节点的加入,2个节点聚齐后,之后才开始选举leader。
* -advertise 45.76.175.5,如果要让节点在WAN网络中被发现,就要配置这个参数,暴露出外网ip。如果只在LAN中被发现,就不用配置这个了,默认绑定内网ip。
* -ui-dir /ui,这个配置是指定当前节点支持consul ui的web页面。

以上模板文件中使用到一组名为lb的服务,其对应的Dockerfile如下:

FROM alpine:latest
MAINTAINER liangjun.gong <glj381413362@gmail.com>

# install nginx runit curl
RUN apk --update --no-cache add nginx curl runit

#ENV CT_URL http://releases.hashicorp.com/consul-template/0.19.0/consul-template_0.19.0_linux_amd64.tgz
#RUN curl -L $CT_URL | tar -C /usr/local/bin/ --strip-components 1 -zxf -
ADD consul-template_0.19.0_linux_amd64.tgz /usr/local/bin/

ADD nginx.service /etc/service/nginx/run
RUN chmod a+x /etc/service/nginx/run
ADD consul-template.service /etc/service/consul-template/run
RUN chmod a+x /etc/service/consul-template/run

RUN rm -v /etc/nginx/conf.d/*
RUN mkdir -p /run/nginx/
ADD nginx.conf.ctmpl /etc/consul-templates/nginx.conf.ctmpl

CMD ["runsvdir", "/etc/service"]

在使用Dockerfile构建镜像时需要用到以下几个文件:
– nginx.service

#!/bin/sh

nginx -c /etc/nginx/nginx.conf -t && \
  nginx -c /etc/nginx/nginx.conf -g "daemon off;"
  • consul-template.service
#!/bin/sh

exec consul-template \
     -consul-addr=45.76.175.5:8500 \
     -template "/etc/consul-templates/nginx.conf.ctmpl:/etc/nginx/conf.d/app.conf:nginx -s reload"
  • nginx.conf.ctmpl
{{range services}} {{$name := .Name}} {{$service := service .Name}}
upstream {{$name}} {
  zone upstream-{{$name}} 64k;
  {{range $service}}server {{.Address}}:{{.Port}} max_fails=3 fail_timeout=60 weight=1;
  {{else}}server 127.0.0.1:65535; # force a 502{{end}}
} {{end}}

server {
  listen 80 default_server;

  location / {
    root /usr/share/nginx/html/;
    index index.html;
  }

  location /stub_status {
    stub_status;
  }

{{range services}} {{$name := .Name}}
  location /{{$name}} {
    proxy_pass http://{{$name}};
  }
{{end}}
}

Tip:如何查看你编写的nginx.conf.ctmpl模板文件对应生成的Nginx配置文件呢?
当服务lb启动好了,进入对应的容器运行:
consul-template -consul-addr 45.76.175.5:8500 -template="nginx.conf.ctmpl:test.conf" -once

物理机二

  1. 创建模板文件 docker-compose.yml
version: "3"
services:
  web:
    image: 45.76.175.5:5000/lz/hybris-empty:v1
    environment:
      SERVICE_TAGS: backend-2
      MY_HOST: host-2
    ports:
      - "9001"

  consulserver:
    image: progrium/consul:latest
    environment:
      SERVICE_TAGS: consul servers
    hostname: consulserver-node2
    ports:
      - "8300:8300"
      - "8301:8301"
      - "8301:8301/udp"
      - "8302:8302"
      - "8302:8302/udp"
      - "8400:8400"
      - "8500:8500"
      - "53"
    command: -server -advertise 45.77.122.223  -join 45.76.175.5

  registrator:
    image: gliderlabs/registrator:master
    hostname: registrator-2
    volumes:
      - "/var/run/docker.sock:/tmp/docker.sock"
    command: -ip=45.77.122.223 consul://45.76.175.5:8500

参数解释
* -join 45.76.175.5 意思是把本节点加入到45.76.175.5这个ip的节点中,这是consulserver-node1的地址。我们上一个host的配置中表明,consulserver-node1这个节点启动后,会等待另外一个节点的加入,我们这里就是加入它。

注意:到这里你可能有疑问,上文的2个consul节点都是server节点,那client节点哪里去了,没有client节点怎么访问集群啊?我们和集群交互可是访问client,client再转发到server节点的。其实每个server节点,本身就具有client的功能,只是多了一些把所有的信息持久化的本地以及选举leader的功能呢,这样遇到故障,信息是可以被保留的。所以,这里我们每个主机上部署registrator的时候,配置的访问consul服务的地址也是就近访问本机上的consul节点,把它当成一个consul client访问就可以了。当然也可以单独部署一个client节点,只是我们至少要保证有3个server节点,才能完成leader选举,如果再多几台机器我会考虑专门加一个client节点。

通过docker-compose启动容器

到这里,两个物理机上的模板文件docker-compose.yml都已经准备好,接下来运行容器:
去到docker-compose.yml所在目录运行(这里nginx.conf.ctmpl、nginx.service、Dockerfile、consul-template.service需要和docker-compose.yml在相同目录下):

运行:docker-compose up -d等待启动完毕,这里我们可以指定每类服务器启动多少个容器,比如:我们需要在物理机二上运行3个web服务,则我们等服务启动好后运行:docker-compose scale web=3

通过docker-compose停止容器

去到docker-compose.yml所在目录运行运行:docker-compose down

查看效果

进入consul ui的web页面,这里由于我们只配置了物理机一上的consulserver服务能访问consul ui的web页面,所以访问:http://45.76.175.5:8500/ui/#/dc1/services

因为我在物理机一上运行了docker-compose scale web=2、物理机二上运行了docker-compose scale web=3所以总计是5个web服务

除了查看ui界面外,也可以使用命令行看看有哪些服务注册了(需要安装jq),在新终端下执行
curl 45.77.122.223:8500/v1/catalog/services|jq .

6.用swarm管理集群

初始化swarm

  1. 在物理机一上初始化swarm
    运行:docker swarm init --advertise-addr 你的ip:你的端口docker swarm init 此时默认为你的ip:2377

* –advertise-addr 你的ip:你的端口:指定Manager Node发布对外服务地址,后续Worker Node加入到该Swarm集群,必须要能够访问到Manager的该IP地址

此时物理机一上的node已经默认为manager身份,此时查看docker info :

1. 如何加入swarm管理的集群
以Manager身份加入集群,在Manager节点运行docker swarm join-token manager查询如何加入集群
以worker身份加入集群,在Manager节点运行docker swarm join-token worker查询如何加入集群

然后在物理机二上运行刚刚查询出来的命令即可加入,然后在Manager(物理机一)节点上查看当前集群节点:docker node ls

上面信息中,AVAILABILITY表示Swarm Scheduler是否可以向集群中的某个Node指派Task,对应有如下三种状态:
* Active:集群中该Node可以被指派Task
* Pause:集群中该Node不可以被指派新的Task,但是其他已经存在的Task保持运行
* Drain:集群中该Node不可以被指派新的Task,Swarm Scheduler停掉已经存在的Task,并将它们调度到可用的Node上
查看当前节点的详细信息,docker node inspect self
1. 给Node添加标签元数据
每个Node的主机配置情况可能不同,比如有的适合运行CPU密集型应用,有的适合运行IO密集型应用,Swarm支持给每个Node添加标签元数据,这样可以根据Node的标签,来选择性地调度某个服务部署到期望的一组Node上
给SWarm集群中的某个Worker Node添加标签,执行如下命令格式如下:
docker node update –label-add 键名称=值
2. 排空某一个节点/恢复某一个节点
对服务进行停机维护,可以修改AVAILABILITY为Drain状态
排空某一个节点:docker node update --availability drain <hostname/ID>
恢复某一个节点:docker node update --availability Active <hostname/ID>
1. 删除节点
如果你确实想要从swarm集群中删除,你应该先把这个节点容器排空,然后再把节点从集群中去掉
排空节点(其实就是把这个节点上的容器先从其它节点启动,再停掉排空节点上的容器,保证你定义服务的预先状态不受影响)
删除节点:docker node rm <节点>或者docker node rm --force <节点>
docker node 常用命令
* docker node ls #查看所有集群节点
* docker node rm #删除某个节点(-f强制删除)
* node inspect ##查看节点详情
* docker node demote #节点降级,由管理节点降级为工作节点
* docker node promote #节点升级,由工作节点升级为管理节点
* docker node update #更新节点
* docker node ps #查看节点中的 Task 任务

部署服务到集群

  1. 部署单个服务
    运行:docker service create --replicas 1 --name web-1 45.76.175.5:5000/lz/hybris-empty:v1
    docker service 常用命令

* docker service create #部署服务
* docker service inspect #查看服务详情
* docker service logs #产看某个服务日志
* docker service ls #查看所有服务详情
* docker service rm #删除某个服务(-f强制删除)
* docker service scale #设置某个服务个数
* docker service update #更新某个服务
1. 使用Docker Stack 部署多个集群服务
运行:docker stack deploy -c ./docker-compose.yml deploy-test-node2
参数解释
* -c:–compose-file strings Path to a Compose file
docker stack 常用命令
* docker stack deploy #部署新的堆栈或更新现有堆栈
* docker stack ls #列出现有堆栈
* docker stack ps #列出堆栈中的任务
* docker stack rm #删除堆栈
* docker stack services #列出堆栈中的服务
* docker stack down #移除某个堆栈(不删数据)
1. 扩容缩容服务
命令格式:docker service scale 服务ID=服务Task总数
运行:docker service scale m65uuqv6zfyw=2

1. 删除服务
命令格式:docker service rm 服务ID
1. 滚动更新
对于服务需要更新的场景,我们可以在多个Node上进行增量部署更新,Swarm Manager支持通过使用Docker CLI设置一个delay时间间隔,实现多个服务在多个Node上依次进行部署。这样可以非常灵活地控制,如果有一个服务更新失败,则暂停后面的更新操作,重新回滚到更新之前的版本。
在Manager Node上执行如下命令:
docker service create \ --replicas 3 \ --name web-2 \ --update-delay 1000s \ 45.76.175.5:5000/lz/hybris-empty:v1
上面通过指定 –update-delay
选项,表示需要进行更新的服务,每次成功部署一个,延迟1000秒钟,然后再更新下一个服务。如果某个服务更新失败,则Swarm的调度器就会暂停本次服务的部署更新。
另外,也可以更新已经部署的服务所在容器中使用的Image的版本,例如执行如下命令:
docker service update --image 45.76.175.5:5000/lz/hybris-empty:v2 web-1
将web-1服务对应的Image版本由v1更新为v2,同样,如果更新失败,则暂停本次更新。
1. 查看服务状态
命令格式:docker service inspect --pretty <服务名称>

Swarm 的Web管理(Portainer、Shipyard、Docerkui)

  1. Portainer安装
    运行:docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
    参数解释:

* -d 参数以detach方式运行
* -p 将容器工作端口映射至物理机端口 HOST端口:容器端口
* -v 将容器目录挂载(映射)到物理机对应位置,这里指定通讯方式为sock
* portainer/portainer 为镜像名称

在Rancher中使用swarm

安装Rancher(容器管理平台)

  1. 运行rancher容器命令:sudo docker run -d --restart=always -p 8080:8080 rancher/server
  2. 显示 Rancher 服务器器的容器 ID,替换containerid
    sudo docker ps
  3. 显示并查看 Rancher 服务器的日志
    sudo docker logs -f containerid
    启动 Rancher 服务器可能需要花几分钟时间。这取决于您下载 Rancher Server镜像的速度。当日志中显示 “Startup Succeeded, Listening on port…” 以后,Rancher UI 图形界面现在就能正常访问了。
    Rancher 服务器的图形界面访问端口是 8080 ,通过在浏览器中访问这个网址 http://linux_host_ip:8080 , 您就可以打开 Rancher 服务器的图形界面

选择集群管理环境

  1. 这里我选择swarm进行集群管理


    然后切换到刚刚创建好的test环境:




    运行完以上命令后,可查看物理机上多了两个容器,一个是rancher server和rancher agent

查看效果



可以发现,里面包括scheduler、swarm、portainer、healthcheck几个正在运行的容器,用于管理容器的调度策略,容器的健康检查和容器图形界面管理

搭建开发环境

  1. 选择swarm->基础设施
  2. 选择添加应用

    点击创建后,选择swarm->基础设施


    在添加服务时,可以选择对服务进行健康检查

    Rancher 通过在它的主机上运行托管网络代理端实现了健康监控系统用来协调容器和服务的分布式健康检查。这些网络代理端在内部使用 HAProxy 来验证你的应用的健康状态。当无论单独容器还是服务的健康检查被开启后,每个容器都会被多至三个网络代理端所监控,代理端运行于不同于容器主机的主机上。如果至少有一个 HAProxy 实例汇报“通过”的健康检查,容器就会被认为是健康的,当所有 HAProxy 实例都汇报“不健康”的健康检查,就认为容器是不健康的。

容器资源监控

大家明确一个问题,因为容器有一个很重要的特性就是随时启动运行,随时停止销毁,所以我们的监控也需要支持,能够随着容器的启动运行,并自动加入监控,当销毁时,监控能够自动删除

日志收集

graylog 安装配置

  1. 获取默认配置文件
    运行:mkdir -p /graylog/config
    运行:cd /graylog/config
    运行:wget https://raw.githubusercontent.com/Graylog2/graylog2-images/3.0/docker/config/graylog.conf
    运行:wget https://raw.githubusercontent.com/Graylog2/graylog2-images/3.0/docker/config/log4j2.xml
    主要修改以下参数:
    password_secret = your_password_secret
    root_password_sha2 = your_root_password_sha2
    allow_highlighting = true //运行查询结果高亮

– your_password_secret生成方法:运行pwgen -N 1 -s 96
– your_root_password_sha2生成方法:运行:echo -n yourpasswd | sha256sum
TIP:password_secret和root_password_sha2可以在docker-compose通过参数进行设置
1. 编写docker-compose-graylog2.yml文件

version: '2'
services:
  # MongoDB: https://hub.docker.com/_/mongo/
  mongodb:
    image: mongo:3
    volumes:
      - /graylog/data/mongo:/data/db
      #容器同步宿主机时间
      - /etc/localtime:/etc/localtime
  # Elasticsearch: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/docker.html
  elasticsearch:
    image: elasticsearch:2
    command: "elasticsearch -Des.cluster.name='graylog_lz'"
    environment:
      - http.host=0.0.0.0
      - transport.host=localhost
      - network.host=0.0.0.0
      # Disable X-Pack security: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/security-settings.html#general-security-settings
      - xpack.security.enabled=false
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    volumes:
      - /graylog/data/elasticsearch:/usr/share/elasticsearch/data
      - /etc/localtime:/etc/localtime
  # Graylog: https://hub.docker.com/r/graylog/graylog/ /etc/graylog/server/server.conf
  graylog:
    image: graylog2/server
    volumes:
      - /graylog/data/journal:/usr/share/graylog/data/journal
      - /graylog/config:/usr/share/graylog/data/config
      - /etc/localtime:/etc/localtime
    environment:
      # CHANGE ME!
      - GRAYLOG_PASSWORD_SECRET=MBoTnRwuGhbLe2fxZIsfR6LuoRud3z4RJjt5yKxR71Olo7fgqvmttjj0kCYITdXvKq9p1BRuZwmsKXXbfxRxLIv2aWITHnZx
      # Password: nimda
      - GRAYLOG_ROOT_PASSWORD_SHA2=37bd45d638c2d11c49c641d2e9c4f49f406caf3ee282743e0c800aa1ed68e2ee
      - GRAYLOG_WEB_ENDPOINT_URI=http://45.76.175.5:9000/api
    links:
      - mongodb:mongo
      - elasticsearch:elasticsearch
    depends_on:
      - mongodb
      - elasticsearch
    ports:
      # Graylog web interface and REST API
      - 9000:9000
      - 12900:12900
      # Syslog TCP
      - 1514:1514
      # Syslog UDP
      - 1514:1514/udp
      # GELF TCP
      - 12201:12201
      # GELF UDP
      - 12201:12201/udp
  1. 运行容器
    在docker-compose-graylog2.yml文件目录下运行:
    docker-compose -f ./docker-compose-graylog2.yml up -d
    可能报错:OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N

    原因:elasticsearch 镜像版本问题,我由docker.elastic.co/elasticsearch/elasticsearch:5.6.3修改为elasticsearch:2就可以了
    注意:
    docker-compose-graylog2.yml中graylog服务中环境变量GRAYLOG_WEB_ENDPOINT_URI得配置正确,开始我配置的是http://45.76.175.5:9000,虽然能够访问到登录页面,但是一直登录不上,报错:Error – the server returned: 404 – cannot POST http://45.76.175.5:9000/system/sessions (404)
标签:

发表评论

邮箱地址不会被公开。 必填项已用*标注