什么是Docker

Published on

Docker类似于虚拟机,但相比虚拟机,它启动更快(直接进程启动),占用资源少(只占所需资源),体积小(只需要用到的组件即可),可以说是轻量级虚拟机。

Docker将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器,程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样,Docker是Linux容器的一种封装。

用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

为什么使用Docker

作为IT开发人员,软件开发最大的麻烦事之一,就是环境配置。比如FreeSWITCH,不同的操作系统需要安装不同的库和依赖。相同的操作系统,不同的版本所需依赖也不同。随着FreeSWITCH不断更新优化,有些模块在不同环境下对依赖要求也不相同。通常即使解决了这个版本的使用,其他版本也会有其他问题。

在开发过程中,同事经常会问为什么相同的代码你能跑起来,而我的环境跑不起来。作为小白,为了搭建开发环境,我们常浪费一天甚至几天时间去查找失败原因(大佬们除外)。为了更快的保持统一,我们使用Docker,下载统一的开发环境,节省了搭建环境时间,保证每一步都同步没有问题。不再出现,换个电脑就要重新搭建环境的问题了。

FreeSWITCH支持各种操作系统下安装配置使用,但相对来说,在Debain下更加稳定,适应性更强,兼容性更好。但,对于很多客户,已经在使用CentOS或其他操作系统,且,技术人员相对于Debain,更熟悉原系统操作指令。如果直接换成Debain,学习成本太大。所以,为了解决这些问题,我们使用Docker部署,这样,即使是CentOS,我们依然可以安装Debain下的FreeSWITCH。

如何使用Docker

Docker安装

访问Docker官方网站,根据需求下载或参照文档进行相应操作,特别注意,大多数版本在CentOS下仅支持7以上版本。

创建镜像

直接从Docker Hub获取已有镜像比如,Nginx、PostgreSQl等,如下所示:

docker pull postgres:11.5

或者利用Dockerfile来创建镜像,我们目前开发的系统XUI即采用了此方法创建镜像,方便大家使用。

Dockerfile基本的语法,使用#来注释,FROM指令告诉Docker使用哪个镜像作为基础,RUN开头的指令会在创建中运行,比如安装一个软件包,在这里使用 apt-get来安装一些依赖。

FROM debian:busterRUN apt-get update && apt-get install -y ca-certificates curl locales bison...

编写完成Dockerfile后可以使用docker build来生成镜像。使用如下指令上传镜像保存。

docker push xxxxx.com/xx/xui:release-v1.1#查看镜像docker images#删除镜像docker rmi imageid

导出镜像

如果你已成功下载某镜像,并在客户私有环境下进行安装使用,我们可将镜像进行打包导出,然后传到客户环境上即可,命令如下:

docker save xxxxx.com/xx/xui:release-v1.1 -o xui-image.tar#当然,如果想减小包的大小,可使用gzip压缩下,体积会缩小一倍gzip xui-image.tar

执行如上操作打包并压缩后将得到xui-image.tar.gz文件。

导入镜像

将xui-image.tar.gz上传到指定服务器,并导入:

gzip -d xui-image.tar.gzdocker load -i xui-image.tar

导入后使用命令验证:

docker images

启动镜像

首先要保证先启动docker,如下所示:

systemctl start docker# 设置docker开机启动systemctl enable docker

准备.env(如果你需要设置一些变量,如果无需变量,可省去此文件),准备docker-compose.yml启动文件,如果为了后续方便,可准备Makefile文件。

其中docker-compose.yml文件为重中之重。参考如下:

version: "3.3"services: xui: container_name: "xui-xb" image: xxxx/xxx/xui:v1.1 stdin_open: true cap_add: - SYS_PTRACE tty: true 
restart: always env_file: ./.env network_mode: host logging: driver: none volumes: - /data/xx:/usr/local/data xswitch-pg: 
container_name: xui-pg image: postgres:11.5 network_mode: host restart: always environment: - PGDATA=/var/lib/postgresql/data/pgdata - TZ=PRC volumes: - ../pgsql:/var/lib/postgresql/data:cached

使用host模式可以不用进行端口映射(MAC除外,如果你使用MAC,请使用port进行端口映射)。完成yml文件后,即可启动容器了,如下:

//启动docker-compose -f docker-compose.yml up -d//关掉docker-compose -f docker-compose.yml down

查看容器是否启动成功,如下:

docker ps -a

拷贝文件

如果你想从宿主机传文件到容器,或从容器拷贝到宿主机,可使用如下指令:

docker cp /tmp/xx 96f7f14e99ab:/www/docker cp 96f7f14e99ab:/www /tmp/

结尾

使用Docker部署实现更轻量级的虚拟化,对环境要求宽松,方便快速部署,极大减少部署的时间成本和人力成本,目前我们已上线的XSWITCH即采用Docker部署,随时轻松升级。