docker 集群搭建及使用docker compose 搭建es集群

记录下docker 集群搭建及使用docker compose 搭建es集群的过程

    • 一.创建虚拟机
    • 二.配置网络
    • 三.安装docker
    • 四.Swarm配置
    • 五.搭建Portainer可视化界面
    • 六.使用docker compose搭建elk集群
    • 七.踩过的坑

一.创建虚拟机

硬盘64G,内存24G,CPU4,网络适配器网桥,系统安装时设置root用户密码

二.配置网络

  1. vi /etc/sysconfig/network-scripts/ ifcfg-ens33 打开编辑ifcfg-ens33文件;
  2. 将ONBOOT=no改为yes,将BOOTPROTO=dhcp改为BOOTPROTO=static,并在后面增加几内容:按实际网络情况配置)
    IPADDR=192.168.0.225
    NETMASK=255.255.255.0
    GATEWAY=192.168.0.1
    DNS1=119.29.29.29 ;
  3. service network restart 重启网络服务;
  4. Ifconfig 查看网络配置;
  5. systemctl stop firewalld & systemctl disable firewalld 关闭防火墙并禁止开机启动;

三.安装docker

  1. 安装工具包 yum install -y yum-utils
  2. 设置远程仓库 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  3. 安装 yum install docker-ce
  4. 启动 service docker start 加入开机启动 chkconfig docker on
  5. 查看版本 docker version
  6. 校验 docker run hello-world

四.Swarm配置

  1. 初始化swarm,在manager(或leader)机器上执行swarm init命令
    docker swarm init --advertise-addr 主机ip
    运行后将会获得token 如:
    Docker swarm join \
    –tokenSWMTKN-1-0038kiadp6vm1xrhxjgnao61a04s1m2st0g4p003xv34qn5g27-6ernode3 ur c6fcwrsamnkhdty
    主机ip
  2. 在其他机器上运行获得的token命令 即可加入集群
  3. Manage查看swarm节点 $ docker node ls

五.搭建Portainer可视化界面

  1. 下载镜像 docker pull portainer/portainer
  2. 启动
docker run -d -p 9000:9000 \
    --restart=always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    --name prtainer-test \
    portainer/portainer
  1. 首次登陆需要注册用户,给admin用户设置密码,单机版选择local即可

六.使用docker compose搭建elk集群

  1. 在Portainer界面Stacks中AddStack,docker-compose.yml如下,搭建了es3个,kibana1个,volumes3个,network1个
version: '3.6'        #指定 docker-compose.yml 文件的写法格式
services:             #多个容器集合
  elasticsearch:      #服务名
    image: docker.elastic.co/elasticsearch/elasticsearch:6.4.2      #指定服务所使用的镜像
    container_name: es1                   #容器名
    environment:                          #环境变量配置,可以用数组或字典两种方式
      - cluster.name=elasticsearch-cluster   #es集群名,所有es节点集群名必须一样才能互相发现
      - node.name=es1                      #节点名 
      - network.host=0.0.0.0               #是配置可以访问本节点的路由地址
      - network.publish_host=192.168.0.225      #设置其它节点和该节点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址
      - http.port=9200                  #设置对外服务的http端口
      - transport.tcp.port=9300         #设置节点之间交互的tcp端口
      - http.cors.enabled=true          #允许跨域
      - node.master=true                #允许成为master
      - node.data=true                     #允许保存数据
      - http.cors.allow-origin=*          #解决跨域问题
      - bootstrap.memory_lock=false
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"      #指定JVM参数。机器配置低就稍微调小一点,一般512够用了    
      - "discovery.zen.minimum_master_nodes=1"    #设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点
    ulimits:                           #解除内存限制相关设置
     memlock:
       soft: -1
       hard: -1
    volumes:
      - esdata1:/usr/share/elasticsearch/data  #卷挂载路径,定义宿主机的目录/文件和容器的目录/文件的映射  宿主机路径:容器路径
    ports:               # 暴露端口信息 "宿主机端口:容器暴露端口" 访问时通过可通过宿主机ip:宿主机端口访问
      - "9200:9200"
      - "9300:9300"
    networks:         #使用的网络,我使用的是文件末尾自己新建的网络 因为要搭建集群所以大家网络应该一样
      - esnet
    deploy:          #部署落点约束
      placement:
        constraints:
          - node.role == manager
  elasticsearch2:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.4.2
    container_name: es2
    environment:
      - cluster.name=elasticsearch-cluster
      - node.name=es2
      - network.host=0.0.0.0
      - network.publish_host=192.168.0.225
      - http.port=9201
      - transport.tcp.port=9301
      - http.cors.enabled=true
      - node.master=false
      - node.data=true
      - http.cors.allow-origin=*
      - bootstrap.memory_lock=false
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - "discovery.zen.ping.unicast.hosts=192.168.0.225:9200"  #设置集群内节点的主机,设置一台的话这台默认成为master节点,写多个的话自动选取
    ulimits:       
     memlock:
       soft: -1
       hard: -1
    volumes:
      - esdata2:/usr/share/elasticsearch/data
    ports:
      - "9201:9201"
      - "9301:9301"
    networks:
      - esnet
    deploy:
      placement:
        constraints:
          - node.role == worker
  elasticsearch3:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.4.2
    container_name: es3
    environment:
      - cluster.name=elasticsearch-cluster
      - node.name=es3
      - network.host=0.0.0.0
      - network.publish_host=192.168.0.225
      - http.port=9202
      - transport.tcp.port=9302
      - http.cors.enabled=true
      - node.master=false
      - node.data=true
      - http.cors.allow-origin=*
      - bootstrap.memory_lock=false
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - "discovery.zen.ping.unicast.hosts=192.168.0.225:9200"
    ulimits:
     memlock:
       soft: -1
       hard: -1
    volumes:
      - esdata3:/usr/share/elasticsearch/data
    ports:
      - "9202:9202"
      - "9302:9302"
    networks:
      - esnet
    deploy:
      placement:
        constraints:
          - node.role == worker
  kibana:
    image: docker.elastic.co/kibana/kibana:6.4.2
    container_name: kibana
    environment:
      ELASTICSEARCH_URL: http://192.168.0.225:9200   #设置es地址
      I18N_LOCALE: zh-CN
    ports:
      - "5601:5601"
    networks:
      - esnet
    deploy:
      placement:
        constraints:
          - node.role == manager
volumes:
  esdata1:
    driver: local
  esdata2:
    driver: local
  esdata3:
    driver: local

networks:
  esnet:

2.部署完成后,可以登录kibana查看集群状态
docker 集群搭建及使用docker compose 搭建es集群_第1张图片

七.踩过的坑

  1. docker 启动ES失败,报错如下 max virtual memory areas vm.max_map_count [65530] is too low
    注意!!!:修改宿主机的文件而不是容器的
vi /etc/sysctl.conf 

添加 vm.max_map_count=262144,然后加载参数

sysctl -p 

你可能感兴趣的:(集群搭建)