需求
- 因为每次在服务器上搭建lnmp环境都是一个很繁琐的事,所以打算采用docker
- 目前项目中基本都会用到supervisor,所以我打算单独将supervisor做成一个容器,但是我又想在这个容器中使用宿主机的docker。所以需要对dnmp进行一些改动。
前提
- 原项目地址:dnmp
- 建议想看原文文档
- 提前在宿主机安装git,docker,docker-compose
- 我需要的容器有,php,nginx,redis,supervisor。为什么没有mysql?因为我们mysql一般都是单独一台服务器跑
注意
- 下面不会说docker相关的命令,因为项目本身就是基于docker的,所以不熟悉的话最好先去看看文档或者直接按照原项目的文档跑着看
概述
- 因为我目前只需要supervisor容器中跑php命令,但是我又不想把php和supervisor装成一个容器,这个时候就可以换种方式,通过宿主机的docker进入php容器,然后在执行php命令。
改动
- 打开docker-compose.yml文件,找到supervisor,将注释去掉,增加挂载的文件,/var/run/docker.sock和/usr/bin/docker,将宿主机中的这两个文件挂载到容器中,注意权限问题,如果没有权限就直接改文件的权限,或者将当前用户加入到docker组
- 如果不需要开启web管理页面,那就不需要看这一步。里面有个command - /bin/sh
- -c
- |
supervisord -n -c /etc/supervisor/supervisord.conf ,是什么意思呢?就是手动启动supervisord监控服务,也就是启动了这个supervisor才有web页面可以查看。启动前还需要在supervisord.conf配置文件里面配置一下
[inet_http_server]
port=0.0.0.0:9001
username=admin
password=123456
supervisor:
build:
context: ./services/supervisor
container_name: supervisor
ports:
- "${SUPERVISOR_HOST_PORT_C}:9001"
privileged: true
volumes:
- ${SOURCE_DIR}:/www/:rw
- ${SUPERVISOR_LOG}:/var/log/supervisor/:rw
- ${SUPERVISOR_CONFIG}:/etc/supervisor/conf.d/:rw
- ${SUPERVISOR_CONF_FILE}:/etc/supervisor/supervisord.conf:ro
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
command:
- /bin/sh
- -c
- |
supervisord -n -c /etc/supervisor/supervisord.conf
restart: always
cap_add:
- SYS_PTRACE
networks:
- default
直接报错:docker not found
dnmp容器镜像都是基于Alpine 版本的,所以刚刚挂载进去的文件是不会生效的。
dnmp容器镜像都是基于Alpine 版本的,所以刚刚挂载进去的文件是不会生效的。
dnmp容器镜像都是基于Alpine 版本的,所以刚刚挂载进去的文件是不会生效的。
3.解决办法:修改services/supervisor/Dockfile文件
FROM ubuntu
MAINTAINER phonecom<1053653379@qq.com>
RUN apt update
RUN apt install -y supervisor
USER root
WORKDIR /www
4.在重新创建容器,就可以直接容器中执行docker 相关命令了
5.现在我们可以在supervisor配置文件中使用PHP的命令了,配置文件挂载到宿主机的dnmp/services/conf.d目录下了
6.重启supervisor容器,直接访问IP:9001,默认账号user,密码123,这个可以到配置文件中去改,看看是不是进程运行成功了
7.创建定时任务:利用docker,直接在宿主机创建就行,
8:开启swoole服务,代码是我这边写好的,是基于laravel的,我swoole监听的9502的端口,所以要先更改docker-compose.yml的php容器,将9502端口暴露给宿主机
9:直接在supervisor中创建swoole守护进程 配置文件就OK了。