docker web化管理

2015.12.31 in docker using tags 学习项目

背景

目前很多公司都在使用docker,docker也是一种趋势,我们公司也在使用docker,所以我也跟着学习使用docker,根据基本需求,结合api做了一个web程序

1 实验环境

本次试验使用两台实体机做模拟docker集群,一台虚拟机做docker镜像服务器,一台虚拟机做web管理机
系统软件环境及版本:
    selinux disabled
    iptables -F
    三台docker机器系统使用centos7.1,两台模拟机群docker机软件docker+pipework+openswitch+etcd+dhcp,docker镜像服务器跑了一个registry容器提供镜像服务
    Web管理机使用ubuntu,python+django+uwsgi

程序流程图

Alt text

2原理

通过web界面创建删除容器和镜像,web服务器通过api操作三台docker机器,创建容器时通过dhcp获取ip,pipework给容器附上获取的ip,并把容器信息写入etcd库中,由于容器重启后ip消失,我通过监控脚本给启动没有ip的容器重新附上ip。容器支持ssh,有好处也有风险。
网络这块我是用交换机提供的网段,容器使用的ip和实体机在同一valn,你也可以一个集群使用一个valn,这里我是用同一valn。容器ip可以从交换机dhcp获取,不懂交换机,我直接用一台docker实体机起了dhcp服务,为该段提供dhcp服务。

3安装

3.1 docker集群节点

两台机器软件一样,我就以AB区别,软件基本一样,A多了一个dhcp,没有使用交换机提供dhcp
3.1.1安装openswitch:
如果后期不想在docker集群中划分vlan,可以使用系统自带的brctl命令创建桥接网卡,下面创建桥接网卡的脚本相应的变一下,ovs-vsctl改为brctl
yum install gcc make python-devel openssl-devel kernel-devel graphviz kernel-debug-devel autoconf automake rpm-build redhat-rpm-config   libtool
wget http://openvswitch.org/releases/openvswitch-2.3.1.tar.gz

tar zxvf openvswitch-2.3.1.tar.gz
mkdir -p ~/rpmbuild/SOURCES
cp openvswitch-2.3.1.tar.gz ~/rpmbuild/SOURCES/
sed 's/openvswitch-kmod, //g' openvswitch-2.3.1/rhel/openvswitch.spec > openvswitch-2.3.1/rhel/openvswitch_no_kmod.spec

rpmbuild -bb --without check openvswitch-2.3.1/rhel/openvswitch_no_kmod.spec
#之后会在~/rpmbuild/RPMS/x86_64/里有2个文件
-rw-rw-r-- 1 ovswitch ovswitch 2013688 Jan 15 03:20 openvswitch-2.3.1-1.x86_64.rpm
-rw-rw-r-- 1 ovswitch ovswitch 7712168 Jan 15 03:20 openvswitch-debuginfo-2.3.1-1.x86_64.rpm

yum localinstall ~/rpmbuild/RPMS/x86_64/openvswitch-2.3.1-1.x86_64.rpm

systemctl enable openvswitch
systemctl start openvswitch
3.1.2下载pipework:
git clone https://github.com/jpetazzo/pipework.git
chmod +x pipework
cp pipework   /usr/bin/pipework
3.1.3 网卡配置

脚本下载地址

在节点机器上
pwd 
/root
check_modify_container.py create_docker_container_use_dhcp_ip.sh    openvswitch_docker.sh
#openvswitch_docker.sh 是网卡初始化脚本
#create_docker_container_use_dhcp_ip.sh 是创建容器时会调用的脚本
#check_modify_container.py  容器ip监控脚本
crontab -e
*/5 * * * * python /root/check_modify_container.py  #监控脚本每五分钟执行一次

em1 为管理网段ip
Ovs1桥接在em2上,为docker内网网段ip
配置网卡,这里使用桥接

cat openvswitch_docker.sh
#!/bin/bash
#删除docker测试机
#docker rm `docker stop $(docker ps -a -q)`
#删除已有的openvswitch交换机
ovs-vsctl list-br|xargs -I {} ovs-vsctl del-br {}
#创建交换机
ovs-vsctl add-br ovs1
#把物理网卡加入ovs1
ovs-vsctl add-port ovs1 em2
ip link set ovs1 up
ifconfig em2 0
ifconfig ovs1 192.168.157.21 netmask 255.255.255.0

chmod +x openvswitch_docker.sh
sh openvswitch_docker.sh

也可以写到配置文件中
我的em1为管理网卡10.0.0.21
A机器中安装dhcp,集群中一台机器配置dhcp就可以了,网段根据你的环境改变

yum install -y dhcp
vim /etc/dhcp/dhcpd.conf 
    log-facility local7;
    ddns-update-style none;

    subnet 192.168.157.0 netmask 255.255.255.0 {
          range 192.168.157.100 192.168.157.200;
          option domain-name-servers 202.106.0.20;
          option routers 192.168.157.1;
          option broadcast-address 192.168.157.255;
          default-lease-time 80000;
          max-lease-time 80000;
        }
    systemctl enable dhcpd
systemctl start dhcpd
3.1.4安装docker
yum install -y docker
vim /etc/sysconfig/docker
    OPTIONS='--selinux-enabled --insecure-registry 192.168.46.130:5000  -b=none -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock'
#指定镜像服务器为192.168.46.130,net使用none模式,监听2375端口,这个端口提供api访问的
systemctl start docker.service
systemctl enable docker.service
3.1.5Etcd安装
yum install libffi libffi-devel python-devel
yum -y install epel-release
yum -y install python-pip
yum install etcd -y
vim /etc/etcd/etcd.conf
ETCD_NAME=default
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://localhost:2379"
###这里etcd我没有做成集群,每台docker机的数据就保存在本机的etcd库中,不与其他节点同步,也不需要提供其他节点访问,这里设置监听本机
systemctl enable etcd
systemctl start etcd

3.2 docker镜像服务器

docker安装重复3.1.4安装docker
镜像服务器在安装配置完docker后,从官网pull下来一个registry镜像,启动创建一个镜像服务器容器
docker search registry
docker pull docker.io/registry 
docker run --restart always  -d -p 5000:5000 -v /opt/data/registry:/tmp/registry docker.io/registry

3.3 web服务器

Django web程序下载地址

Web服务器系统我用的ubuntu,主要是安装软件简单,源及软件更新比较快
>>> import django
>>> django.VERSION
(1, 7, 1, 'final', 0)这是我的django版本
apt-get install mysql-server mysql-client
apt-get install python-pip
pip install Django==1.7.1  #你也可以安装最新版本,不确定我写的程序能否正常运行  
apt-get install python-mysqldb 
pip install docker-py       #要调用docker api,所以要安装相关python包
apt-get install curl
apt-get install mysql-server
apt-get isntall mysql-client
sudo apt-get install libmysqlclient-dev 
apt-get install python-paramiko  #web程序中也会用到curl和paramiko
git clone https://github.com/SomethingCM/Web-for-docker.git 到本地
cd Web-for-docker/docker_demo
vim docker_demo/settings.py
#修改数据库配置
DATABASES = {
   'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'docker', #docker 库名
            'USER': 'root',   #mysql登陆用户
            'PASSWORD': 'dockerchen',#密码,如果mysql设置了用户名密码可以填写,没有则为空
            'HOST':'',
            'PORT':'',
        }
    }
#修改完以后创建表
./manage.py syncdb
#执行的时候会让你设置后台root用户密码,两次输入密码创建表成功
./manage.py runserver 0.0.0.0:80

初始化设置

在浏览器中输入 IP:port/admin 设置后台 IP为web服务器的ip
登陆后台admin初始化设置

Alt text

Alt text


添加仓库节点

Alt text


添加节点

Alt text

Alt text

Alt text


前台登陆

Alt text

Alt text

Alt text


编写dockerfile创建镜像

Alt text

Alt text


把现有容器打包成镜像

Alt text


创建容器

Alt text

关于怎么用django+uwsgi发布网站这里就不叙述了

目的只是为了减少开发对虚拟机的申请,容器必定是容器不如虚拟机好用