一、docker簡介
Docker 是個劃時代的開源項目,它徹底釋放了計算虛擬化的威力,極大提高了應(yīng)用的運行效率,降低了云計算資源供應(yīng)的成本! 使用 Docker,可以讓應(yīng)用的部署、測試和分發(fā)都變得前所未有的高效和輕松!
由于容器不需要進(jìn)行硬件虛擬以及運行完整操作系統(tǒng)等額外開銷,Docker 對系統(tǒng)資源的利用率更高。無論是應(yīng)用執(zhí)行速度、內(nèi)存損耗或者文件存儲速度,都要比傳統(tǒng)虛擬機技術(shù)更高效。因此,相比虛擬機技術(shù),一個相同配置的主機,往往可以運行更多數(shù)量的應(yīng)用。
傳統(tǒng)的虛擬機技術(shù)啟動應(yīng)用服務(wù)往往需要數(shù)分鐘,而 Docker 容器應(yīng)用,由于直接運行于宿主內(nèi)核,無需啟動完整的操作系統(tǒng),因此可以做到秒級、甚至毫秒級的啟動時間。大大的節(jié)約了開發(fā)、測試、部署的時間。
二、應(yīng)用思路
文本服務(wù),搜索服務(wù),推薦服務(wù),數(shù)據(jù)采集服務(wù)是達(dá)觀數(shù)據(jù)的四個主要的服務(wù)方向,其中包括的小模塊非常多,像基礎(chǔ)的數(shù)據(jù)庫群,緩存群,消息隊列集群等,我們把業(yè)務(wù)模塊也拆分到不同的容器中,這樣方便各個模塊之間靈活的配合。
主要的集群配置思路如下:
1.容器層:部署起來保證各個模塊的穩(wěn)定性,而且保持邏輯隔離,這樣便于并發(fā)和復(fù)用。
2.網(wǎng)絡(luò)層:建立集群獨立網(wǎng)絡(luò)層,經(jīng)過指定的端口與外部網(wǎng)絡(luò)通訊,保持網(wǎng)絡(luò)層的隔離。
3.負(fù)載均衡:負(fù)載這邊,使用docker自帶的集群負(fù)載均衡策略。
4.服務(wù)守護(hù):使用docker自帶的服務(wù)守護(hù)與分發(fā)策略。
5.全局配置分發(fā):采用docker 的secret作為加密策略。
下面我們用例子講講具體操作。
三、工具及前期準(zhǔn)備
由于我們的目標(biāo)是建立分布式的集群環(huán)境,所以要使用多機部署,并考慮水平擴展性。
我們此處使用20臺阿里云的ecs來進(jìn)行部署,centos 7.2鏡像作為基礎(chǔ)os環(huán)境來講解。
(1)docker 安裝
docker官網(wǎng)下載docker的centos7版本的docker安裝文件,本文使用版本為docker-ce-17.03,docker的詳細(xì)介紹見官網(wǎng)文檔,此處不做贅述,https://docs.docker.com/engine/docker-overview/
文件存放位置:/tmp
文件名稱:
<1> docker-ce-selinux-17.03.1.ce-1.el7.centos.noarch.rpm
<2> docker-ce-17.03.1.ce-1.el7.centos.x86_64.rpm
(2)Docker-machine 安裝
此處選用docker-machine進(jìn)行docker集群的命令調(diào)試
官網(wǎng)下載docker-mashine,本文使用v0.10.0,版本,
Docker-machine 詳細(xì)介紹見官網(wǎng)文檔,此處不做贅述,https://docs.docker.com/machine/overview/
文件存放位置:/tmp
文件名稱:docker-machine-Linux-x86_64
(3)ssh 秘鑰
選取集群主機,生成ssh秘鑰對,方便對各個機器進(jìn)行操作,如對ssh不了解,請查看百度百科
(4)fabric 鏡像制作
由于機器數(shù)量較多并考慮水平擴展性,需選用一款集群命令、文件的分發(fā)工具,本文選用python的fabric進(jìn)行多機控制、文件分發(fā),如對fabric不了解,請查看官方文檔http://www.fabfile.org
四、集群os配置及步驟
1.主機安裝docker,及docker-machine
cd /tmp
$ yum install ./docker-ce-selinux-17.03.1.ce-1.el7.centos.noarch.rpm
$ yum install ./docker-ce-17.03.1.ce-1.el7.centos.x86_64.rpm
$ chmod +x /tmp/docker-machine-Linux-x86_64
$ cp /tmp/docker-machine-Linux-x86_64 /usr/local/bin/docker-machine
2.校驗docker,docker-machine安裝情況
$ docker version
$ docker-machine version
3.制作docker的fabric鏡像
這一步制作fabric鏡像,來在容器中啟動fabric,目的是命令和文件的分發(fā),具體命令與文件規(guī)則見官方文檔。(張弸中 達(dá)觀數(shù)據(jù))
<1>制作Dockerfile,文件內(nèi)容如下:
FROM centos:7.2.1511
LABEL maintainer “zhangpengzhong@datagrand.com”
ENV ENVIRONMENT production
RUN cd / && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN yum update -y \
&& yum install -y wget gcc gcc-c++ python-devel? bzip2 \
&& yum install -y epel-release \
&& yum install -y python-pip \
&& yum clean all \
&& pip install –upgrade pip -i http://pypi.douban.com/simple/ –trusted-host pypi.douban.com \
&& pip install setuptools==33.1.1 -i http://pypi.douban.com/simple/ –trusted-host pypi.douban.com \
&& pip install fabric -i http://pypi.douban.com/simple/ –trusted-host pypi.douban.com
<2>制作鏡像:
docker build -t fabric:v1 .
<3>啟動fabric容器:
啟動并將所需分發(fā)的文件即上文提到的/tmp 目錄中的文件加入到容器中
docker run -itd -v /tmp:/tmp? fabric:v1
查看容器:
docker ps
復(fù)制查詢到的CONTAINER ID(上圖第一列):
2f1dc61db184
進(jìn)入容器:
docker exec -it 2f1dc61db184 /bin/bash
4.容器內(nèi)使用fabric分發(fā)sshkey
vi fabric.py
fabric.py 如下:
#!/usr/bin/env python
# — encoding: utf-8 —
from fabric.api import run, env
env.hosts=[’10.0.0.2’,’10.0.0.3’,’xxx.xxx.xxx.xxx’]
env.user=’root’
env.password = ‘111’
def sshkey():
sk = ‘ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCfgSSubEyt39eouUNvGDpFlo/OwdIgIHsB0h9xDdX9cB6mqcmnC8f2EYheBgC0GPeZfAeRGAWmrQPGh7BzYmk93TBPM8L9SM8ewcFAlG9vKnA7myfjmg6HBfokkZ0vfDAQlApUbANtOZenjIhdrCNnk9MHI2DG8LuC9TPGwzOgMMETY28LRGTjEWwUGnf2kFPHNC4OUUltyEsRLC9IQV2+p8phPwLot8rbVPcOj9j07OVV5bwpkXjrMCut/xnVmz/p1J5hrfPaVyQy633R9Xr47hjT7UYs7RyC8gk/j9fHbbLIvxdXfAsHBcQZ4+2I6kZhOs/JQ54VBbiP4F root@jcloud-daguan-mysql1′
run(‘cd’)
run(‘mkdir .ssh’)
run(‘ echo “‘ + sk + ‘” > .ssh/authorized_keys’)
run(‘chmod 600 .ssh/authorized_keys’)
run(‘chmod 700 -R .ssh’)
def putfile(path1=”,path2=”):
put(path1,path2,mode=0755)
def docker_install():
with cd (‘/tmp’):
run(‘yum install -y docker-ce-selinux-17.03.1.ce-1.el7.centos.noarch.rpm’)
run(‘yum install -y docker-ce-17.03.1.ce-1.el7.centos.x86_64.rpm’)
啟動fabric:
fab -f fabric.py sshkey
5.分發(fā)docker相關(guān)安裝文件
啟動fabric:
fab -f fabric.py putfile /tmp/docker-ce-selinux-17.03.1.ce-1.el7.centos.noarch.rpm /tmp/docker-ce-selinux-17.03.1.ce-1.el7.centos.noarch.rpm
6.為集群每臺機器安裝docker
fab -f fabric.py docker_install
7.退出容器
exit
8.在外部校驗sshkey是否設(shè)置成功
ssh root@10.0.0.2
9.使用docker-machine配置集群:
docker-machine create -d generic –generic-ip-address=10.0.0.2 –generic-ssh-user=root??? worker1
docker-machine create -d generic –generic-ip-address=10.0.0.3 –generic-ssh-user=root??? worker2
依此類推:
docker-machine create -d generic –generic-ip-address=10.0.0.xxx –generic-ssh-user=root??? workerxxx
五、建立docker集群
1.建立docker主機
docker swarm init –advertise-addr 本機ip
如下:
$ docker swarm init –advertise-addr 10.0.0.1
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
–token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
10.0.0.1:2377
To add a manager to this swarm, run ‘docker swarm join-token manager’ and follow the instructions.
2.使用fabric將剩余所有機器加入集群
將上面一步生成的命令行復(fù)制,進(jìn)入剛才的fabric容器修改fabric文件,相當(dāng)于令主機外其他所有機器都執(zhí)行一遍上一步生成的命令
def cluster_join():
run(‘docker swarm join —token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx1ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c 10.0.0.1:2377
‘)
執(zhí)行 fab -f fable.py cluster_join
3.建立集群內(nèi)部網(wǎng)絡(luò)
docker network create -d overlay test_privite
可以用命令查詢是否建立成功
docker network ls
六、啟動docker業(yè)務(wù)容器
這里用mysql,redis,elasticsearch來舉例
1.mysql
此處我們選用版本mysql5.6,鏡像來自docker hub
docker service create –name mysql_test –replicas 1 \
–network test_privite \
–mount type=bind,src=/data/mysql,dst=/var/lib/mysql \
–constraint ‘node.hostname == workerx’ \
-e MYSQL_ROOT_PASSWORD=xxx mysql:5.6 –character-set-server=utf8 –collation-server=utf8_general_ci
2.redis
此處我們選用版本redis 3.2,鏡像來自docker hub
docker service create –name redis_online \
–network test_privite \
–mount type=bind,src=/data/redis,dst=/data \
–constraint ‘node.hostname == workerx’ \
redis:3.2.8 redis-server /usr/local/etc/redis/redis.conf
3.elasticsearch_master
此處我們選用版本elasticsearch5.3.0,鏡像來自docker hub
docker service create –name elasticsearch_master –replicas 1 \
–network test_privite \
–publish mode=host,target=9200,published=9200 \
–constraint ‘node.hostname == workerx’ \
-e cluster.name=xxx \
-e “discovery.zen.ping.unicast.hosts=elasticsearch_master” \
docker.elastic.co/elasticsearch/elasticsearch:5.3.0
4. elastic search client
docker service create –name elasticsearch_master –replicas n \
–network test_privite \
-e cluster.name=xxx \
-e “discovery.zen.ping.unicast.hosts=elasticsearch_master” \
docker.elastic.co/elasticsearch/elasticsearch:5.3.0
七、結(jié)束語
docker的應(yīng)用大大減少了代碼部署的工作量,有效的建立了規(guī)范化的服務(wù)架構(gòu),上面簡單介紹的達(dá)觀數(shù)據(jù)使用docker部署的一個例子,希望對您有所幫助。