1 Star 0 Fork 9

skybob / docker

forked from 朱亚伟 / docker 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

docker

docker 服务器测试环境搭建使用的整个目录结构及可能使用到的脚本文件

本文档使用教程绝大部分基于java spring boot,除非有特殊标识说明基于其他的框架或语言

关于多个docker-compose间通讯问题

快速使用

1:下载代码

  • wget 下载方式 zip: wget -O docker.zip http://urlzz.cn/a

QQ20200402-103236

tgz: wget -O docker.tgz http://urlzz.cn/b

QQ20200402-103236

  • git 下载方式

安装git:yum install git -y

1571320558723

git clone --depth 1 https://gitee.com/ywyh/docker.git

码云地址:https://gitee.com/ywyh/docker

GIT地址:https://github.com/zywayh/docker

1571321995331

2:cd ./docker/shell

1571321355660

3:执行脚本 ./install-docker.sh 安装docker和docker-compose

1571322288826

4:进入compose,找到想使用的服务,进入文件夹

1571322456273

5:执行命令 docker-compose up -d 启动服务 docker-compose down 关闭服务

如在下载镜像中出现 Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeoutERROR: Get https://registry-1.docker.io/v2/library/nginx/manifests/latest: net/http: TLS handshake timeout 错误,重试或使用docker pull 镜像名先拉取镜像(如无法解决请自行百度)

image-20191018095945364

docker 命令说明

  • 启动创建好的容器:docker start 启动的容器名称
  • 停止启动的容器:docker stop 启动的容器名称
  • 重启停止的或启动中容器:docker restart 启动的容器名称
  • 查看容器日志:docker logs -f --tail 100 启动的容器名称
  • 进入容器bash命令行:docker exec -ti 启动的容器名称 bash

docker-compose 命令说明

在运行命令的目录下需存在docker-compose.yml文件

  • 启动编排好的容器:docker-compose up -d
  • 停止并删除编排好的容器:docker-compose down

目录结构

目录 简介
build 镜像编译文件目录
compose 常用的docker-compose.yml
conf 存放所有镜像所需的配置文件映射
data 存放所有镜像产生的数据映射
html 存放前端代码映射
project 存放项目的目录映射
shell 封装的脚本(可执行)文件

使用介绍

gitlab

gitlab升级

升级路线,如果没有,请使用搞一个版本号的镜像启动,然后再依次从下向上执行 https://docs.gitlab.com/ee/policy/maintenance.html#upgrade-recommendations image: gitlab/gitlab-ce:13.1.0-ce.0 image: gitlab/gitlab-ce:13.0.0-ce.0 image: gitlab/gitlab-ce:12.10.6-ce.0 image: gitlab/gitlab-ce:12.2.5-ce.0 image: gitlab/gitlab-ce:12.0.12-ce.0 image: gitlab/gitlab-ce:11.11.8-ce.0 image: gitlab/gitlab-ce:10.8.7-ce.0 image: gitlab/gitlab-ce:9.5.10-ce.0 image: gitlab/gitlab-ce:8.17.7-ce.0 image: gitlab/gitlab-ce:8.13.4-ce.0

花生壳

centos 7.x

官方文档下载地址

下载时,请注意官网的最新版本号

win

在官网下载win花生壳软件,打开即可使用

Mac

在官网下载win花生壳软件,打开即可使用

RabbitMQ

启动

进入 compose目录下的rabbit文件夹

文件夹下存在docker-compose.yml文件

使用docker-compose up -d后台启动

docker-compose 文件中,volumes

  • ../../conf/rabbit/plugins:/plugins/my:映射镜像内部的/plugins/my目录作为自定义插件目录

  • enabled_plugins:管理默认启动插件列表,如需新增默认启动插件,直接在文件中添加名称即可

    [rabbitmq_management,rabbitmq_delayed_message_exchange].

RabbitMQ 插件使用

开启命令:docker exec rabbit sh -c "rabbitmq-plugins enable rabbitmq_delayed_message_exchange"

关闭命令:docker exec rabbit sh -c "rabbitmq-plugins disable rabbitmq_delayed_message_exchange"

查看插件列表:docker exec rabbit sh -c "rabbitmq-plugins list"

spring boot使用方法

  • pom引入jar包

    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
  • 代码实现

    • 队列创建

      import org.springframework.amqp.core.*;
      import org.springframework.context.annotation.Bean;
      import org.springframework.stereotype.Component;
      
      import java.util.HashMap;
      import java.util.Map;
      
      /**
       * @description:
       * @author: zhuyawei
       * @date: 2019-09-06 13:17
       */
      @Component
      public class RabbitMQConfig {
      
          /**
           * 定义queue名称
           */
          public static final String MQ_QUEUE_NAME = "QU_SHI";
      
          /**
           * 定义exchange
           */
          public static final String MQ_EXCHANGE_NAME = MQ_QUEUE_NAME;
      
          /**
           * 定义queue和exchange绑定使用的routingKey名称
           */
          public static final String MQ_ROUTING_KEY = MQ_EXCHANGE_NAME;
      
          /**
           * 创建消息队列
           * @return
           */
          @Bean
          public static Queue queue() {
              return new Queue(MQ_QUEUE_NAME);
          }
      
          /**
           * 创建自定义类型的exchange
           * 应用于延时消息队列使用,需与queue进行bind
           * @return
           */
          @Bean
          public static CustomExchange exchange() {
              Map<String, Object> arguments = new HashMap<>();
              arguments.put("x-delayed-type", "direct");
              return new CustomExchange(MQ_EXCHANGE_NAME, "x-delayed-message", true, false, arguments);
          }
      
          /**
           * queue和自定义exchange进行绑定
           * @param queue
           * @param exchange
           * @return
           */
          @Bean
          Binding bindingExchangeMessages(Queue queue, CustomExchange exchange) {
              return BindingBuilder.bind(queue).to(exchange).with(MQ_ROUTING_KEY).noargs();
          }
      
      //    /**
      //     * 创建RabbitMQ指定类型的
      //     * @return
      //     */
      //    @Bean
      //    TopicExchange topicExchange() {
      //        return new TopicExchange(MQ_EXCHANGE_NAME);
      //    }
      //
      //    /**
      //     * queue和exchange进行绑定
      //     * 创建普通非延时exchange及绑定,如无特殊需求,在非延时队列并不需要创建exchange
      //     * @param queueMessages
      //     * @param topicExchange
      //     * @return
      //     */
      //    @Bean
      //    Binding bindingExchangeMessages(Queue queueMessages, TopicExchange topicExchange) {
      //        return BindingBuilder.bind(queueMessages).to(topicExchange).with(MQ_ROUTING_KEY);
      //    }
      
      }
    • 生产者及消费者

      import com.trend.config.RabbitMQConfig;
      import org.springframework.amqp.core.AmqpTemplate;
      import org.springframework.amqp.core.Message;
      import org.springframework.amqp.core.MessageProperties;
      import org.springframework.amqp.rabbit.annotation.RabbitListener;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.stereotype.Component;
      
      /**
       * @description: mq 工具类,其中包含生产者及消费者,
       * @author: zhuyawei
       * @date: 2019-09-06 13:19
       */
      @Component
      public class MqUtil {
      
          private static AmqpTemplate rabbitTemplate;
      
          @Autowired
          private void setRabbitTemplate(AmqpTemplate rabbitTemplate){
              MqUtil.rabbitTemplate = rabbitTemplate;
          }
      
          /**
           * 发送消息
           * @param msg   消息体
           */
          public static void send(String msg) {
              send(msg, 0);
          }
      
          /**
           * 发送延时消息
           * @param msg   消息体
           * @param delay 延时时间,如果为空,或者=0,或者小于0不延时
           */
          public static void send(String msg, Integer delay) {
              if(delay <= 0){
                  rabbitTemplate.convertAndSend(RabbitMQConfig.MQ_ROUTING_KEY, msg);
              }else{
                  MessageProperties properties = new MessageProperties();
                  properties.setDelay(delay);
                  Message message = new Message(msg.getBytes(), properties);
                  rabbitTemplate.send(RabbitMQConfig.MQ_EXCHANGE_NAME, RabbitMQConfig.MQ_ROUTING_KEY, message);
              }
          }
      
          /**
           * 消费消息(处理逻辑请另行定义)
           * @param message
           */
          @RabbitListener(queues = RabbitMQConfig.MQ_QUEUE_NAME)
          private void process(Message message) {
              System.out.println("消息消费:" + new String(message.getBody()));
          }
      }
      

openresty 简单使用

使用时请先链接docker-compose.yml文件中的links,使其能够连通redis进行使用

$.ajax({
	url: "/set",
	data: {key: "",val: "val"},
	dataType: "text",
	success: function(data){
		$('#resText').append(data);
		if(data == "+OK"){
			$('#resText').append("<div>true</div>");
		}else{
			$('#resText').append("<div>false</div>");
		}
	}
});
$.ajax({
	url: "/get",
	data: {key: "t2est"},
	dataType: "text",
	success: function(data){
		$('#resText').append(data);
		var list = data.split("\n")
		if(list.length > 0){
			$('#resText').append("<div>" + list[1] + "</div>");
		}else{
			$('#resText').append("<div>" + 获取失败 + "</div>");
		}
	}
});

个人博客 Jpress

使用注意事项

  • 需手动创建数据库,需要时utf8mb4格式
  • 无法评论的问题,需要在 “文章” -> “设置” -> “评论功能”中开启评论
  • 注意事项:每日删除容器,重新创建启动后,需要配置数据库连接

持续集成工具 jenkins

linux启动时,因为系统权限问题,无法创建对应的文件,

使用命令 sudo chown -R 1000:1000 文件目录 进行修改目录权限(容器中jenkins user的uid为1000)

其中下载插件的时间最长,建议下载插件,放到plugin目录下(缺点首次启动时间会延长几倍),启动完成后,今日安装推荐页面点击安装直接就会成功

使用命令wget http://file.ywyh.red/jenkins_2.198_plugins.zip下载插件包,解压到对应目录即可

构建后执行shell脚本操作,里面包含了初始安装,gitlab,ssh等必要的插件,如需其他请自行下载

解决方案:

因本教程使用的为docker容器,容器和宿主机隔离,故无法执行本地脚本,建议使用远端执行脚本

单目前发现一个问题,配置脚本目录也会更新一遍对应仓库的代码,暂无解决此问题

“增加构建后操作步骤”,在下拉选项中选择“Send build artifacts over SSH”这个选项,如果没有这个选项,需要装个“Publish Over SSH”的插件,详细配置请自行百度,主要是配置全局配置Publish Over SSH添加远端主机,添加后即可在“增加构建后操作步骤”处选择“Send build artifacts over SSH”添加执行

启动

  • 进入docker -> compose -> jenkins 目录下
  • 使用docker-compose up -d 启动jenkins

初始化配置

gitlab需要安装插件 gitlab plugin 和 gitlab hook plugin

  • 配置实例 Jenkins URL

构建项目

创建任务教程

gitlab添加ssh的教程

kafka

硬件对性能的影响以及优先考虑的顺序

  • 磁盘:影响最大的事生产者,读写速度,还要考虑分区(多个分区,多个目录,备份问题)
  • 网络:生产者,消费者的写入速度和读取速度
  • 内存:消费者性能 (0拷贝,生产者消费者全部都在内存操作完成,没有经过磁盘)
  • cpu:主要体现在压缩上

生产者消费者

生产者

  • 实例

    • bootstrap.servers 该属性指定broker的地址清单,地址的格式为host:port。清单里不需要包含所有的broker地址,生产者会从给定的broker里查询其他broker的信息。 不过最少提供 2 个 broker 的信息(用逗号分隔,比如: 127.0.0.1:9092,192.168.0.13:9092),一旦其中一个宕机,生产者仍能连接到集群上。
    • key.serializer 生产者接口允许使用参数化类型,可以把 Java 对象作为键和值传 broker,但是 broker 希望收到的消息的键和值都是字节数组,所以,必须提供将对 象序列化成字节数组的序列化器。key.serializer 必须设置为实现 org.apache.kafka.common.serialization.Serializer 的接口类,Kafka 的客户端默认提供了 ByteArraySerializer,IntegerSerializer, StringSerializer,也可以实现自定义的序列化器。
    • value.serializer 同 key.serializer。 参见代码,模块 kafka-no-spring 下包 hellokafka 中
发送方式
  • 发送并忘记(发送没有进行任何的处理,效率最高,会有重试机制,但是可能会丢失消息)

  • 同步发送(发送后返回futrue对象,用.get()获取元数据同步阻塞,)

  • 异步发送(new Callback(){})

  • ACKS机制

    消息在集群下的复制机制(银行一般会用5个副本,不同机架,异地灾备)

    • 0:发送消息后就不再管了
    • 1:如果发送给首领,首领挂掉了,就会抛出异常(有重试)默认
    • -1:
    • all:必须给所有的分区都写入成功,才会返回成功
顺序保证

必须只有一个分区,如果有多个分许是非常困难的

image-20191103102133614

在重试机制下,消息顺序是有可能打乱的,通过此配置可以实现,有顺序保障,严重影响吞吐量,慎用

image-20191103102223366

mysql 多主搭建(三主,更多主操作相同)

master容器需要做的操作

参考文档 使用docker构建双主mysql

基于 /docker/compose/mysql-ha/docker-compose.yml

一个slave无法同步多个master,所以如果有三个mysql,那么同步关系是:2同步1,3同步2,1同步3 环形

配置时,请梳理清楚同步关系

主从配置,比较简单,值需要配置个slave,就行了,2同步1,其他不需要操作,设置只读请自行查找文档

# 进入容器
docker exec -ti mysql_master1 bash

# 登录mysql
mysql -uroot -proot

# 开放权限
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'root'@'%';

# 查看master的日志文件即位置
show master status;

slave容器需要做的操作

# 配置同步
# master_host:目标主机地址
# master_port:目标主机端口
# master_user,master_password:目标主机用户名密码
# master_log_file,master_log_pos:通过`show master status;`查询出来的信息
change master to master_host='mysql_master2',master_port=3306, master_user='root',master_password='root',master_log_file='mysql-bin.000003',master_log_pos=395;

# 开启同步线程
start slave;

# 查看是否成功,如果成功会显示:
# Slave_IO_Running: Yes  # 如果为NO,请检查网络或者账号密码端口号
# Slave_SQL_Running: Yes
show slave status \G;

# 停止同步
# stop slave;

linux 挂在smb

yum install cifs-utils -y mount -t cifs -o username=linux,password=123123 //192.168.1.117/linux /nas

空文件

简介

docker的简单应用 展开 收起
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/skybob8478/docker.git
git@gitee.com:skybob8478/docker.git
skybob8478
docker
docker
master

搜索帮助