基于docker搭建測試環(huán)境
layout: post
title: 基于docker搭建測試環(huán)境
category: 技術(shù)
tags: Docker
keywords: Docker shipyard jenkins
簡介
當(dāng)web項(xiàng)目開發(fā)完畢后,一般會(huì)在測試環(huán)境上運(yùn)行一下,供開發(fā)部門調(diào)錯(cuò)和測試部門測試。對于具有一定業(yè)務(wù)規(guī)模的公司,幾十個(gè)上百個(gè)web服務(wù),每個(gè)服務(wù)分別占用一個(gè)tomcat目錄,配置過程繁瑣,且無法集中管理。此外,對于公司的新手來講,需要一定的背景知識(shí)才可以上手。
本文主要講述基于docker搭建測試環(huán)境,或許可以解決部分上述問題。
總體思路
- 業(yè)務(wù)代碼(包括Dockerfile文件)通過git提交,使用Jenkins或hudson觸發(fā)maven編譯項(xiàng)目代碼、并制作成docker鏡像,push到docker鏡像服務(wù)器。
- 登錄shipyard,deploy docker容器
業(yè)務(wù)流程
1、在web項(xiàng)目目錄中添加一個(gè)Dockerfile文件
FROM tomcat
ADD *.war $TOMCAT_HOME/webapps
# 啟動(dòng)tomcat并監(jiān)聽tomcat日志
CMD bash start.sh
2、創(chuàng)建一個(gè)新的hudson job,并build。
3、進(jìn)入http://shipyard:8080/,通過web ui決定在哪臺(tái)主機(jī)上運(yùn)行項(xiàng)目實(shí)例,并配置映射端口。
基于docker測試環(huán)境的安裝
jenkin與docker的整合參見:[使用Jenkins來構(gòu)建Docker容器](http://www.cnblogs.com/Leo_wl/p/4314792.html ""),在此就不班門弄斧了。
該測試環(huán)境使用shipyard管理docker鏡像和容器(運(yùn)行web實(shí)例)。shipyard, Built on Docker Swarm, Shipyard gives you the ability to manage Docker resources including containers, images, private registries and more.
示例環(huán)境描述:在192.168.56.154,192.168.56.155上搭建docker swarm集群,并在192.168.56.154上運(yùn)行shipyard controller。
安裝docker registry
docker run -d -p 5000:5000 -v /root/registry:/tmp/registry registry
安裝docker swarm
1、為192.168.56.154,192.168.56.155安裝docker,并配置其DOCKER_OPTS="--insecure-registry 私服ip:5000 -H 0.0.0.0:2375 -H unix:///var/run/docker.sock"
2、為192.168.56.154,192.168.56.155搭建zookeeper集群(也可以使用現(xiàn)成的zookeeper集群,其它配置工具etcd等也可)
3、為192.168.56.154,192.168.56.155搭建docker swarm(zookeeper只是其中一種服務(wù)發(fā)現(xiàn)的方式)
- root@192.168.56.155 # docker run -ti -d --restart=always --name shipyard-swarm-agent swarm join zk://192.168.56.154,192.168.56.155/swarm --addr=192.168.56.155:2375
這容器工作就是:不停的向zookeeper注冊該節(jié)點(diǎn)的信息,進(jìn)入zookeeper命令行可以看到
- [zk: 192.168.56.154:2181(CONNECTED) 5] ls /swarm/docker/swarm/nodes
- [192.168.56.155:2375]
- root@192.168.56.154 # docker run -ti -d --restart=always --name shipyard-swarm-agent swarm join zk://192.168.56.154,192.168.56.155/swarm --addr=192.168.56.154:2375
- root@192.168.56.154 # docker run -ti -d --restart=always --name shipyard-swarm-manager -p 2376:2376 swarm manage zk://192.168.56.154,192.168.56.155/swarm --host tcp://0.0.0.0:2376
--host tcp://0.0.0.0:2376是設(shè)置容器中swarm的http server監(jiān)聽2376端口,-p 2376:2376是將容器的2376端口映射出來,注意2376端口是隨意弄的,但該端口不能命名為2375。至此,docker swarm將以192.168.56.154:2376對外提供web服務(wù)
shipyard 手動(dòng)安裝步驟
shipyard***的是3.0.0版,基于docker swarm,其所有組件以docker容器方式運(yùn)行,有兩種部署方式
- 自動(dòng)部署,命令:curl -sSL https://shipyard-project.com/deploy | bash -s
- 手動(dòng)部署,手動(dòng)依次啟動(dòng)必須的容器組件。
安裝過程
1、通過/root/shipyard/data持久化數(shù)據(jù)庫中的數(shù)據(jù)
- root@192.168.56.154 # docker run -ti -d --restart=always --name shipyard-rethinkdb -v /root/shipyard/data:/data rethinkdb
2、安裝shipyard-controller
- root@192.168.56.154 # docker run -ti -d --restart=always --name shipyard-controller --link shipyard-rethinkdb:rethinkdb --link shipyard-swarm-manager:swarm -p 8080:8080 shipyard/shipyard:latest server -d tcp://swarm:2376
需要注意的問題
docker容器一定可以訪問宿主機(jī)么
理論上是可以訪問的,但如果你的宿主機(jī)打開了防火墻,對于192.168.56.154執(zhí)行docker run -ti -d --restart=always --name shipyard-swarm-agent swarm join zk://192.168.56.154,192.168.56.155/swarm --addr=192.168.56.154:2375時(shí),可能會(huì)失敗,因?yàn)閟warm容器無法訪問192.168.56.154的2376端口
清掉過時(shí)的鏡像和容器
對于測試環(huán)境,業(yè)務(wù)代碼經(jīng)常更新,因此會(huì)產(chǎn)生非常多的docker鏡像和容器,需要在合適的實(shí)際將其干掉。這涉及到
- 鏡像的命名策略
- 干掉old鏡像以及對應(yīng)container的時(shí)機(jī)
我采用以下策略:鏡像名與jenkins的JOB_NAME相同,在使用jenkins build鏡像時(shí),便通過swarm/docker remote RESTFUL API干掉原有的鏡像和容器。
優(yōu)勢
- docker鏡像集中管理(通過web ui進(jìn)行管理)
- docker容器(類似于一個(gè)項(xiàng)目實(shí)例)集中管理,并可以監(jiān)控所有實(shí)例的運(yùn)行狀態(tài),還可以創(chuàng)建、刪除“運(yùn)行實(shí)例”
- 減少操作步驟,只需要極少的背景知識(shí)(為調(diào)試項(xiàng)目,需要懂一點(diǎn)docker命令)。
不足
- 運(yùn)行的web項(xiàng)目只可以調(diào)用其它服務(wù)(包括redis、rabbitmq等),不能對外提供服務(wù)(不是不可以做,而是復(fù)雜的端口映射不好管理(可以使用nginx可以解決))。





























