Docker常用命令总结

查看docker服务端和客户端版本
# docker version

查看docker容器信息,显示 Docker 系统信息,包括镜像和容器数。
# docker info

帮助命令
# docker –help

查看docker进程
docker ps
[参数列表]
-l 返回最后的容器的状态
-a 看所有容器包括已经停止的容器

从服务器拉取镜像
# docker pull  

列出本地所有镜像
# docker images
# docker image prune // 删除所有悬虚镜像

存储镜像
# docker save 

载入镜像
# docker load 

删除容器
# docker rmi 

将已终止容器启动
# docker start 

停止正在运行的容器
# docker stop

命令来停止容器或然后再启动容器。
# docker restart

提交本地修改容器
# docker commit 

查看docker容器信息
# docker inspect <容器名>

查看容器
# docker container ls  //查看所有运行的容器
# docker container prune  //删除所有的停止的运行的容器

查看数据卷
# docker volume
# docker volume prune //删除所有停止使用的数据卷

查看docker的宿主机端口映射容器端口
# docker port <容器名>

查看docker 系统镜像、容器、数据卷使用情况
# docker sytem df  

从宿主机进入docker容器
docker exec -it <容器id> bash
docker exec -it <容器id> sh
docker exec -it <容器id> bash
docker exec -it <容器id> sh

物理机和容器之间复制命令如下:
容器复制文件到物理机:docker cp <容器名称>:<容器目录> <物理机目录>
物理机复制文件到容器:docker cp <物理机目录> <容器名称>:<容器目录>
eg:docker cp channelWeb:/opt/tomcat/apache-tomcat-7.0.75/webapps/channel-web.war /home/app/

查看docke容器内日志
# docker logs -f –tail=100  <容器名>

查看docker各容器CPU占用情况
# ctop

运行docker虚拟机
# docker run –name <虚拟机别名> –rm -p <宿主机端口:虚拟机端口>  –network  <自定义网络>  <镜像名称>
[参考资料]
[参数列表]
-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,
-i 则让容器的标准输入保持打开。
-d 让 Docker 容器在后台以守护态(Daemonized)形式运行
-v 标记来创建一个数据卷并挂载到容器里。在一次 run 中多次使用可以挂载多个数据卷。用户也可以通过 :ro 指定为只读。
-p 标示来指定端口。

进入容器 
# docker exec -it <容器名称> bash

导出容器快照
# docker export 

导入容器快照
# docker import 

《RabbitMQ 实战指南》读书笔记

RabbitMQ的模型架构介绍
可以把消息传递的过程想象成:当你将一个包裹送到邮局,邮局会暂存并最终将邮件通过邮递员送到收件人的手上, RabbitMQ 就好比由邮局、邮箱和邮递员组成的一个系统。
  • producer:生产者(发件人),消息的投递方
  • broker:消息中间件的中间节点(邮局,也可以看作一台Rabbit MQ服务器)
  • exchange:交换器(中分拣员),它根据分发规则,匹配查询表中的routing key,分发消息到queue中去。
  • queue:队列(收件人查收信件时的邮箱)
  • routingkey:路由键(填写在包裹上的地址),在某些情形下, RoutingKey 与BindingKey 可以看作同一个东西。
  • bing:绑定(???),通过绑定将exchange和queue关联起来,某些情况下会分配一个bandingkey(direct、topic)
  • bandingkey:绑定键(于包裹的目的地)
  • comsumer:消费者(收件人),消息的消费方
Exchange分类
  • fanout(广播,一对多)、不用配置RoutingKey 和 BandingKey,交换器会无视BindingKey将消息路由到所有绑定到该交换器的队列中。
  • direct(直连,一对一)、RoutingKey 和 BandingKey 必须相同,消息才能正常发送到queue
  • topic(主题,模糊,一对多)、RoutingKey 和 BandingKey 做模糊匹配,两者不是相同的
  • headers(基本上不用)
Routingkey中可以包含两种通配符
  • “.”  字符串分割符
  • “#” 通配任何零个或多个word
  • “*” 通配任何单个word

connection 和 channel 之间的关系
Connection 可以用来创建多个Channel 实例,但是Channel 实例不能在线程问共享,应用程序应该为每一个线程开辟一个Channel 。某些情况下Channel 的操作可以并发运行,但是在其他情况下会导致在网络上出现错误的通信帧交错,同时也会影响友送方确认( publisherconfrrm)机制的运行,所以多线程问共享Channel 实例是非线程安全的RabbitMQ 采用类似NIO的做法,选择TCP 连接复用,不仅可以减少性能开销便于管理。同时RabbitMQ 可以确保每个线程的私密性,就像拥有独立的连接一样。当每个信道的流量不是很大时,复用单一的Connection 可以在产生性能瓶颈的情况下有效地节省TCP 连接资源。

每个线程把持一个信道(channel),所以信道复用了Connection 的TCP 连接。当信道本身的流量很大时,这时候多个信道复用一个Connection 就会产生性能瓶颈,进而使整体的流量被限制了。此时就需要开辟多个Connection ,将这些信道均摊到这些Connection 中,Connection 可以用来创建多个Channel 实例,但是Channel 实例不能在线程问共享,应用程序应该为每一个线程开辟一个Channel 。某些情况下Channel 的操作可以并发运行,但是在其他情况下会导致在网络上出现错误的通信帧交错,同时也会影响友送方确认( publisher confrrm)机制的运行,所以多线程问共享Channel 实例是非线程安全的。


AMQP 生产者发送消息流程
AMQP 消费者发送消息流程

高级参数
  • mandatory 参数
  • alternate-exchange 备份交换机
  • 过期时间 TTL
    • 设置消息ttl:x-message-ttl
    • 设置队列ttl:x-expires
  • 死信队列 x-dead-letter-exchange
  • 延迟队列,没有直接支持,通过DLX 和TTL 模拟出延迟队列的功能。
  • 优先级队列 x-max-priority

MyBaits常见问题总结


1、mybaits中使用小于号

【错误分析】
如过在mybatis中使用<>&等字符,配置文件中会提示如下错误
The content of elements must consist of well-formed character data or markup.
【解决方法】
方法一   如果是在动态语句中,则需要转换

符号:

方法二 (推荐), 此时特殊符号不进行解析

【参考资料】



2、mybatis 可以返回map类型对象

注意:resultMap  和 resultType 区别



3、mybaits 查询sql中in的写法



4、mybatis 查询like 正规写法

正确方法一:

正确方法二:
like “%”#{name}”%”
错误方法
like ‘%”#{name}”%’
【参考资料】

MySQL数据join不走索引问题排查

【问题场景】

有个30多行的大SQL执行效率特别慢,问题集中在一个子查询上,开始没有建索引,可是发现索引都创建了,不走索引,大SQL简化一下,提出不走索引的部分,如下图所示

简单点,有三张表需要关联查询,关联关系如下

A表

B表 关联 A.col = B.id

C表 关联 B.col = C.id

问题出在 B表 关联 A.col = B.id,为啥?执行计划就是不走id主键,C表 关联 B.col = C.id都可以正常走

【解决思路】

1、尝试单表查询,验证索引是否正常 试了一下单表查询B是可以走主键索引,正常,排出索引问题

2、尝试优化SQL 修改了一下SQL,将left join 分别改为inner join,join和子查询,几种方式都不能走索引,排出优化可能

3、尝试在其他环境执行

发现在其他环境下可以正常,走索引,说明不是SQL的问题,排出SQL问题。

TMD !!! 到底哪出问题

既然有环境可以,肯定是哪里配置有问题,慢慢对比一下,于是从表结构,索引创建方式,逐一排查,还是没有发现问题。

没有思路了,困意来袭,下班回家,明日再战


新的一天开始,没办法,在baidu继续搜搜,“SQL 不走索引”

忽然间发现了一篇文章 https://www.cnblogs.com/jarjune/articles/7912722.html

启发了我,是不是两张表的编码方式不一样呢,有思路来,开搞,哈哈 ……

先看表的编码,哇塞,uft8mb4

再看字段的编码,神马,uft8mb4

我们默认都是uft8,谁干的,我的刀呢 …… 修改了表的编码和字段的编码方式,终于可以正常走索引了

【总结】

  • 对于大SQL,不要抱着大西瓜跑步,轻装上路。精确定位问题,简化问题,逐步缩小范围
  • 在一两个人开发的时候,大家都熟悉规范,使用默认的编码方式,一般会忽略编码方式不同的问题,所以团队开发要注意遵守规范
  • 在使用join连接查询的时候,如果编码不一致,就不走索引了

Docker 实践问题汇总

【问题1】 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

—————————————

【解决】 没有启动 docker 服务,执行启动docker服务 


【问题2】 Job for docker.service failed because the control process exited with error code. See “systemctl status docker.service” and “journalctl -xe” for details

—————————————

【解决】 Docker启动异常的可能原因:

  • 1、内存不够:Docker 启动至少需要2G内存,首先执行free -mh命令查看剩余内存是否足够
  • 2、端口冲突:该docker监听端口已经被其他进程占用,一般此种问题容易出现在新部署的服务,或在原有机器上部署新的后台服务,所以在部署之前应该执行命令检查端口是否已经被占用,如果上线后发现占有则应改为可用端口再重启之。

【问题3】 默认配置下,如果在 CentOS 使用 Docker CE 看到下面的这些警告信息: WARNING: bridge-nf-call-iptables is disabled WARNING: bridge-nf-call-ip6tables is disabled

—————————————

【解决】 请添加内核配置参数以启用这些功能。

然后重新加载 sysctl.conf 即可 $ sudo sysctl -p

【问题4】docker容器中没有vim工具

—————————————

【解决】
首先检查这个镜像是基于什么系统


现在docker-hup上大部分都是基于Debian linux构建的,主要是因为这个Debian系统内核比较小。可以通过执行如下命令完成vim安装。

【docker 使用注意事项】

1、制作镜像尽量避免使用docker commit命令,原因这样制作的镜像像一个黑盒操作,开发人员不知道里面具体改动了那些内容。 docker commit 可以用于被攻击后记录轨迹
2、docker run 宿主机端口:docker虚拟机端口 注意:在冒号前面的端口为宿主机的端口,后面的为虚拟机端口
3、强烈建议将容器加入自定义的 Docker 网络来连接多个容器,而不是使用 –link 参数。
4、使用docker image prune 可以清除无用的虚悬镜像
5、docker run –name 最好使用name参数配置,给启动的docker镜像起一个名字,否则docker每次回自动给其命名,且每次的名字不 一样。


【dockerfile 编写注意事项】

1、使用dockerfile制作docker镜像时,同类命令尽量使用&&拼接,减少创建的镜像层数,提高镜像创建速度 注意:docker最大镜像层数127
2、dockerfile中记录使用的cmd命令,会被docker run 后面的执行的命令覆盖
3、dockerfile中ADD命令可以实现自动解压的效果。注意,虽然ADD和COPY都可以复制文件,但建议只有在需要对复制文件进行自动解压时使用add。