深入浅出Docker技术- Redis 集群的搭建-1

本文主要介绍基于redis的集群搭建

环境准备:

   docker/centos7

实例机器:
  192.168.137.128 由于机子原因,采用一台机器多容器部署的方式;

  

单机部署命令:

  docker run -d –name=redis  -p 6179:6179  –restart=always redis:4.0.9

 

redis主从复制部署方式:

master

   docker run -d -p 6379:6379 –restart=always –name=viemall-redis-master  –net=viemall-zookeeper -v /opt/docker/compose/redis/redis-a/conf/redis-master.conf:/usr/local/etc/redis/redis.conf redis:4.0.9 redis-server /usr/local/etc/redis/redis.conf

 

slave

   docker run -d -p 6380:6379 –restart=always –name=viemall-redis-slave –net=viemall-zookeeper  -v /opt/docker/compose/redis/redis-a/conf/redis-slave.conf:/usr/local/etc/redis/redis.conf redis:4.0.9 redis-server /usr/local/etc/redis/redis.conf

 

当配好主从redis之后,经常会发现,slave无法连接上master。

出现如下错误: Error condition on socket for SYNC: No route to host

解决的方式:

在redis主服务器上的redis.conf中修改bind字段,将

bind 127.0.0.1

 修改为 bind 0.0.0.0  

又或者直接注释掉bind字段

# bind 127.0.0.1

原因: 
        如果redis主服务器绑定了127.0.0.1,那么跨服务器IP的访问就会失败,从服务器用IP和端口访问主的时候,主服务器发现本机6379端口绑在了127.0.0.1上,也就是只能本机才能访问,外部请求会被过滤,这是linux的网络安全策略管理的。如果bind的IP地址是172.168.10.70,那么本机通过localhost和127.0.0.1、或者直接输入命令redis-cli登录本机redis也就会失败了。只能加上本机ip才能访问到。 
所以,在研发、测试环境可以考虑bind 0.0.0.0,线上生产环境建议绑定IP地址。

 

如果完成了上述操作还是出现slave无法连接上master问题:

执行” sudo iptables F ” 就轻松解决了;

 

测试:

 

#主服务器查看主从信息
#[root@php1 ~]# redis-cli -h 127.0.0.1 -a redispass info replication
# Replication

role:master

connected_slaves:1

slave0:ip=172.18.0.1,port=6379,state=online,offset=1108,lag=1

master_replid:766cd3d92f9bb8ea4f19ce71d653ab9ff47e2d45

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:1108

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:1108

 


#
从服务器查看主从信息
#[root@mysql1 ~]# redis-cli -h 127.0.0.1 -a redispass info replication
# Replication

role:slave

master_host:192.168.137.128

master_port:6379

master_link_status:up

master_last_io_seconds_ago:8

master_sync_in_progress:0

slave_repl_offset:1178

slave_priority:100

slave_read_only:1

connected_slaves:0

master_replid:766cd3d92f9bb8ea4f19ce71d653ab9ff47e2d45

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:1178

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:1178

 

 

#写同步测试
#主服务器 

# redis-cli -h 127.0.0.1 -a redispass 
redis 127.0.0.1:6379> set a 123
OK
redis 127.0.0.1:6379> get a
"123"

 

#从服务器
[root@mysql1 ~]# redis-cli -h 127.0.0.1 -a redispass
 
redis 127.0.0.1:6379> get a
"123"
[root@mysql3 ~]# redis-cli -h 127.0.0.1 -a redispass
redis 127.0.0.1:6379> get a
"123"

redis 127.0.0.1:6379> set b 234
(error) READONLY You can't write against a read only slave.
(开起了只读模式,所以从将不能写入数据,可以保证数据只从主服务器同步至从服务器)

#故障测试
#从服务器宕机

将自动从主服务器的主从关系中解除
#主服务器宕机,从服务器显示,并且不能自动切换

[15932] 03 Nov 09:46:25.465 * Connecting to MASTER…
[15932] 03 Nov 09:46:25.465 * MASTER <-> SLAVE sync started
[15932] 03 Nov 09:46:25.466 # Error condition on socket for SYNC: Connection refused

后面的Redis主从切换部署方式 将在下一章讲述;

深入浅出Docker技术- tomcat redis session 共享

 环境准备:

   docker/centos7

实例机器:
  192.168.0.1

192.168.0.2


采用普通方式:

       http://www.dczou.com/viemall/535.html

本章采用的基于Docker 方式;

      通过TomcatClusterRedisSessionManager  方式来实现redis共享;

启动redis容器:   

docker run -d –name=redis  -p 6379:6379 –restart=always redis:4.0.9  –requirepass "shop_123"

 

创建Tomcat 的镜像文件;

#cd /opt/program/tools/docker-file/tomcat-session-redis (dockerfile看附件)

# docker build -t  tomcat8-session-redis:v1 .

# 把镜像文件push公司的harbor镜像仓库中;

: 根据你的信息修改conf/redis-data-cache.properties 的redis 配置信息;

 

 启动Tomcat-A容器:

     在机器: 192.168.0.1

   docker run -d –name=tomcat-1  -p 8084:8080 -v /opt/program/tools/docker-file/tomcat-session-redis/viemall-session-test:/usr/local/tomcat/webapps/ROOT –restart=always tomcat8-session-redis:v1

启动Tomcat-B容器:

     在机器: 192.168.0.2

      docker run -d –name=tomcat-2  -p 8084:8080 -v /opt/program/tools/docker-file/tomcat-session-redis/viemall-session-test:/usr/local/tomcat/webapps/ROOT –restart=always tomcat8-session-redis:v1

 

测试流程:

为了方便我直接采用阿里云的SLB方式(可以采用其他负载服务器)来进行session的高可用测试,并且进行负载测试;

采用SLB 统一监听入口 http://xx.190.126.100/SessionServlet

image.png

登录redis客户端,查看session

  image.png

session已经被保存到redis

下面,我们进行一项测试

查看两台机器的后台日记,可以看到阿里云SLB会负载个上面两台服务器;

image.png 

然后将对应的tomcat停掉

刷新该应用,sessionId未变,则表示redis保存session成功。

该方案将session集中保存在了redis服务器,并做了主备容灾,从一定程度上提高了系统的高可用,由于

redis是内存存储,访问效率较高,在性能上也是比较好的,但是在用户量 非常大,并发访问量非常高的时候,session服务器会成为性能瓶颈。

本章所有的资料文件:

    https://gitee.com/gz-tony/viemall-dubbo/tree/master/viemall-docekr/dockerfile/tomcat-session-redis

深入浅出Docker技术- 基于Docker Solr集群的搭建

    SolrCloud是基于Solr和Zookeeper的分布式搜索方案,是正在开发中的Solr4.0的核心组件之一,它的主要思想是使用Zookeeper作为集群的配置信息中心。它有几个特色功能:1)集中式的配置信息 2)自动容错 3)近实时搜索查询时自动负载均衡 

   SolrCloud 是指 Solr 中一套新的潜在的分发能力。这种能力能够通过参数让你建立起一个高可用、容错的 Solr 服务集群。当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud(solr 云)。


本文主要介绍基于 solrCloud的搭建

环境准备:

   docker/centos7

实例机器:
   192.168.1.102 由于机子原因,采用一台机器多容器部署的方式;

概括:

   基于三个容器,来实现Zookeeper的集群模式,3个Solr容器来实现集群;

一:单机启动solr 服务;

docker run --name solr-simple  -d -p 8983:8983 solr:6.6.4

二:命令方式启动solrCloud:

    由于上一章基于讲解了Zookeeper 的集群:  http://www.dczou.com/viemall/818.html 

      下面启动命令之前依赖上一章的环境;

Solr1容器:

docker run --name solr1 --net=viemall-zookeeper -d -p 8983:8983 solr:6.6.4  
bash -c '/opt/solr/bin/solr start -f -z zookeeper-A:2181,zookeeper-B:2181,zookeeper-C:2181'

Solr2容器:

docker run --name solr2 --net=viemall-zookeeper -d -p 8984:8983 solr:6.6.4  
bash -c '/opt/solr/bin/solr start -f -z zookeeper-A:2181,zookeeper-B:2181,zookeeper-C:2181'

Solr3容器:

docker run --name solr3 --net=viemall-zookeeper -d -p 8985:8983 solr:6.6.4 
 bash -c '/opt/solr/bin/solr start -f -z zookeeper-A:2181,zookeeper-B:2181,zookeeper-C:2181'

方式二: docker compose 一键搭建solrCloud 环境:

    docker compose文件编写 : 文件地址:  https://gitee.com/gz-tony/viemall-dubbo/tree/master/viemall-docekr/compose/solr

三. 通过集群(Core Admin)管理

image.png

No config set found to associate with the collection. 刚启动的没有默认的Solr配置

手动执行命令:

 docker exec -it solr-1  /opt/solr/bin/solr create_collection  -c collection1 -shards 1 -replicationFactor 3 -p 8983 创建一个默认的collection,以后就可以用这个作为基础;

image.png

参数:

name:将被创建的集合的名字
numShards:集合创建时需要创建逻辑碎片的个数
replicationFactor:分片的副本数。replicationFactor(复制因子)为 3 意思是每个逻辑碎片将有 3 份副本。

image.png

现在只有一片,1个主,2个备

也可以使用命令来创建分片:

http://127.0.0.1:8080/solr/admin/collections?action=CREATE&name=collection2&numShards=1&replicationFactor=3

三. 客户端API:

public class SolrCloudTest {
 
    @Test
    public void testAddDocument() throws Exception {
        //创建一个和solr集群的连接
        String zkHost = " 192.168.137.128:2181, 192.168.137.128:2182, 192.168.137.128:2183";
        CloudSolrServer solrServer = new CloudSolrServer(zkHost);
        //指定默认的collection
        solrServer.setDefaultCollection("collection2");
        //创建一个文档对象
        SolrInputDocument document = new SolrInputDocument();
        //向文档中添加域
        document.addField("id", "test001");
        document.addField("item_title", "测试商品");
        //把文档添加到索引库
        solrServer.add(document);
        //提交
        solrServer.commit();
    }
    
    @Test
    public void deleteDoucment()  throws Exception {
        //创建一个和solr集群的连接
        String zkHost = "192.168.242.135:2181,192.168.242.135:2182,192.168.242.135:2183";
        CloudSolrServer solrServer = new CloudSolrServer(zkHost);
        //指定默认的collection
        solrServer.setDefaultCollection("collection2");
        solrServer.deleteByQuery("*:*");
        solrServer.commit();
    }
}

资料参考:

http://eksliang.iteye.com/blog/2124078

https://www.cnblogs.com/wxisme/p/5180120.html

https://github.com/freedev/solrcloud-zookeeper-docker


深入浅出Docker技术- 基于Docker ZooKeeper 集群的搭建

  ZooKeeper为分布式应用提供高效、高可用的分布式协调服务,它有三种运行模式:单机模式、伪集群模式和集群模式。如果对于ZooKeeper 不了解可以查看我之前的Zookeeper 系列教程:  

  ZooKeeper为分布式应用提供高效、高可用的分布式协调服务,它有三种运行模式:单机模式、伪集群模式和集群模式。如果对于ZooKeeper 不了解可以查看我之前的Zookeeper 系列教程:  

       Zookeeper教程

环境准备:

    docker/centos7

实例机器:
     192.168.1.102 本地虚拟机

概括:

   基于三个容器,来实现Zookeeper的集群模式:

方式一:

     采用传统的docker命令,一个一个的容器部署,dockerfile 这里我就不编写,采用官网的docker文件;

 1.新建docker网络

docker network create viemall-zookeeper
docker network ls

2.启动容器服务:

容器A:

docker run -d \
	 --restart=always \
	 -v /opt/docker/zookeeper/zoo1/data:/data \
	 -v /opt/docker/zookeeper/zoo1/datalog:/datalog \
	 -e ZOO_MY_ID=1 \
	 -e ZOO_SERVERS="server.1=zookeeper-A:2888:3888 server.2=zookeeper-B:2888:3888 server.3=zookeeper-C:2888:3888" \
	 --name=zookeeper-A \
	 --net=viemall-zookeeper \
	 --privileged \
	 zookeeper:3.4.11

容器B: 

docker run -d \
	 --restart=always \
	 -v /opt/docker/zookeeper/zoo2/data:/data \
	 -v /opt/docker/zookeeper/zoo2/datalog:/datalog \
	 -e ZOO_MY_ID=2 \
	 -e ZOO_SERVERS="server.1=zookeeper-A:2888:3888 server.2=zookeeper-B:2888:3888 server.3=zookeeper-C:2888:3888" \
	 --name=zookeeper-B \
	 --net=viemall-zookeeper \
	 --privileged \
	 zookeeper:3.4.11

容器C:

docker run -d \
	 --restart=always \
	 -v /opt/docker/zookeeper/zoo3/data:/data \
	 -v /opt/docker/zookeeper/zoo3/datalog:/datalog \
	 -e ZOO_MY_ID=3 \
	 -e ZOO_SERVERS="server.1=zookeeper-A:2888:3888 server.2=zookeeper-B:2888:3888 server.3=zookeeper-C:2888:3888" \
	 --name=zookeeper-C \
	 --net=viemall-zookeeper \
	 --privileged \
	 zookeeper:3.4.11

下面验证一下集群是否工作正常:

查看三个容器的IP:

docker   inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'   b0a6bb150200

可以通过命令:echo stat|nc 172.20.0.4 2181 来查看哪个节点被选择作为follower或者leader 

image.png

通过上面的命令可见集群搭建成功,并且有一个节点为leader状态。

方式二: docker compose

       docker compose是docker编排服务的一部分,可以让用户在其他平台上快速的安装docker,一键就部署成功了;  

      docker compose文件编写:

                Zookeeper compose 地址:  https://gitee.com/gz-tony/viemall-dubbo/tree/master/viemall-docekr/compose/zookeeper

     docker compose 服务启动;

          docker-compose up -d

 

ZooKeeper 常用四字命令:

      ZooKeeper 支持某些特定的四字命令字母与其的交互。它们大多是查询命令,用来获取 ZooKeeper 服务的当前状态及相关信息。用户在客户端可以通过 telnet 或 nc 向 ZooKeeper 提交相应的命令

·         1. 可以通过命令:echo stat|nc 127.0.0.1 2181 来查看哪个节点被选择作为follower或者leader

·         2. 使用echo ruok|nc 127.0.0.1 2181 测试是否启动了该Server,若回复imok表示已经启动。

·         3. echo dump| nc 127.0.0.1 2181 ,列出未经处理的会话和临时节点。

·         4. echo kill | nc 127.0.0.1 2181 ,关掉server

·         5. echo conf | nc 127.0.0.1 2181 ,输出相关服务配置的详细信息。

·         6. echo cons | nc 127.0.0.1 2181 ,列出所有连接到服务器的客户端的完全的连接 / 会话的详细信息。

·         7. echo envi |nc 127.0.0.1 2181 ,输出关于服务环境的详细信息(区别于 conf 命令)。

·         8. echo reqs | nc 127.0.0.1 2181 ,列出未经处理的请求。

·         9. echo wchs | nc 127.0.0.1 2181 ,列出服务器 watch 的详细信息。

·         10. echo wchc | nc 127.0.0.1 2181 ,通过 session 列出服务器 watch 的详细信息,它的输出是一个与 watch 相关的会话的列表。

·         11. echo wchp | nc 127.0.0.1 2181 ,通过路径列出服务器 watch 的详细信息。它输出一个与 session 相关的路径。

 

深入浅出Docker技术- 快速运行Mysql容器

环境准备:

    docker/centos7

实例机器:
     192.168.1.102 
本地虚拟机

资料准备:

    https://gitee.com/gz-tony/viemall-dubbo/tree/master/viemall-docekr/compose/mysql

 docker run -d -p 3306:3306 --name=viemall-mysql --restart=always  -e TZ="Asia/Shanghai" \
 -e MYSQL_ROOT_PASSWORD=123456 \
 -v /opt/docker/mysql/data:/var/lib/mysql \
 -v /opt/docker/mysql/conf/utf8.cnf:/etc/mysql/conf.d/utf8.cnf  mysql:5.7.22 \
 --character-set-server=utf8

资料参考:   https://www.cnblogs.com/mmry/p/8812599.html

深入浅出Docker技术- 快速构建Nginx Web负载均衡

image.png

环境准备:

    docker/centos7

实例机器:
     192.168.1.102
本地虚拟机

资料准备:

    https://gitee.com/gz-tony/viemall-dubbo/tree/master/viemall-docekr/compose/nginx-tomcat

官网资料:

     https://hub.docker.com/_/nginx/

概括:

  使用三个容器技术,一个容器部署Nginx, 80端口,一个部署WebA,一个部署WebB, Nginx 这项技术不是很懂的可以看我之前的系列文章;这里不细讲!!!!!


方式一:

   采用传统的docker命令,一个一个的容器部署,dockerfile 这里我就不编写,采用官网的docker文件;

    因为docker run 的默认网络是bridge模式, bridge模式是docker的默认网络模式,容器与容器之间是不互通的,那么我们需要容器共享一个 Network Namespace,所以创建的时候使用自定义网络;

 1.新建docker网络

    docker network create viemall

    docker network ls

 2.启动TomcatATomcatB服务:

docker run  -d  -p 8080:8080 --net=viemall --name=viemall-tomcat-a --restart=always  -e TZ="Asia/Shanghai" \
 -v /opt/docker/tomcat/web-a/ROOT:/usr/local/tomcat/webapps/ROOT \
 -v /opt/docker/tomcat/web-a/logs:/usr/local/tomcat/logs \
 tomcat:8.0.51-jre8-slim
 docker run  -d  -p 8081:8080 --net=viemall --name=viemall-tomcat-b --restart=always  -e TZ="Asia/Shanghai" \
 -v /opt/docker/tomcat/web-b/ROOT:/usr/local/tomcat/webapps/ROOT \
 -v /opt/docker/tomcat/web-b/logs:/usr/local/tomcat/logs \
 tomcat:8.0.51-jre8-slim

3.启动Nginx

docker run  -d  -p 80:80 --net=viemall --name=viemall-nginx --restart=always  -e TZ="Asia/Shanghai" \
  -v /opt/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
  -v /opt/docker/nginx/logs:/var/log/nginx \
  -v /opt/docker/nginx/html:/usr/share/nginx/html \
 nginx:1.14-alpine

测试访问:

  http://192.168.1.102/


  image.pngimage.png


方式二: docker compose

   docker composedocker编排服务的一部分,可以让用户在其他平台上快速的安装docker,一键就部署成功了;

  1.安装docker compose

       参考文章:   http://www.dczou.com/viemall/808.html

  2.docker compose官方文档:

        https://docs.docker.com/compose/compose-file/

 3. docker compose文件编写:

version: '3'
services:
  nginx:
    image: nginx:1.14-alpine 
    ports:
      - "80:80"
    container_name: viemall-nginx
    restart: always
    volumes:
      - /opt/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - /opt/docker/nginx/html:/usr/share/nginx/html
      - /opt/docker/nginx/logs:/var/log/nginx
    environment:
      TZ: Asia/Shanghai
    depends_on:
      - viemall-tomcat-A
      - viemall-tomcat-B
    networks:
      - "viemall-net"
  viemall-tomcat-A:
    image: tomcat:8.0.51-jre8-slim
    container_name: viemall-tomcat-a
    ports:
      - "8080:8080"
    restart: always
    volumes:
      - /opt/docker/tomcat/web-a/ROOT:/usr/local/tomcat/webapps/ROOT
      - /opt/docker/tomcat/web-a/logs:/usr/local/tomcat/logs
    environment:
      TZ: Asia/Shanghai
      JAVA_OPTS: -Djava.security.egd=file:/dev/./urandom
    networks:
      - "viemall-net"
  viemall-tomcat-B:
    image: tomcat:8.0.51-jre8-slim
    container_name: viemall-tomcat-b
    ports:
      - "8081:8080"
    restart: always
    volumes:
      - /opt/docker/tomcat/web-b/ROOT:/usr/local/tomcat/webapps/ROOT
      - /opt/docker/tomcat/web-b/logs:/usr/local/tomcat/logs
    environment:
      TZ: Asia/Shanghai
      JAVA_OPTS: -Djava.security.egd=file:/dev/./urandom
    networks:
      - "viemall-net"
networks:
  viemall-net:
    driver: bridge

 4. docker compose 服务启动;

     docker-compose up -d


   查看compose启动的各个容器的状态:

docker-compose ps

   进入某个容器:

docker-compose exec viemall-tomcat-a bash

   退出某个容器

exit

   停止 docker compose启动的容器: 停止运行的容器而不删除它们,它们可以使用命令docker-compose start重新启动起来

docker-compose stop

 卸载docker compose启动的容器:

docker-compose down

深入浅出Docker技术- docker-compose的两种方式



这里简单介绍下两种安装docker-compose的方式:
第一种方式相对简单,但是由于网络问题,常常安装不上,并且经常会断开,
第二种方式略微麻烦,但是安装过程比较稳定
方法一:
#  sudo curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose  
#docker-compose --version

    但是此方法会经常因为网络的原因而无法安装

  方法二: pip安装方式:

     wget https://files.pythonhosted.org/packages/ae/e8/2340d46ecadb1692a1e455f13f75e596d4eab3d11a57446f08259dee8f02/pip-10.0.1.tar.gz
    tar -xvf pip-10.0.1.tar.gz
    cd pip-10.0.1/
    sudo python setup.py install
    sudo pip install docker-compose
    ln -s /usr/bin/docker-compose /usr/local/bin/docker-compose

深入浅出Docker技术- Docker 构建Tomcat DockerFile 镜像;

     前文已经讲述了基于公共的Tomcat 镜像来部署WEB应用,并且也简单的讲述了DockerFile 的语法应用;但是公共的镜像都是官方通用的或者是其他公司或者个人PUSH上去的,在项目开发过程中也未必符合,比如官方的JDK镜像是有时区问题,因为是外国佬的镜像基础;

   <<Docker下的web开发和Tomcat部署>>

  <<深入浅出Docker技术-Dockerfile详解>>

 下面将讲述基于DockerFile 来构建基于自己的Tomcat 镜像

FROM docker.io/java:8u111-jdk-alpine
 
MAINTAINER Tony <1174616612@qq.com>

ENV TOMCAT_VERSION=8.0.52 \
	TZ=Asia/Shanghai #解决时差问题

#安装tomcat	
COPY apache-tomcat-${TOMCAT_VERSION}.tar.gz /usr/local/
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone  \
	&& cd /usr/local  \	
    && tar xzf apache-tomcat-${TOMCAT_VERSION}.tar.gz  \
	&& rm apache-tomcat-${TOMCAT_VERSION}.tar.gz  \
	&& mv apache-tomcat-${TOMCAT_VERSION} tomcat  

WORKDIR /usr/local/tomcat
EXPOSE 8080 
CMD ["./bin/catalina.sh", "run"]

  image.png

   构建命令:

    docker build tomcat:v1 .

   构建完毕后,就可以形成公司公用镜像,统一公司内部使用了;


深入浅出Docker技术-基于harbor搭建企业docker 镜像仓库

    上章讲述了《docker私有库搭建过程(Registry)》 ,开源Docker Registry的有很多的不足,所以采用现在比较主流的 harbor作为Docker 镜像仓库搭建;

1. 背景

      docker中要使用镜像,一般会从本地、docker Hup公共仓库和其它第三方公共仓库中下载镜像,一般出于安全和外网(墙)资源下载速率的原因考虑企业级上不会轻易使用。那么有没有一种办法可以存储自己的镜像又有安全认证的仓库呢? 

         —-> 企业级环境中基于Harbor搭建自己的安全认证仓库。

        Harbor是VMware公司最近开源的企业级Docker Registry项目, 其目标是帮助用户迅速搭建一个企业级的Docker registry服务。

2.安装: Harbor

     harbor需要安装docker和docker-compose才能使用,安装docker步骤省略,

    

    docker-dompose安装步骤如下: 

    下载最新版的docker-compose文件 

      curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose 

    添加可执行权限 

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

     查看 docker-compose版本

         docker-compose –version 

   


 下载harbor离线包

      wget https://storage.googleapis.com/harbor-releases/release-1.4.0/harbor-offline-installer-v1.4.0.tgz

  安装步骤:

[root@reg ~]# tar xvf harbor-offline-installer-v1.4.0.tgz

   1.  [root@reg ~]# cd /opt/harbor/ 

   2.  [root@reg harbor]# ls 

        common  docker-compose.yml  harbor.0.5.0.tgz  harbor.cfg  install.sh  LICENSE  NOTICE  prepare 

   3.配置harbor.cfg文件:

1.  hostname= reg.docker.tb     #本机外网IP或域名,该地址供用户通过UI进行访问,不要使用127.0.0.1 
2.  ui_url_protocal = http     #配置访问协议,默认为http;如果要启动SSl认证为:https 
3.  email_server = smtp.qq.com #配置邮件服务器地址 
4.  email_server_port =25      #邮件服务器端口 
5.  email_username= xxxxx      #用户 
6.  email_password = xxxx      #密码 
7.  email_from = admin@simpletour.com   #发件人地址 
8.  email_ssl = false          #是否进行ssl加密  
9.  harbor_admin_password = Harbor12345     #harbor admin的初始密码 
10. auth_mode = db_auth   #harbor认证模式,默认为db_auth,本地mysql,也可以配置ldap认证 
11. #ldap认证方式 
12. ldap_url= ldaps://ldap.mydomain.com 
13. ldap_basedn = ou=people,dc=mydomain,dc=com 
14. ldap_uid = uid 
15. ldap_scope = 3 
16.  
17. #数据库密码 
18. db_password = root123  #默认不需要修改
19. self_registration = on 
20. use_compressed_js = on 
21. max_job_workers = 3         #最大工作进 
22. token_expiration = 30       #token过期时间,默认为30分钟 
23. verify_remote_cert = on 
24. customize_crt = on 
25.  
26. #显示的认证及组织信息 
27. crt_country = CN 
28. crt_state = State 
29. crt_location = CN 
30. crt_organization = organization 
31. crt_organizationalunit = organizational unit 
32. crt_commonname = example.com 
33. crt_email = example@example.com  
34.  
35. #可选的https证书配置地址 
36. ssl_cert = /root/cert/reg.docker.tb.crt 
37. ssl_cert_key = /root/cert/reg.docker.tb.key

    #上面启动了SSL认证,所以要创建一个CA证书[实验环境自己创建,线上环境购买就好]

    如果不使用HTTPS 直接修改hostname 和harbor_admin_password就行了; 如果详细修改,可以在安装完毕后,控制台修改配置;

执行./prepare命令

执行./install.sh 命令;

image.png

   注:默认执行上面安装后会自动启动服务;

    安装出现的小问题: 80端口被暂用;

image.png

    因为:harbor使用的是80端口,

   在公网上,一般情况下都不暴露默认端口,避免被攻击!

   以下修改harbor的默认80端口为其他端口!

   这里有一篇文章: 不详细讲述;

       https://www.cnblogs.com/huangjc/p/6420355.html

image.png

image.png

安装成功;;  访问你设置的域名地址;

image.png

如果想重启:harbor

  cd  /opt/program/tools/harbor

docker-compose stop
./install.sh

客户端使用测试 [ docker 机 ] 

  * 通过 admin 账户登陆创建 test 用户

  * 退出 admin 账户登陆 test 用户

1. 新建项目 
     我们新建一个名称为
test的项目,设置不公开。注意:当项目设为公开后,任何人都有此项目下镜像的读权限。命令行用户不需要“docker login”就可以拉取此项目下的镜像。

image.png

  新建项目完毕后,我们就可以用test账户提交本地镜像到Harbor仓库了。例如我们提交本地nginx镜像:

2. 客户端测试:

1、admin登录

    $ docker login xx.xx.63.76

     Username: admin

      Password:

      Login Succeeded

image.png

报这个错误的都是如下2个原因:

   1、是端口错了!

   2、未在docker启动文件中添加–insecure-registry信任关系!

大多数这个错误是第2个原因,因为你没有添加信任关系的话,docker默认使用的是https协议,所以端口不对(443),会报连接拒绝这个错误;

或者提示你 "服务器给HTTPS端的是HTTP响应" 这个错误,因为你没添加端口信任,服务器认为这是默认的https访问,返回的却是http数据! 

       十分抱歉,因为我文章演示是http 方式的验证模式,SO…..;

 

解决方法:

正确的添加信任关系包括端口号:

–insecure-registry=xx.xxx.103.99

一定要把主机与端口同时添加进去!

 记住,这是harbor镜像仓库,而不是单纯的registry容器仓库!

1、在你的机器上修改文件 /etc/sysconfig/docker ,添加(或修改)字段:

    vim /usr/lib/systemd/system/docker.service

 ExecStart=/usr/bin/dockerd --insecure-registry=192.168.x.x

  修改完毕重启 docker

   service docker restart   或者  systemctl restart docker.service  

3. push 镜像到仓库

  如下:

   给镜像打tag

   docker tag your-docker-image 172.20.30.35:10080/your-repository-name/your-docker-image:tag  

   注意,your-repository-name 不能少,否则会报错:权限验证失败


  从本地PUSH 镜像到仓库

    docker push  172.20.30.35:10080/your-repository-name/your-docker-image:tag


  从仓库中 pull(拉) 镜像

  docker pull your-repository-name/your-docker-image:tag  

  或者

   docker pull 172.20.30.35:10080/your-repository-name/your-docker-image:tag  

docker私有库搭建过程(Registry)

      我们知道可以使用hub.docker.com作为我们公共或者私有的registry。但由于服务器在国外的原因,网速会非常的慢。
所以我们在利用docker开发构建容器服务时,我们希望能够建立自己的私有registry,上传镜像值我们的私有
registry中心,然后在其他物理机上部署的时候,可以快速的pull,然后实现大规模的分发以及部署,提高效率。

1、安装并运行registry

安装:

  [root@iZm5e61wb7816uew9egnr2Z ~]  docker pull  docker.io/registry

运行:

   docker run -d -p 5000:5000 -v /opt/program/data/registry:/var/lib/registry docker.io/registry

-d后台运行

-p指定端口

-v把registry的镜像路径/var/lib/registry映射到本机的/opt/program/data/registry

检查5000端口

      netstat -an | grep 5000

[root@docker01 ~]# netstat -an | grep 5000

image.png

      telnet 127.0.0.1 5000成功。

image.png

2、添加tag标记

       docker tag : 标记本地镜像,将其归入某一仓库。

docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

 如: 将镜像ubuntu:15.10标记为 runoob/ubuntu:v3 镜像。

     root@runoob:~# docker tag ubuntu:15.10 runoob/ubuntu:v3

image.png

      docker tag csphere/wordpress:4.2 172.31.228.145:5000/csphere/wordpress:0.0.1

image.png

3、上传镜像到本地私有仓库中:

          docker push 10.100.50.120:5000/busybox


开源Docker Registry的有很多的不足:

   用户与鉴权 : 可以基于htpasswd文件进行简单的用户管理,但是维护不便,也没有对外的API可供集成。

   缺少日志与审记 : 没有日志收集能力,也缺少审记。

   缺少图形化的管理界面;

   所以后续我们会采用Harbor 作为企业级的私有仓库作为镜像管理.