目录
名词解释
1 综述
1.1 容器优点
1.2 实践结果
1.3 遗留问题
2 安装docker环境
2.1环境检查
2.1 安装docker
2.1.1 脚本安装
2.1.2yum安装
2.2 开机自启动
3 搭建本地仓库
3.1 搭建本地仓库原因
3.2 搭建本地仓库
4 制作镜像
4.1 制作基础镜像
4.2 使用DockerFile
4.2.1 制作xxx(业务镜像)
5 配置容器网络
5.1 创建网络
5.2 配置网络
6 启动docker容器
7 可视化工具portainer
8 总结
vpbx 一个语音产品
vpbx-xxx 语言产品的应用程序
该文描述了使用docker容器部署vpbx的全部流程,包括docker环境安装、docker本地仓库搭建、vpbx-docker镜像制作、vpbx-docker网络配置、vpbx-docker服务启动等。
本文包含了使用docker部署vpbx时所要用到的大部分命令,也包含了部署时需要用到的脚本等。
标准化应用发布,docker容器包含了运行环境和可执行程序,可以跨平台和主机使用;节约时间,快速部署和启动,VM启动一般是分钟级,docker容器启动是秒级;
1、交付物标准化
Docker是软件工程领域的“标准化”交付组件,最恰到好处的类比是“集装箱”。传统的软件交付物包括:应用程序、依赖软件安装包、配置说明文档、安装文档、上线文档等非标准化组件。Docker的标准化交付物称为“镜像”,它包含了应用程序及其所依赖的运行环境,大大简化了应用交付的模式。
2、一次构建,多次交付
类似于集装箱的“一次装箱,多次运输”,Docker镜像可以做到“一次构建,多次交付”。当涉及到应用程序多副本部署或者应用程序迁移时,更能体现Docker的价值。
本次部署,我一共在三个不同的环境上进行验证:1,物理机上直接安装docker环境,部署docker容器;2,在VMware上装虚拟机,安装docker环境,部署docker容器;3,在tis上拉虚拟机,安装docker环境,部署docker容器。
除了在VMware上部署docker时macvlan不通之外,另外两种运行环境上都能正常使用docker部署vpbx。
1.未对docker容器使用的物理资源进行限制/配置。
2. VMware上部署docker时macvlan不通。
3.纯自动化的安装过程未完成。
要求linux内核版本必须大于3.10,建议内核版本使用3.10.0-327.e17.x86_64
linux内核有overlayfs模块。查看overlay模块是否在内核中加载lsmod |grep overlay
如果没有加载则使用modprobe overlay 命令加载
如果加载出错如下
则需要查看内核是否支持overlayfs模块,使用cat modules.dep |grep overlay
如果查不到,则认为该内核不适用作为docker宿主机的内核。
有两种方式可安装Docker Engine。脚本安装和yum安装。
需要联网。
1.使用root权限登陆系统。
2.更新系统包到最新。(可选,一般不用)
# yum -y update
3.执行Docker安装脚本
# curl -sSL https://get.docker.com/ | sh
# yum install -y docker-selinux
这个脚本会添加docker.repo 配置并安装Docker。
4.启动Docker
# systemctl start docker.service
5.验证docker已经正常安装
# docker run hello-world
1.使用root权限登陆系统。
2.更新系统包到最新。(可选,一般不用)
# yum -y update
3.添加yum仓库
# cat >/etc/yum.repos.d/docker.repo <<-EOF [dockerrepo] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/7 enabled=1 gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg EOF
4.安装Docker包
# yum install -y docker-engine
yum install -y docker-selinux
5.启动Docker
# systemctl start docker.service
6.验证docker已经正常安装
# docker run hello-world
配置Docker开机自启动:
# systemctl enable docker.service
1.项目需要,不希望将项目放到 docker hub 上
2.环境需求,考虑网络、效率的问题,希望在私有服务器上建立自用的仓库,提高便利性和访问速度
3.可以做更多的个性化配置
需要联网。
搭建及使用本地仓库:
1.先拉取官方 registry 镜像,并启动 registry 容器:
docker pull registry
docker run -d --name=my- registry --restart=always -p 5000:5000 -v data/registry:/tmp/registry registry
#启动一个名字为 my- registry 的容器,端口映射到宿主机的5000,挂载宿主机目录 /opt/data/registry 到容器的 /tmp/registry ,用于存储 push 进去的镜像文件。
镜像创建的方式有多种:1,docker commit;2,DockerFile;3,docker import。根据需求,我们使用docker import创建基础镜像,使用DockerFile创建网元镜像。
最终制作的镜像如下:(制作过程,后面章节会具体介绍)
基础镜像由xxx平台提供的xxx.iso制作。
制作步骤:
1.安装Allinone.iso到任意机器。
2.使用cd / 进入根目录
3. 使用tar -cvpf /tmp/system.tar * --exclude=proc --exclude=sys --exclude=dev -- exclude=boot 将根目录打包,打包结果如下
4. 拷贝system.tar到docker宿主机,然后在宿主机中使用命令cat images/system.tar |docker import – vpbx-base:v0创建镜像。
使用这一系列操作,我们就可以得到vpbx-docker的基础镜像,命名为vpbx-base:v0以后所有的网元镜像都会依据该基础镜像vpbx-base:v0进行制作。
如果Allinone.iso要修改,可以按照上述过程重新做基础镜像;也可以直接在vpbx-base:v0的基础上使用DockerFile的方式进行直接修改,生成新的基础镜像版本如:vpbx-base:v1,vpbx-base:v2 ,… 等等
镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
创建网元镜像我认为应该DockerFile镜像主要分三部分:
1,新建镜像从哪儿来;
2,安装新镜像需要的软件包;
3,新镜像配置文件
制作步骤:
1.mkdir xxx
2.将需要的软件包、文件等copy到bus文件夹
3.Dockerfile内容
FROM vpbx-base:v0
MAINTAINER zhouhuan
COPY bsu-0.1-1.el7.centos.x86_64.rpm /home
COPY cfg.sh /usr/bin
WORKDIR /home
RUN rpm -ivh bsu-0.1-1.el7.centos.x86_64.rpm --nodeps
####CMD ["sh","cfg.sh"]
ENTRYPOINT echo -e $PARAMS > /root/params && sh cfg.sh
4.cfg.sh
cfg.sh的作用:1,对系统的配置;2,负责自启动实现。
每个网元镜像的配置文件不同。
修改配置文件,只是初步的功能性配置,缺少很多异常分支,如容器重启判断等,需要后续完善。
这个涉及到公司产品信息,略。
5.使用docker build –t vpbx-bsu:v0构建bsu镜像,该镜像可以作为bsu的基础镜像,后续可以在该基础镜像上进行新的bsu镜像的创建
Docker原生网络有几种:host、none、bridge(原)、bridge(自)、macvlan、overlay。
我们使用bridge和macvlan两种网络模式混合搭建vpbx-docker互通网络,其中bridge用于内部通信,macvlan用于外部通信。
基本组网如下:
我们规划使用两种网络模式:bridge和macvlan。
Bridge创建的网络用于内部通信,根据我们vpbx系统网络的设计,该网络将作为eth1,用于内部通信;
docker network create --driver bridge --subnet 101.101.101.0/24 --gateway 101.101.101.1 vpbx-eth1 |
macvlan创建的网络用于外部通信,根据我们vpbx系统网络的设计,该网络将作为eth0,用于管理通道通信;作为eth2,eth3,用于业务通道通信。
docker network create --driver macvlan --subnet 172.101.201.0/24 --gateway 172.101.201.1 -o parent=eth0 vpbx-eth0 docker network create --driver macvlan --subnet 172.101.203.0/24 --gateway 172.101.203.1 -o parent=eth2 vpbx-eth2 docker network create --driver macvlan --subnet 192.168.200.0/24 --gateway 192.168.200.1 -o parent=eth3 vpbx-eth3 |
Docker网络创建完成后,可查看
Docker网络创建完成后,就可以根据需求将网络添加到相应的container上。添加的方式有两种:一,docker 容器运行后,将网络添加到该容器;二,创建docker容器,添加网络,最后再启动容器。
两种给容器添加网络的区别是:第一种,容器运行时,容器中只有default网络或者没有网络,之后才给该容器添加需要的网络;第二种,容器运行时,就会将已经有了添加的需要的网络。
根据vpbx的设计,我们服务在启动时就需要指定网络,所以我们只能选择第二种方式给容器添加网络。
以容器vpbx-dmu添加网络为例:
前提:容器vpbx-dmu只是被create,而未运行。(详细参见docker create)
容器名为vpbx-dmu。
docker network connect vpbx-eth0 vpbx-dmu --ip 172.101.201.231 docker network connect vpbx-eth1 vpbx-dmu --ip 101.101.101.2 docker network connect vpbx-eth2 vpbx-dmu --ip 172.101.203.231 docker network connect vpbx-eth3 vpbx-dmu --ip 192.168.200.231 |
使用如下命令查询:找到Networks模块
docker inspect vpbx-dmu |
创建和启动docker 容器的方式有多种。根据vpbx当前的实现,我们选择采用如下顺序完成docker容器的启动:
1,创建容器(docker create xxxx);
2,配置容器网络(docker connect xxxx);
3,启动容器(docker start xxxx)。
以vpbx-bsu为例:
使用命令docker create -it --privileged --name vpbx-bsu --network vpbx-eth1 --ip 101.101.101.2 -e PARAMS="rmu=101.101.101.101\nlocal=101.101.101.102\nid=11" vpbx-bsu:v0
-it :
--privileged:赋予某些特殊权限
--network:添加网络
--ip:添加ip
-e 表示附带参数,参数名定义为PARAMS,内容为
rmu=xx.xx.xx.xx
local=xx.xx.xx.xx
id=xx
中间以“\n”隔开,其中id选项只在spu和bsu启动时使用
使用命令docker network connect vpbx-eth0 vpbx-bsu --ip 172.101.201.233 添加其余三个网络。
使用命令docker inspect vpbx-bsu 查看已经添加到容器的网络
使用命令docker start vpbx-bsu启动容器
使用命令docker ps 查看容器是否启动,如果有红框里的内容,则认为是启动成功
使用命令docker exec -it vpbx-bsu ps -e 查看容器内服务运行情况
使用命令docker exec -it vpbx-bsu ifconfig 查看容器ip配置情况
使用docker部署运行vpbx,总结如下图:
如图所示自上而下为整个使用docker部署vpbx的流程逻辑