這篇文章主要講解了“怎么在Docker中使用Serf”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“怎么在Docker中使用Serf”吧!
十多年的習(xí)水網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。網(wǎng)絡(luò)營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整習(xí)水建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)公司從事“習(xí)水網(wǎng)站設(shè)計(jì)”,“習(xí)水網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
#在Docker中使用Serf
編寫思路來(lái)自 Decentralizing Docker: How to Use Serf with Docker 本文已提交 dockboard 發(fā)布,在此利用開源中國(guó)的知名度擴(kuò)散,感謝。
在之前的 Docker Link使用示例 中,我們對(duì) Docker 的link特性進(jìn)行了簡(jiǎn)單的演示,這次的主題是使用 Serf 實(shí)現(xiàn)更加低耦合的容器關(guān)系結(jié)構(gòu),最終達(dá)到的效果是服務(wù)化各個(gè)服務(wù)。
Serf 是一個(gè)去中心化的服務(wù)發(fā)現(xiàn)和編排的解決方案,特點(diǎn)是輕量級(jí)和高可用,同時(shí)具備容錯(cuò)的特性。
##構(gòu)建Serf鏡像
在這我并沒(méi)有使用 Supervisord 來(lái)啟動(dòng)Serf服務(wù),大家可以參照后面的示例來(lái)啟動(dòng)Serf。
Dockerfile_serf:
FROM ubuntu:12.04 MAINTAINER Marker.KingRUN echo "deb http://mirrors.aliyun.com/ubuntu precise main universe" > /etc/apt/sources.list RUN apt-get update RUN apt-get install -y wget unzip RUN wget --no-check-certificate https://dl.bintray.com/mitchellh/serf/0.4.1_linux_amd64.zip RUN unzip 0.4.1_linux_amd64.zip RUN rm 0.4.1_linux_amd64.zip RUN mv serf /usr/bin/ EXPOSE 7946 7373 CMD ["-tag", "role=serf-agent"] ENTRYPOINT ["serf", "agent"]
構(gòu)建Serf鏡像:
$ docker build -t serf - < Dockerfile_serf
##構(gòu)建MySQL鏡像
這一步比較復(fù)雜,我們將編寫多個(gè)shell腳本,用于啟動(dòng)supervisor、啟動(dòng)mysql、創(chuàng)建數(shù)據(jù)庫(kù)用戶、創(chuàng)建數(shù)據(jù)庫(kù)等,先讓我們看一下目錄結(jié)構(gòu)
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/bash read -r line if [ -n "$line" ]; then echo "=> Creating database $line" mysql -uroot -e "CREATE DATABASE $line" echo "=> Done!" else echo "Usage: $0" exit 1 fi
create_mysql_admin_user.sh:
#!/bin/bash if [ -f /.mysql_admin_created ]; then echo "MySQL 'admin' user already created!" exit 0 fi /usr/bin/mysqld_safe > /dev/null 2>&1 & PASS=$(pwgen -s 12 1) echo "=> Creating MySQL admin user with random password" RET=1 while [[ RET -ne 0 ]]; do sleep 5 mysql -uroot -e "CREATE USER 'admin'@'%' IDENTIFIED BY '$PASS'" RET=$? done mysql -uroot -e "GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION" mysqladmin -uroot shutdown echo "=> Done!" touch /.mysql_admin_created echo "========================================================================" 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/bash exec 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/bash if [ ! -f /.mysql_admin_created ]; then /create_mysql_admin_user.sh fi exec supervisord -n
start-serf.sh:
#!/bin/bash exec serf agent -tag role=db \ -event-handler="user:create_db=/create_db.sh"
start.sh:
#!/bin/bash exec mysqld_safe
supervisord-mysqld.conf:
[program:mysqld] command=/start.sh numprocs=1 autostart=true autorestart=true
supervisord-serf.conf:
[program:serf] command=/start-serf.sh numprocs=1 autostart=true autorestart=true [program:serf-join] command=/join-cluster.sh autorestart=false
Dockerfile:
FROM ubuntu:12.04 MAINTAINER Marker KingRUN echo "deb http://mirrors.aliyun.com/ubuntu precise main universe" > /etc/apt/sources.list RUN apt-get update RUN apt-get -y upgrade RUN ! DEBIAN_FRONTEND=noninteractive apt-get -qy install unzip supervisor mysql-server pwgen; ls ADD https://dl.bintray.com/mitchellh/serf/0.4.1_linux_amd64.zip serf.zip RUN unzip serf.zip RUN rm serf.zip RUN mv serf /usr/bin/ ADD /run.sh /run.sh ADD /start.sh /start.sh ADD /start-serf.sh /start-serf.sh ADD /join-cluster.sh /join-cluster.sh ADD /supervisord-mysqld.conf /etc/supervisor/conf.d/supervisord-mysqld.conf ADD /supervisord-serf.conf /etc/supervisor/conf.d/supervisord-serf.conf ADD /my.cnf /etc/mysql/conf.d/my.cnf ADD /create_mysql_admin_user.sh /create_mysql_admin_user.sh ADD /create_db.sh /create_db.sh RUN chmod 755 /*.sh EXPOSE 3306 7946 7373 CMD ["/run.sh"]
大家可能看到了,這里使用了ADD https://dl.bintray.com/mitchellh/serf/0.4.1_linux_amd64.zip serf.zip
來(lái)添加一個(gè)遠(yuǎn)程文件到鏡像中,這跟Serf服務(wù)鏡像構(gòu)建時(shí)使用的方法不一樣,但是達(dá)到了同樣的效果。在此我需要解釋一下,RUN wget
是可以被緩存的,而ADD
是不能夠被緩存的,也就是說(shuō)每次構(gòu)建都會(huì)再次下載這個(gè)文件,RUN wget
則會(huì)使用緩存,從而加快構(gòu)建速度。大家可以試一下分別構(gòu)建兩次鏡像,可以發(fā)現(xiàn)Serf鏡像第二次全部使用了緩存,而mysql會(huì)在Step 6再次下載文件。
進(jìn)入mysql目錄構(gòu)建鏡像:
$ docker build -t mysql .
##測(cè)試Serf連接
通過(guò)Serf鏡像啟動(dòng)一個(gè)容器:
$ SERF_ID=$(docker run -d -p 7946 -p 7373 -name serf_agent serf)
讓我們測(cè)試一下Serf是否正常工作,在我們的宿主機(jī)上(安裝docker的機(jī)器)也安裝Serf,來(lái)連接容器的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 members packer-virtualbox 10.0.2.15:7946 alive
現(xiàn)在,在我們的機(jī)器上就擁有了一個(gè)可用的Serf,你可以連接Docker的Serf代理容器來(lái)看看效果:
$ serf join $(docker port $SERF_ID 7946) Successfully joined cluster by contacting 1 nodes. $ serf members precise64 10.0.2.15:7946 alive 9be517551dda 172.17.0.2:7946 alive role=serf-agent
##測(cè)試Serf事件派發(fā)到mysql服務(wù)
讓我們啟動(dòng)一個(gè)mysql容器,并與serf_agent連接,使用-link參數(shù),注意格式為name:alias,這里alias必須使用serf_agent,因?yàn)樵趈oin-cluster.sh中固定調(diào)用了SERF_AGENT_PORT_7946_TCP_ADDR
和SERF_AGENT_PORT_7946_TCP_PORT
兩個(gè)環(huán)境變量,可以按照不同的名稱要求做連接,命令如下:
$ MYSQL_ID=$(docker run -d -p 3306 -p 7946 -p 7373 -link serf_agent:serf_agent mysql)
在宿主機(jī)中查看Serf集群情況:
$ serf members precise64 10.0.2.15:7946 alive 9be517551dda 172.17.0.2:7946 alive role=serf-agent 410d5a7f709a 172.17.0.3:7946 alive role=db
因?yàn)樵趍ysql容器啟動(dòng)時(shí),執(zhí)行了join-cluster.sh腳本連接到了serf_agent,因此在宿主機(jī)中我們可以看到之后加入進(jìn)來(lái)的mysql。
此時(shí)我們可以通過(guò)docker logs $MYSQL_ID
查看mysql輸出的用戶名和密碼信息(可以通過(guò)修改create_mysql_admin_user.sh來(lái)改變用戶信息或輸出格式等)。
$ 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 ========================================================================
執(zhí)行自定義命令,通知mysql創(chuàng)建數(shù)據(jù)庫(kù):
$ serf event create_db wordpress Event 'create_db' dispatched! Coalescing enabled: true
連接數(shù)據(jù)庫(kù),并查看數(shù)據(jù)庫(kù)是否創(chuàng)建成功:
$ mysql -uadmin -paWQD8mdb3N1j -h227.0.0.1 -P49157 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | | wordpress | +--------------------+ 5 rows in set (0.00 sec)
成功了!我們看到了數(shù)據(jù)庫(kù)已經(jīng)被創(chuàng)建。
#總結(jié)
今天的示例就寫到這里,大家可以繼續(xù)發(fā)散思考,我的mysql容器已經(jīng)具備了接受命令的功能,那么如果我再創(chuàng)建一個(gè)wordpress容器,當(dāng)容器啟動(dòng)時(shí)會(huì)發(fā)送create_db命令給serf_agent,這樣mysql就達(dá)到了服務(wù)化的目的。當(dāng)然能夠服務(wù)化的還很多,例如:負(fù)載均衡、memcached、redis等等。如果大家有什么更好的想法,可以共享出來(lái),我的郵箱地址是:majk@vip.qq.com
感謝各位的閱讀,以上就是“怎么在Docker中使用Serf”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)怎么在Docker中使用Serf這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!