博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在Docker中使用Serf
阅读量:6959 次
发布时间:2019-06-27

本文共 6335 字,大约阅读时间需要 21 分钟。

  hot3.png

#在Docker中使用Serf

编写思路来自 本文已提交 发布,在此利用开源中国的知名度扩散,感谢。

在之前的 中,我们对 的link特性进行了简单的演示,这次的主题是使用 实现更加低耦合的容器关系结构,最终达到的效果是服务化各个服务。

Serf 是一个去中心化的服务发现和编排的解决方案,特点是轻量级和高可用,同时具备容错的特性。

##构建Serf镜像

在这我并没有使用 来启动Serf服务,大家可以参照后面的示例来启动Serf。

Dockerfile_serf

FROM ubuntu:12.04MAINTAINER Marker.King 
RUN echo "deb http://mirrors.aliyun.com/ubuntu precise main universe" > /etc/apt/sources.listRUN apt-get updateRUN apt-get install -y wget unzipRUN wget --no-check-certificate https://dl.bintray.com/mitchellh/serf/0.4.1_linux_amd64.zipRUN unzip 0.4.1_linux_amd64.zipRUN rm 0.4.1_linux_amd64.zipRUN mv serf /usr/bin/EXPOSE 7946 7373CMD ["-tag", "role=serf-agent"]ENTRYPOINT ["serf", "agent"]

构建Serf镜像

$ docker build -t serf - < Dockerfile_serf

##构建mysql镜像

这一步比较复杂,我们将编写多个shell脚本,用于启动supervisor、启动mysql、创建数据库用户、创建数据库等,先让我们看一下目录结构

mysql +      | - create_db.sh      | - create_mysql_admin_user.sh      | - Dockerfile      | - join-cluster.sh      | - my.cnf      | - run.sh      | - start-serf.sh      | - start.sh      | - supervisord-mysqld.conf      | - supervisord-serf.conf

create_db.sh

#!/bin/bashread -r lineif [ -n "$line" ]; then	echo "=> Creating database $line"	mysql -uroot -e "CREATE DATABASE $line"	echo "=> Done!"else	echo "Usage: $0 
" exit 1fi

create_mysql_admin_user.sh

#!/bin/bashif [ -f /.mysql_admin_created ]; then	echo "MySQL 'admin' user already created!"	exit 0fi/usr/bin/mysqld_safe > /dev/null 2>&1 &PASS=$(pwgen -s 12 1)echo "=> Creating MySQL admin user with random password"RET=1while [[ RET -ne 0 ]]; do	sleep 5	mysql -uroot -e "CREATE USER 'admin'@'%' IDENTIFIED BY '$PASS'"	RET=$?donemysql -uroot -e "GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION"mysqladmin -uroot shutdownecho "=> Done!"touch /.mysql_admin_createdecho "========================================================================"echo "You can now connect to this MySQL Server using:"echo ""echo "    mysql -uadmin -p$PASS -h
-P
"echo ""echo "Please remember to change the above password as soon as possible!"echo "MySQL user 'root' has no password but only allows local connections"echo "========================================================================"

join-cluster.sh

#!/bin/bashexec serf join $SERF_AGENT_PORT_7946_TCP_ADDR:$SERF_AGENT_PORT_7946_TCP_PORT

my.cnf

[mysqld]bind-addres=0.0.0.0

run.sh

#!/bin/bashif [ ! -f /.mysql_admin_created ]; then	/create_mysql_admin_user.shfiexec supervisord -n

start-serf.sh

#!/bin/bashexec serf agent -tag role=db \	-event-handler="user:create_db=/create_db.sh"

start.sh

#!/bin/bashexec mysqld_safe

supervisord-mysqld.conf

[program:mysqld]command=/start.shnumprocs=1autostart=trueautorestart=true

supervisord-serf.conf

[program:serf]command=/start-serf.shnumprocs=1autostart=trueautorestart=true[program:serf-join]command=/join-cluster.shautorestart=false

Dockerfile

FROM ubuntu:12.04MAINTAINER Marker King 
RUN echo "deb http://mirrors.aliyun.com/ubuntu precise main universe" > /etc/apt/sources.listRUN apt-get updateRUN apt-get -y upgradeRUN ! DEBIAN_FRONTEND=noninteractive apt-get -qy install unzip supervisor mysql-server pwgen; lsADD https://dl.bintray.com/mitchellh/serf/0.4.1_linux_amd64.zip serf.zipRUN unzip serf.zipRUN rm serf.zipRUN mv serf /usr/bin/ADD /run.sh /run.shADD /start.sh /start.shADD /start-serf.sh /start-serf.shADD /join-cluster.sh /join-cluster.shADD /supervisord-mysqld.conf /etc/supervisor/conf.d/supervisord-mysqld.confADD /supervisord-serf.conf /etc/supervisor/conf.d/supervisord-serf.confADD /my.cnf /etc/mysql/conf.d/my.cnfADD /create_mysql_admin_user.sh /create_mysql_admin_user.shADD /create_db.sh /create_db.shRUN chmod 755 /*.shEXPOSE 3306 7946 7373CMD ["/run.sh"]

大家可能看到了,这里使用了ADD https://dl.bintray.com/mitchellh/serf/0.4.1_linux_amd64.zip serf.zip来添加一个远程文件到镜像中,这跟Serf服务镜像构建时使用的方法不一样,但是达到了同样的效果。在此我需要解释一下,RUN wget <url>是可以被缓存的,而ADD <url> <name>是不能够被缓存的,也就是说每次构建都会再次下载这个文件,RUN wget <url>则会使用缓存,从而加快构建速度。大家可以试一下分别构建两次镜像,可以发现Serf镜像第二次全部使用了缓存,而mysql会在Step 6再次下载文件。

进入mysql目录构建镜像:

$ docker build -t mysql .

##测试Serf连接

通过Serf镜像启动一个容器:

$ SERF_ID=$(docker run -d -p 7946 -p 7373 -name serf_agent serf)

让我们测试一下Serf是否正常工作,在我们的宿主机上(安装docker的机器)也安装Serf,来连接容器的Serf:

$ wget --no-check-certificate https://dl.bintray.com/mitchellh/serf/0.4.1_linux_amd64.zip$ unzip 0.4.1_linux_amd64.zip$ rm 0.4.1_linux_amd64.zip$ sudo mv serf /usr/bin/$ nohup serf agent &$ serf memberspacker-virtualbox    10.0.2.15:7946    alive

现在,在我们的机器上就拥有了一个可用的Serf,你可以连接Docker的Serf代理容器来看看效果:

$ serf join $(docker port $SERF_ID 7946)Successfully joined cluster by contacting 1 nodes.$ serf membersprecise64        10.0.2.15:7946      alive    9be517551dda     172.17.0.2:7946     alive    role=serf-agent

##测试Serf事件派发到mysql服务

让我们启动一个mysql容器,并与serf_agent连接,使用-link参数,注意格式为name:alias,这里alias必须使用serf_agent,因为在join-cluster.sh中固定调用了SERF_AGENT_PORT_7946_TCP_ADDRSERF_AGENT_PORT_7946_TCP_PORT两个环境变量,可以按照不同的名称要求做连接,命令如下:

$ MYSQL_ID=$(docker run -d -p 3306 -p 7946 -p 7373 -link serf_agent:serf_agent mysql)

在宿主机中查看Serf集群情况:

$ serf membersprecise64        10.0.2.15:7946     alive    9be517551dda     172.17.0.2:7946    alive    role=serf-agent410d5a7f709a     172.17.0.3:7946    alive    role=db

因为在mysql容器启动时,执行了join-cluster.sh脚本连接到了serf_agent,因此在宿主机中我们可以看到之后加入进来的mysql。

此时我们可以通过docker logs $MYSQL_ID查看mysql输出的用户名和密码信息(可以通过修改create_mysql_admin_user.sh来改变用户信息或输出格式等)。

$ docker logs $MYSQL_ID=> Creating MySQL admin user with random password=> Done!========================================================================You can now connect to this MySQL Server using:    mysql -uadmin -paWQD8mdb3N1j -h
-P
Please remember to change the above password as soon as possible!MySQL user 'root' has no password but only allows local connections========================================================================

执行自定义命令,通知mysql创建数据库:

$ serf event create_db wordpressEvent 'create_db' dispatched! Coalescing enabled: true

连接数据库,并查看数据库是否创建成功:

$ mysql -uadmin -paWQD8mdb3N1j -h127.0.0.1 -P49157mysql> show databases;+--------------------+| Database           |+--------------------+| information_schema || mysql              || performance_schema || test               || wordpress          |+--------------------+5 rows in set (0.00 sec)

成功了!我们看到了数据库已经被创建。

#总结

转载于:https://my.oschina.net/marker/blog/202539

你可能感兴趣的文章
C++学习笔记——类
查看>>
Linux命令之chkconfig
查看>>
JVMTI开发教程之一个简单的Agent
查看>>
Git学习笔记
查看>>
Developer Express 之 XtraReport报表预览控件PrintControl设置
查看>>
linux修复丢失的分区表
查看>>
iOS 开发遇到的问题
查看>>
单臂路由的实现
查看>>
国内安全管理平台应用发展对比分析
查看>>
tomcat启动startup.bat一闪而过
查看>>
STL源码剖析之算法:power
查看>>
java栈的两种实现方法
查看>>
Java中的时间和时区
查看>>
我的友情链接
查看>>
SQL Server 索引(index) 和 视图(view) 的简单介绍和操作
查看>>
Apache中使用mod_php的请求响应执行流程
查看>>
spring aop记录日志
查看>>
还有人不认识通讯诈骗,短信验证码带你认识一下
查看>>
Docker(四)镜像创建
查看>>
unigui的UnimDatePicker控件使用经验
查看>>