我将php和nginx一起封在了一个docker里,如何让nginx和php自启动?

我每次新建一个容器时,都要进入容器里面,启动nginx和php,请问如何每次新建容器时都让nginx和php自启动?

阅读 6.7k
3 个回答

你可以使用supervisord来管理

  1. 先进入容器安装supervisord,(安装过程网上搜下)

推荐将主配置文件放在:/etc/supervisord.conf vim /etc/supervisord.conf

[unix_http_server]
file=/var/run/supervisor.sock

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisord]
nodaemon=true

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock

[include]
files = /etc/supervisor/conf.d/*.conf

然后在/etc/supervisor/conf.d/添加php和nginx的启动命令

例如添加nginx, vim /etc/supervisor/conf.d/nginx_super.conf

[program:nginx]
command=nginx
  1. 然后提交一个新的镜像出来,例如

docker commit -a "qclaogui" -m "bulabula" nginx-php:commit

  1. 编写新的Dokcerfile

FROM nginx-php:commit

MAINTAINER xxx@xxx.com

EXPOSE 80 443

ENTRYPOINT ["/usr/bin/supervisord","-c","/etc/supervisord.conf"]
  1. 重新构建一个镜像

docker build -t nginx-php:v1 .

  1. 基于新构建的镜像运行容器

docker run --name test-nginx-php -p 8081:80 -d nginx-php:v1注意这里用的是-d参数

根据你的情况,大致解决思路是这个样子,可以参考一下

你需要在 Dokcerfile 里写上 CMD ["nginx", "-g", "daemon off;"]

个人建议楼主使用docker-compose来管理,按照最佳实践来做。我上代码吧:

version: '2'
services:
    nginx:
        image: "xxxxx.com/nginx:latest"
        build:
            context: .
            dockerfile: Dockerfile-nginx
        volumes:
            - ./WebSite:/xxxxxxx/WebSite
            - ./config/nginx/xxxxx.conf:/etc/nginx/conf.d/xxxxx.conf
        depends_on:
            - php
            - redis
        links:
            - php:php
        ports:
            - "192.168.0.1:80:80"
    php:
        image: "xxxxx.com/php:5.6"
        build:
            context: .
            dockerfile: Dockerfile-php
        volumes:
            - ./WebSite:/xxxxx/WebSite/
            - ./config/php.ini:/usr/local/etc/php/php.ini
        links:
          - redis:redis_cache
        extra_hosts:
          - mysql_host:192.168.0.2
        entrypoint: sh /xxxxx/WebSite/docker/php-entrypoint.sh
    redis:
        image: "xxxxxxx.com/redis:latest"
        build:
            context: .
            dockerfile: Dockerfile-redis
        volumes:
          - ./redis:/data
        command: [ "redis-server" ]

以上是一个docker-compose文件的例子,我们通过挂载的方式把项目放进容器,默认脚本会识别看有没有xxx.com的相关镜像,没有会执行build 找到相关Dockerfile进行构建,端口映射采用的是ip限定的,这样可以防止外部来访问,另外links可以让容器内部直接找到php这个容器,当然这里要注意如果你用mysql容器的话记得修改Mysql用户的权限,depend_on是构建的依赖顺序,nginx会在php和redis之后构建。extra_hosts命令是映射一个地址进入到容器内部,这样所有用Mysql的host地址的地方填写Mysql_host即可,以后你即使更换服务器也可以只改Docker-compose文件这里的地址即可,不需要更改代码。
这里我的php容器是用entrypoint执行个sh脚本来构建的,你可以可以用Command,因为有些文件权限,定时任务什么的需要构建,另外为什么容器运行了会退出,是因为没有执行守护进程,你可以在自定义脚本里写一个死循环实现一个定时任务,当然,这只是在定时任务少的场景下,也可以使用Docker-compose自带的命令, docker-php-entrypoint php-fpm,这句一定要放在自定义脚本的最后,才不会退出。这里用Docker-compose,DevOPS我们的理解就是docker容器自动化,简单化,拿到哪里执行都可以马上构建,一个命令执行后,不需要再进入容器进行任何其他的额外操作,也不需要修改任何代码。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题