Docker部署实践:记录一个语音产品的docker化

 

目录

 

名词解释

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 语言产品的应用程序

1 综述

该文描述了使用docker容器部署vpbx的全部流程,包括docker环境安装、docker本地仓库搭建、vpbx-docker镜像制作、vpbx-docker网络配置、vpbx-docker服务启动等。

本文包含了使用docker部署vpbx时所要用到的大部分命令,也包含了部署时需要用到的脚本等。

 

1.1 容器优点

标准化应用发布,docker容器包含了运行环境和可执行程序,可以跨平台和主机使用;节约时间,快速部署和启动,VM启动一般是分钟级,docker容器启动是秒级;

1、交付物标准化

Docker是软件工程领域的“标准化”交付组件,最恰到好处的类比是“集装箱”。传统的软件交付物包括:应用程序、依赖软件安装包、配置说明文档、安装文档、上线文档等非标准化组件。Docker的标准化交付物称为“镜像”,它包含了应用程序及其所依赖的运行环境,大大简化了应用交付的模式。

2、一次构建,多次交付

类似于集装箱的“一次装箱,多次运输”,Docker镜像可以做到“一次构建,多次交付”。当涉及到应用程序多副本部署或者应用程序迁移时,更能体现Docker的价值。

1.2 实践结果

本次部署,我一共在三个不同的环境上进行验证:1,物理机上直接安装docker环境,部署docker容器;2,在VMware上装虚拟机,安装docker环境,部署docker容器;3,在tis上拉虚拟机,安装docker环境,部署docker容器。

除了在VMware上部署docker时macvlan不通之外,另外两种运行环境上都能正常使用docker部署vpbx。

1.3 遗留问题

1.未对docker容器使用的物理资源进行限制/配置。

2. VMware上部署docker时macvlan不通。

3.纯自动化的安装过程未完成。

 

2 安装docker环境

2.1环境检查

要求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宿主机的内核。

2.1 安装docker

有两种方式可安装Docker Engine。脚本安装和yum安装。

2.1.1 脚本安装

需要联网。

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

2.1.2yum安装

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

2.2 开机自启动

配置Docker开机自启动:

#  systemctl enable docker.service

3 搭建本地仓库

3.1 搭建本地仓库原因

1.项目需要,不希望将项目放到 docker hub 上

2.环境需求,考虑网络、效率的问题,希望在私有服务器上建立自用的仓库,提高便利性和访问速度

3.可以做更多的个性化配置

3.2 搭建本地仓库

需要联网。

搭建及使用本地仓库:

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 进去的镜像文件。

 

4 制作镜像

镜像创建的方式有多种:1,docker commit;2,DockerFile;3,docker import。根据需求,我们使用docker import创建基础镜像,使用DockerFile创建网元镜像。

最终制作的镜像如下:(制作过程,后面章节会具体介绍)

4.1 制作基础镜像

基础镜像由xxx平台提供的xxx.iso制作。

制作步骤:

1.安装Allinone.iso到任意机器。

2.使用cd / 进入根目录

3. 使用tar -cvpf /tmp/system.tar * --exclude=proc --exclude=sys --exclude=dev -- exclude=boot 将根目录打包,打包结果如下

Docker部署实践:记录一个语音产品的docker化_第1张图片

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 ,… 等等

4.2 使用DockerFile

镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。

  Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

创建网元镜像我认为应该DockerFile镜像主要分三部分:

1,新建镜像从哪儿来;

2,安装新镜像需要的软件包;

3,新镜像配置文件

4.2.1 制作xxx(业务镜像)

制作步骤:

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部署实践:记录一个语音产品的docker化_第2张图片

5 配置容器网络

Docker原生网络有几种:host、none、bridge(原)、bridge(自)、macvlan、overlay。

我们使用bridge和macvlan两种网络模式混合搭建vpbx-docker互通网络,其中bridge用于内部通信,macvlan用于外部通信。

基本组网如下:

Docker部署实践:记录一个语音产品的docker化_第3张图片

5.1 创建网络

我们规划使用两种网络模式:bridge和macvlan。

  • Bridge

Bridge创建的网络用于内部通信,根据我们vpbx系统网络的设计,该网络将作为eth1,用于内部通信;

docker network create --driver bridge --subnet 101.101.101.0/24 --gateway 101.101.101.1 vpbx-eth1

  • Macvlan

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部署实践:记录一个语音产品的docker化_第4张图片

5.2 配置网络

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部署实践:记录一个语音产品的docker化_第5张图片

6 启动docker容器

创建和启动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部署实践:记录一个语音产品的docker化_第6张图片

  • 启动容器

使用命令docker start vpbx-bsu启动容器

使用命令docker ps 查看容器是否启动,如果有红框里的内容,则认为是启动成功

  • 查看容器运行情况

使用命令docker exec -it vpbx-bsu ps -e 查看容器内服务运行情况

Docker部署实践:记录一个语音产品的docker化_第7张图片

使用命令docker exec -it vpbx-bsu ifconfig 查看容器ip配置情况

Docker部署实践:记录一个语音产品的docker化_第8张图片

7 可视化工具portainer

8 总结

使用docker部署运行vpbx,总结如下图:

Docker部署实践:记录一个语音产品的docker化_第9张图片

如图所示自上而下为整个使用docker部署vpbx的流程逻辑

  • 第一层构建base image 对象
  • 第二层以base image 和Dockerfile为依据构建buss image(业务镜像)对象
  • 第三层为容器间、容器与外部环境通信而创建网络对象network
  • 第四层以buss image和network对象为依赖创建容器对象 container,container是提供服务的主体
  • 第五层这些container对象运行起来后将作为一个整体对外提供vpbx服务

 

 

 

 

 

 

你可能感兴趣的:(云,虚拟技术)