更新时间:2022-09-24 15:17:38
brew install boot2docker boot2docker init boot2docker up
export DOCKER_IP=`boot2docker ip` export DOCKER_HOST=`boot2docker socket`
docker ps
Dockerfile
文件,将以下内容写入其中:FROM python:3 EXPOSE 80 CMD ["python", "-m", "http.server"]
docker build -t python/server .
python/server
的镜像,通过执行以下命令运行一个容器:docker run -it \ -p 8000:80 python/server
curl
命令调用这个简单服务来测试它是否能够正常运行:curl $DOCKER_IP:8000
docker run -it -h node \ -p 8500:8500 \ -p 8600:53/udp \ progrium/consul \ -server \ -bootstrap \ -advertise $DOCKER_IP \ -log-level debug
$DOCKER_IP:8500
,你将在控制面板上看到Consul中已经注册的所有服务。curl
向Consul的Web API注册一个服务:curl -XPUT \ $DOCKER_IP:8500/v1/agent/service/register \ -d '{ "ID": "simple_instance_1", "Name":"simple", "Port": 8000, "tags": ["tag"] }'
dig
命令查询Consul为这个提供的DNS API:dig @$DOCKER_IP -p 8600 simple.service.consul
; <<>> DiG 9.8.3-P1 <<>> simple.service.consul ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39614 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;simple.service.consul. IN A ;; ANSWER SECTION: simple.service.consul. 0 IN A 192.168.59.103 ;; Query time: 1 msec ;; SERVER: 192.168.59.103#53(192.168.59.103) ;; WHEN: Mon Jan 12 15:35:01 2015 ;; MSG SIZE rcvd: 76
dig @$DOCKER_IP -p 8600 SRV simple.service.consul
; <<>> DiG 9.8.3-P1 <<>> SRV simple.service.consul ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3613 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; QUESTION SECTION: ;simple.service.consul. IN SRV ;; ANSWER SECTION: simple.service.consul. 0 IN SRV 1 1 8000 node.node.dc1.consul. ;; ADDITIONAL SECTION: node.node.dc1.consul. 0 IN A 192.168.59.103 ;; Query time: 1 msec ;; SERVER: 192.168.59.103#53(192.168.59.103) ;; WHEN: Mon Jan 12 15:36:54 2015 ;; MSG SIZE rcvd: 136
docker run -it \ -v /var/run/docker.sock:/tmp/docker.sock \ -h $DOCKER_IP progrium/registrator \ consul://$DOCKER_IP:8500
docker run -it \ -e "SERVICE_NAME=simple" \ -p 8000:80 python/server
nginx.conf
这个文件,将所有服务的路由信息列入其中,然后重新加载Nginx的配置,使得多个相似服务达到负载均衡,或者给多种服务提供一个单一的终端。FROM nginx:1.7 #Install Curl RUN apt-get update -qq && apt-get -y install curl #Download and Install Consul Template ENV CT_URL http://bit.ly/15uhv24 RUN curl -L $CT_URL | \ tar -C /usr/local/bin --strip-components 1 -zxf - #Setup Consul Template Files RUN mkdir /etc/consul-templates ENV CT_FILE /etc/consul-templates/nginx.conf #Setup Nginx File ENV NX_FILE /etc/nginx/conf.d/app.conf #Default Variables ENV CONSUL consul:8500 ENV SERVICE consul-8500 # Command will # 1. Write Consul Template File # 2. Start Nginx # 3. Start Consul Template CMD echo "upstream app { \n\ least_conn; \n\ {{range service \"$SERVICE\"}} \n\ server {{.Address}}:{{.Port}}; \n\ {{else}}server 127.0.0.1:65535;{{end}} \n\ } \n\ server { \n\ listen 80 default_server; \n\ location / { \n\ proxy_pass http://app; \n\ } \n\ }" > $CT_FILE; \ /usr/sbin/nginx -c /etc/nginx/nginx.conf \ & CONSUL_TEMPLATE_LOG=debug consul-template \ -consul=$CONSUL \ -template "$CT_FILE:$NX_FILE:/usr/sbin/nginx -s reload";
\n\
表示另起一行,并且为Docker的多行命令去除换行。app.conf
文件并且重新加载Nginx。docker build -t drcon .
docker run -it \ -e "CONSUL=$DOCKER_IP:8500" \ -e "SERVICE=simple" \ -p 80:80 drcon
SERVICE
选项用来指定Consul上的服务。因此,上面这个DR CoN 容器将会通过所有命名为 simple
的服务来达到负载均衡。docker run -it -h node \ -p 8500:8500 \ -p 53:53/udp \ progrium/consul \ -server \ -bootstrap \ -advertise $DOCKER_IP
docker run -it \ -v /var/run/docker.sock:/tmp/docker.sock \ -h $DOCKER_IP progrium/registrator \ consul://$DOCKER_IP:8500
docker run -it \ -e "CONSUL=$DOCKER_IP:8500" \ -e "SERVICE=simple" \ -p 80:80 drcon
curl $DOCKER_IP:80
命令,结果如下:curl: (52) Empty reply from server
simple
的服务:docker run -it \ -e "SERVICE_NAME=simple" \ -p 8000:80 python/server
curl $DOCKER_IP:80
将成功路由到这个服务。docker run -it \ -e "SERVICE_NAME=simple" \ -p 8001:80 python/server
while true; do curl $DOCKER_IP:80; sleep 1; done
这个脚本,当关闭或者启动simple服务时,脚本仍在快速运行且所有请求都能正常进行。