supervisor工具实现自动化docker服务运行
Supervisor工具实现自动化docker服务运行
一、使用 Supervisor 来管理进程
Docker 容器在启动的时候开启单个进程,比如,一个 ssh 或者 apache 的 daemon 服务。但我们经常需要在一个机器上开启多个服务,这可以有很多方法,最简单的就是把多个启动命令放到一个启动脚本里面,启动的时候直接启动这个脚本。
例如:docker run –d 镜像 /run.sh
另外就是安装进程管理工具。
本节将使用进程管理工具 supervisor 来管理容器中的多个进程。使用 Supervisor 可以更好的控制、管理、重启我们希望运行的进程。
Supervisor是一个进程控制系统. 它是一个C/S系统(注意: 其提供WEB接口给用户查询和控制), 它允许用户去监控和控制在类UNIX系统的进程。
在这里我们演示一下如何同时使用 ssh 和 apache 服务。
配置
首先创建一个 Dockerfile,内容和各部分的解释如下。
创建一个dockerfile的目录
dockerfile文件内容
supervisor 配置文件内容
第一段 supervsord 配置软件本身,使用 nodaemon 参数来运行。nodaemon=true 如果是true,supervisord进程将在前台运行,默认为false,也就是后台以守护进程运行。
下面2段包含我们要控制的 2 个服务。每一段包含一个服务的目录和启动这个服务的命令
/docker/apache目录内容列表
使用方法
创建 p_w_picpath
# docker build -t centos:supervisord .
查看镜像
启动我们的 supervisor 容器
测试:访问容器提供的web和ssh服务
二、Docker Compose 项目
compose项目简介
compose项目来源于之前的Fig项目,使用python代码编写。compose项目主要用于编排部署基于docker的应用。本身与docker/swarm配合度很高。
Docker Compose 是 Docker 编排服务的一部分,可以让用户在其它平台快速安装Docker,Swarm 可以让 Docker 容器在集群中高效运转,而 Compose 可以让用户在集群中部署分布式应用。简单的说,Docker Compose 属于一个“应用层”的服务,用户可以定义哪个容器组运行哪个应用,它支持动态改变应用,并在需要时扩展。
相对于kubernetes来说功能比较简单,相当于kubernetes的一个子集。
dockerfile可以让用户管理一个单独的应用容器,而Compose则允许用户在一个模板(yaml格式)中定义一组相关联的应用容器(被称为一个Project,即项目),例如一个调度器,两个web服务容器再加上后端的数据库服务容器等。
安装Compose之前,要先安装docker,这里就不说了,
安装Docker-compose
先安装pip
注:pip类似RedHat里面的yum,安装Python包非常方便
#wget https://bootstrap.pypa.io/get-pip.py
#python get-pip.py
再安装compose
安装成功后,可以查看 docker-compose 的版本和 命令的用法。
#docker-compose -v
#docker-compose -h
首先介绍几个术语。
服务(service):一个应用容器,实际上可以运行多个相同镜像的实例。
项目(project):由一组关联的应用容器组成的一个完整业务单元。
可见,一个项目可以由多个服务(容器)关联而成,Compose 面向项目进行管理。
docker-compose 命令说明
大多数Compose命令都是运行于一个或多个服务的,如果服务没有指定,该命令将会应用到所有服务,如果要获得所有可用信息,使用命令:docker-compose [COMMAND] --help,下面是命令(COMMAND)的说明:
build
创建或者再建服务
服务被创建后会标记为project_service(比如composetest_db),如果改变了一个服务的Dockerfile或者构建目录的内容,可以使用docker-compose build来重建它
help
显示命令的帮助和使用信息
kill
通过发送SIGKILL的信号强制停止运行的容器,这个信号可以选择性的通过,比如:
docker-compose kill -s SIGKINT
logs
显示服务的日志输出
port
为端口绑定输出公共信息
ps
显示容器
pull
拉取服务镜像
rm
删除停止的容器
run
在服务上运行一个一次性命令,比如:
docker-compose run web Python manage.py shell
scale
设置为一个服务启动的容器数量,数量是以这样的参数形式指定的:service=num,比如:
docker-compose scale web=2 worker=3
start
启动已经存在的容器作为一个服务
stop
停止运行的容器而不删除它们,它们可以使用命令docker-compose start重新启动起来
up
为一个服务构建、创建、启动、附加到容器
连接的服务会被启动,除非它们已经在运行了
运行docker-compose up -d会在后台启动容器并使它们运行
–verbose
显示更多输出
–version
显示版本号并退出
-f,–file FILE
指定一个可选的Compose yaml文件(默认:docker-compose.yml)
-p,–project-name NAME
指定可选的项目名称(默认:当前目录名称)
docker-compose.yml命令说明
每一个定义在docker-compose.yml中的服务必须明确指定一个p_w_picpath或者build选项,这与docker run命令行中输入的是对应相同的,对于docker run,在Dockerfile文件中指定的选项(比如CMD、EXPOSE、VOLUME、ENV)是默认的,因此不必在docker-compose.yml中再指定一次
p_w_picpath
标明p_w_picpath的ID,这个p_w_picpath ID可以是本地也可以是远程的,如果本地不存在,Compose会尝试去pull下来
p_w_picpath: ubuntu
p_w_picpath: orchardup/postgresql
p_w_picpath: a4bc65fd
build
该参数指定Dockerfile文件的路径,该目录也是发送到守护进程的构建环境(这句有点),Compose将会以一个已存在的名称进行构建并标记,并随后使用这个p_w_picpath
build: /path/to/build/dir
command
重写默认的命令,覆盖容器启动后默认执行的命令
command: 要执行的命令
links
连接到其他服务中的容器,可以指定服务名称和这个链接的别名,或者只指定服务名称
links:
- db
- db:database
- redis
此时,在容器内部,会在/etc/hosts文件中用别名创建一个条目,就像这样:
172.17.2.186 db
172.17.2.186 database
172.17.2.186 redis
环境变量也会被创建,关于环境变量的参数,会在后面讲到
external_links
连接到在这个docker-compose.yml文件或者Compose外部启动的容器,特别是对于提供共享和公共服务的容器。在指定容器名称和别名时,external_links遵循着和links相同的语义用法
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
ports
暴露端口,指定两者的端口(主机:容器),或者只是容器的端口(主机会被随机分配一个端口)
注:当以 主机:容器 的形式来映射端口时,如果使容器的端口小于60,那可能会出现错误,因为YAML会将 xx:yy这样格式的数据解析为六十进制的数据,基于这个原因,时刻记得要将端口映射明确指定为字符串
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
expose
暴露端口而不必向主机发布它们,而只是会向链接的服务(linked service)提供,只有内部端口可以被指定
expose:
- "3000"
- "8000"
volumes
挂载路径最为卷,可以选择性的指定一个主机上的路径(主机:容器),或是一种可使用的模式(主机:容器:ro)
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
volumes_from:
从另一个服务或容器挂载它的所有卷。
volumes_from:
- service_name
- container_name
environment
加入环境变量,可以使用数组或者字典,只有一个key的环境变量可以在运行Compose的机器上找到对应的值,这有助于加密的或者特殊主机的值
environment:
RACK_ENV: development
SESSION_SECRET:
environments:
- RACK_ENV=development
- SESSION_SECRET
env_file
从一个文件中加入环境变量
如果通过 docker-compose -f FILE 指定了模板文件,则 env_file 中路径会基于模板文件路径。如果有变量名称与 environment 指令冲突,则以后者为准。
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
环境变量文件中每一行必须符合格式,支持 # 开头的注释行。
# common.env: Set Rails/Rack environment
RACK_ENV=development
net
网络模式,可以在docker客户端的--net参数中指定这些值
net: "bridge"
net: "none"
net: "container:[name or id]"
net: "host"
dns
自定义DNS服务,可以是一个单独的值或者一张列表
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
dns_search
自定义DNS搜索范围,可以是单独的值或者一张列表
dns_search: example.com
dns_search:
- dc1.example.com
- dc2.example.com
使用Compose只需要简单的三个步骤:
首先,使用Dockerfile或docker commit来定义你的应用环境
第二步,用一个docker-compose.yml来定义你的应用,他们可以在下个互隔离的容器中组成你的应用。
第三步,执行docker-compose up -d来启动你的应用,它会根据docker-compose.yml的设置来pull/run相关的容器。
测试案例
下面,我们创建一个经典的 Web 项目:一个 Haproxy,挂载三个 Web 容器。
docker-haproxy目录,作为项目工作目录,并在其中分别创建两个子目录: haproxy 和web。
#mkdir -p /root/docker-haproxy/{haproxy,web}
在/root/docker-haproxy/目录下创建docker-compose.yml文件
在/root/docker-haproxy/haproxy目录下创建haproxy的主配置文件haproxy.cfg
在/root/docker-haproxy/web目录下存放web站点网页文件
目录结构如下图所示:
Web 子目录:
生成一个index.html文件,其内容:
haproxy 目录:
在其中生成一个 haproxy.cfg 文件
docker-compose.yml
编写 docker-compose.yml 文件,这个是 Compose 使用的主模板文件。内容十分简单,指定 3 个 web 容器,以及 1 个 haproxy 容器。
运行 compose 项目:
在docker-haproxy目录下执行docker-compose up -d来启动你的应用
#cd docker-haproxy
查看容器启动情况
或
打开浏览器本机本机IP:http://192.168.1.105
打开浏览器本机本机IP:http://192.168.1.105:70

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Nginx跨域访问问题总结
一、什么是跨域 简单地理解就是因为JavaScript同源策略的限制,a.com 域名下的js无法操作b.com或是c.a.com域名下的对象。 同源是指相同的协议、域名、端口。特别注意两点: 如果是协议和端口造成的跨域问题“前台”是无能为力的, 在跨域问题上,域仅仅是通过“协议+域名+端口”来识别,两个不同的域名即便指向同一个ip地址,也是跨域的。 二、常见跨域情况 URL说明是否允许通信 http://www.a.com/a.js http://www.a.com/b.js同一域名下允许 http://www.a.com/lab/a.js http://www.a.com/script/b.js同一域名下不同文件夹允许 http://www.a.com:8000/a.js http://www.a.com/b.js同一域名,不同端口不允许 http://www.a.com/a.js https://www.a.com/b.js同一域名,不同协议不允许 http://www.a.com/a.js 域名和域名对应ip不允许 http://www.a.com/a.js http://sc...
- 下一篇
STP导致链路中断问题
使用STP协议,为的是解决环路问题,然而在特殊情况下,反而会导致链路被阻断,业务中断。 某日,一用户反应,两台核心之间出现异常现象,直连时不通,但是通过一台交换机中转就通了。 上图中,二层交换机本来是作为核心A的下级交换机,接了大量服务器,网关都在核心A上,核心A与核心B之间为三层连接,互指路由通讯。改造前的结构明显不合理,客户决定将核心直接互联,但是互联后,直连接口无法PING通。线缆,接口配置都已检查过均没有问题。 到达现场,首先依旧从线缆及接口配置检查开始,将笔记本配置为核心A地址与核心B互联,通;反之也通。排除线缆及接口配置问题。 第二步,在核心A上检查ARP表,空白,没有对端的ARP表项。 第三步,接口下无任何针对对端MAC的限制策略,没有IP+MAC绑定 第四步,检查STP状态,发现STP将核心A与核心B的互联口阻断。 直接原因找到,但是从眼前的拓扑结构来说,不应该阻断接口,换一种情况,如果核心A与核心B之间确实还有一条没有找到的线路,那么线路中间串一个二层交换机,为什么就不会阻断接口了,而且业务是正常的,没有出现被环路影响的情况。...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Mario游戏-低调大师作品
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- 2048小游戏-低调大师作品
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Linux系统CentOS6、CentOS7手动修改IP地址
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16