真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么在Docker中使用Serf

這篇文章主要講解了“怎么在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.King 
RUN 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 King 

RUN 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_ADDRSERF_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)注!


新聞名稱:怎么在Docker中使用Serf
URL地址:http://weahome.cn/article/jsdoci.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部