由于不好上传文章,我这里直接上传到资源里面,里面pdf进行了详解:http://download.csdn.net/detail/xyblog/9441287
环境要求:ubuntu 15.10
一、docker环境搭建
sudo apt-get update
sudo apt-get install apt-transport-httpsca-certificates
设置key
sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80--recv-keys 58118E89F3A912897C070ADBF76221572C52609D
安装vim
sudo apt-get install vim
sudo vim /etc/apt/sources.list
添加源
deb https://apt.dockerproject.org/repoubuntu-wily main
更新
sudo apt-get update
安装
sudo apt-get install docker-engine
二、安装image
#需要漫长的等待,如果出错了,或者卡死需要执行 sudo service docker restart来重置,然后继续执行下面的拉去命令,直到成功。
sudo docker pull ubuntu:15.10
安装完毕后,查看镜像:
sudo docker images #显示所有的images
画红线的标示了:
REPOSITORY 表示当前仓库名字
TAG 标示image tag
注意:镜像名字:TAG #中间用冒号连接 表示了唯一的一个镜像,如果没有指定 :TAG 只用了 镜像名字 则标示 镜像名字:last 这个镜像。
运行镜像:
sudo docker run –t –i ubuntu:15.10/bin/bash #-t标示模拟终端 -i标示在当前终端输入输出 ubuntu:15.10 标志在ubuntu仓库里面查找15.10标志的image, 最后面 /bin/bash标示执行 这个命令,这里就是获取到一个shell。
修改成自己需要的image:
添加 curl
apt-get update
apt-get install curl
输入 exit退出容器
查看刚才运行的容器:
sudo docker ps –a #显示出来所有容器,
可以看到我们刚才输入exit退出了容器, 那么响应的容器也停止运行了,可以到 STATUS 是 Exited 状态,我们需要现在需要把当前容器保存成为我们自己的容器:
得到容器ID: ca775d29a276
也可以用: sudo docker ps –q 获取到容器id
#提交通过容器建立镜像 local/baseimage:1 这里面local/baseimage标示 仓库名 1是TAG名字, -m标示 消息, -a 标示作者
sudo docker –commit –m “add curl” –a “guhui”ca775d29a276 –t local/baseimage:1
然后用 sudo docker images查看刚才建立的镜像
一、创建image
刚才已经知道如何建立自己的镜像了,现在用更加好和官方推荐的方式制作咱们的redis image。
建立一个目录 : mkdir redis && cd redis
咱们新建一个 dockerfile:
touch Dockerfile
vim Dockerfile
输入下面的内容:
FROM local/baseimage:1
RUN sed -i"s/archive\.ubuntu\.com/mirrors\.163\.com/g" /etc/apt/sources.list
RUN apt-get update
RUN curl –sSL http://download.redis.io/releases/redis-3.0.7.tar.gz-o redis.tar.gz
RUN tar –zxf redis.tar.gz –C/usr/src/redis --strip-components=1
RUN apt-get install –y gcc libc6-dev make
RUN make –C /usr/src/redis
RUN make –C /usr/src/redis install
RUN rm redis.tar.gz
RUN rm –r /usr/src/redis
EXPOSE 6379
CMD [“redis-server”]
说明:docker核心组件有 image、容器、registries,image是只读的一个模板,每次commit或者build其实是在image上面添加一层一层的层;registries就是镜像hub,官方的https://hub.docker.com ,可以在本地搭建自己的hub,在hub里存放了很多的镜像,我们最开始 sudo docker pull ubuntu:15.10就是从官方的hub上面拉去的iamge; 容器这里是一个动态的概念,容器可以运行,停止,重启,删除等,容器通过commit可以变成一个 image。
RUN #在dockerfile中表示在image中执行后面的命令,run只在build的时候才有用。
然后保存: wq
然后可以通过 dockerfile来建立redis image了:
执行:
sudo docker build –t local/redis:1 . #最后面还有一个点号 不要忘了
如果中途出错了,或者build失败,会有临时的容器和空名的image,你需要删除。
删除容器: sudo docker rm 容器ID
删除image: sudo docker rmi 镜像ID
建立成功后会如下所示:
一、运行
在命令行输入 sudo docker run –t –i local/redis:1 显示如下所示,就说明运行成功了。
根据指定的conf来运行redis:
这里有2种方法:第一种是再新建一个Dockerfile来搞:
FROM local/redis:1
COPY /home/guhui/redis.conf/usr/local/redis.conf
EXPOSE 6379
CMD [“redis-server”, “/usr/local/redis.conf”]
这样也是可以运行的,运行命令:
sudo docker run –t –i image
这里用第二种方法:
直接运行:
sudo docker run –v $(pwd)/redis.conf:/usr/local/redis.conf–d local/redis:1 redis-server /usr/local/redis.conf
运行后输出一窜字符串,这个字符串是容器的容器id,咱们看下:
这里显示的容器id是缩减版的
查看容器运行日志:
一、主从配置配置:
先运行主:
sudo docker run –p 7001:6379 –name redis1 –v$(pwd)/redis.conf:/usr/local/redis.conf –d local/redis:1 redis-server/usr/local/redis.conf
说明:run标示运行一个容器–p标示把容器内的端口6379映射到容器外机器的7001端口,如果使用大写的-P就程序随机指定一个端口, --name标示指定容器名称, -v 标示把本地某个文件挂载到容器内部, -d标示在后台运行容器 redis-server/usr/local/redis.conf标示运行redis 并且指定配置文件。
查看运行状况:最后一个NAMES 标志咱指定的名称
查找正在运行的第一个容器:
如果n=-1标示查询所有
获取容器的ip地址:
sudo docker inspect –f ‘{{range.NetworkSetttings.Networks’}}{{.IPAddress}}{{end}}’$(sudo docker ps –q –n=1)
inspect是查询容器信息的; $(sudodocker ps –q n=1)标示查询到第一个运行的容器id。
模糊查询: sudo docker inspect $(sudo docker ps –q –n=1) | grep IPA
咱们再运行一个从:
sudo docker run –p 7002:6379 –name redis2 –v$(pwd)/redis.conf:/usr/local/redis.conf –d local/redis:1 redis-server /usr/local/redis.conf
只修改了映射端口为7002, name改为 redis2
咱们查看容器:
设置主从:
先查看从的ip:
sudo docker inspect –f ‘{{range.NetworkSetttings.Networks’}}{{.IPAddress}}{{end}}’$(sudo docker ps –q –n=1)
连接到从容器:
sudo docker run –t –i local/redis:1redis-cli –h 172.17.0.3 –p 6379
通过redis-cli客户端来连接
info 查看当前从信息:
可以看到是主的,咱现在设置当前redis为从
在查看信息:
可以看到当前客户端 redis2(172.17.0.3)是从,并且已经把redis1(172.17.0.2)作为主了。
当只有一个从的时候,当前从是只读的:
咱们在从上执行 set a 123 可以看出执行不力
当然,咱可以添加一个哨兵来监控此主从:
哨兵配置文档:
哨兵端口默认是: 26379
sentinel monitor master1 172.17.0.2 6379 1 设置主为172.17.0.2
sentinel down-after-milliseconds master13000 #和主交互3秒超时了,主动认为主down了
sentinel failover-timeout master1 5000 #当failover时间内5秒仍然没有传递failover操作就认为failover失败了。
运行哨兵:
查看:
获取到哨兵的ip地址:
查看哨兵日志:
从这里咱就可以看出来:
获取到了一个主 172.17.0.2
从是 172.17.0.3
咱们实际连接到哨兵查看下:
可以看到主name master1 172.17.0.2 都是正确的
咱们进入主看看:
执行命令:
然后咱们到从去执行:
咱们现在模拟主挂掉:
执行stop命令停止容器
咱们在从里执行info查看:
可以看出来,从已经变成主了,连接的从是0,咱们到 sentinel客户端去看看:
可以看出来,以前的从变成主了,
咱们启动停止的以前的主:
sudo docker start 容器id:
咱们查看现在的主;