最近开始学习docker,朋友推荐了一本《docker容器与容器云》的PDF电子版,参照里面第二章3节搭建你的第一个docker应用栈做了实践。书中是在linux环境下搭建的,而我是在windows环境安装了docker,具体安装步骤和入门,后续抽时间写文章出来。
下面直接捡干货写,按步骤进行
1.获取所需镜像
# docker pull django //web应用
# docker pull haproxy //负载均衡服务器
# docker pull redis //redis镜像,构建一个1主2从的主从复制集群
2.启动容器
启动redis容器
# docker run -it --name redis-master -v d:\docker-volume\redis\master:/usr/src/redis redis /bin/bash
# docker run -it --name redis-slave1 -v d:\docker-volume\redis\slave1:/usr/src/redis --link redis-master:master redis /bin/bash
# docker run -it --name redis-slave2 -v d:\docker-volume\redis\slave2:/usr/src/redis --link redis-master:master redis /bin/bash
启动django容器
# docker run -it --name APP1 --link redis-master:db -v d:\docker-volume\django\app1:/usr/src/app django /bin/bash
# docker run -it --name APP2 --link redis-master:db -v d:\docker-volume\django\app2:/usr/src/app django /bin/bash
启动HAProxy容器
# docker run -it --name HAProxy--link APP1:APP1 --link APP2:APP2 -p 6301:6301 -v d:\docker-volume\haproxy:/tmp haproxy/bin/bash
参数说明:
-i使用交互模式
-t分配一个伪终端
--link用来建立容器间的连接,不但可以避免容器的IP和端口暴露到外网导致的安全问题,还可以防止容器在重启时IP地址变换造成的访问失效,它的原理类似于DNS服务器的域名和地址的映射.当容器的IP地址发生变化时,docker将自动维护映射关系中的IP映射.可通过:cat /etc/hosts 查看
--name指容器名字
-v用于挂载一个volume,也可以用多个-v同时挂载多个volume,用于指定宿主机与容器共享文件夹,格式:[host_dir]:[container_dir]:[rw:ro]
-p将容器的端口暴露给宿主机的端口,格式host-port:container-port,通过端口暴露可以让外部主机通过宿主机
3.配置redis集群
查看redis版本,docker inspect redis-master,然后去找到对应的redis.conf配置文件
在宿主机操作
复制redis.conf到d:\docker-volume\redis\master,做如下操作
注释掉
bind 127.0.0.1
protected-mode yes
修改
daemonize no 改为 daemonize yes
复制redis.conf到d:\docker-volume\redis\slave1,做如下操作(slave2)同操作
注释掉
bind 127.0.0.1
protected-mode yes
修改
daemonize no 改为 daemonize yes
增加
slaveof master 6379
4.启动redis主从集群
按顺序启动master,slave1,slave2
# /usr/local/bin/redis-server /usr/src/redis/redis.conf
通过redis-cli连接测试集群是否成功
5.APP(Django)节点配置
# docker attach APP1 //进入APP1容器的命令窗口
# python --version //查看python版本
# pip install redis //安装redis包
创建APP
在宿主机 d:\docker-volume\django\app1下
编辑helloworld/views.py
from django.http import HttpResponse
import redis
def hello(request):
str1 = redis.__file__
str1 += "
"
r = redis.Redis(host='db', port=6379, db=0)
info = r.info()
str1 += "Set Hi
"
r.set('Hi', 'HelloWorld-APP1')
str1 += ("Get Hi: %s
" % r.get('Hi'))
str1 += "Redis Info:
"
str1 += "Key: Info Value"
for key in info:
str1 += ("%s: %s
" % (key, info[key]))
return HttpResponse(str1)
修改redisweb/setting.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'helloworld'
]
修改redisweb/urls.py
from django.conf.urls import url
from django.contrib import admin
from helloworld.views import hello
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^helloworld$', hello)
]
在容器里面完成项目的生成,进入dockerweb/redisweb目录执行
#python manage.py makemigrations //在该app下建立 migrations目录,并记录下你所有的关于modes.py的改动,比如0001_initial.py, 但是这个改动还没有作用到数据库文件
#python manage.py migrate //将该改动作用到数据库文件,比如产生table之类
#python manage.py runserver 0.0.0.0:8001 //启动web应用
6.配置HAProxy容器
在宿主机下d:\docker-volume\haproxy新建haproxy.cfg,注意空格和换行,否则启动会报错
global
log 127.0.0.1 local0
chroot /usr/local/sbin
pidfile /usr/local/sbin/haproxy.pid
maxconn 4096
daemon
nbproc 4
defaults
mode http
log 127.0.0.1 local3
option dontlognull
option redispatch
maxconn 3000
retries 2
balance roundrobin
timeout connect 5s
timeout client 50s
timeout server 50s
listen redis_proxy
bind 0.0.0.0:6301
stats enable
stats uri /haproxy-stats
server APP1 APP1:8001 check inter 2000 rise 2 fall 5
server APP2 APP2:8002 check inter 2000 rise 2 fall 5
在容器下运行:/usr/local/sbin/haproxy -f /tmp/haproxy.cfg启动
7.在宿主机访问搭建完的应用栈
localhost:6301/helloworld
locahost:6301/haproxy-stats
遗留问题:用宿主机ip:6301/helloworld不能访问,原因不明,暂时不找了.