我每次新建一个容器时,都要进入容器里面,启动nginx和php,请问如何每次新建容器时都让nginx和php自启动?
我每次新建一个容器时,都要进入容器里面,启动nginx和php,请问如何每次新建容器时都让nginx和php自启动?
个人建议楼主使用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容器自动化,简单化,拿到哪里执行都可以马上构建,一个命令执行后,不需要再进入容器进行任何其他的额外操作,也不需要修改任何代码。
15 回答8.4k 阅读
1 回答4k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
2 回答2.2k 阅读✓ 已解决
2 回答2.4k 阅读✓ 已解决
2 回答793 阅读✓ 已解决
1 回答1.8k 阅读✓ 已解决
你可以使用supervisord来管理
先进入容器安装supervisord,(安装过程网上搜下)
推荐将主配置文件放在:/etc/supervisord.conf vim /etc/supervisord.conf
然后在/etc/supervisor/conf.d/添加php和nginx的启动命令
例如添加nginx, vim /etc/supervisor/conf.d/nginx_super.conf
然后提交一个新的镜像出来,例如
docker commit -a "qclaogui" -m "bulabula" nginx-php:commit
编写新的Dokcerfile
重新构建一个镜像
docker build -t nginx-php:v1 .
基于新构建的镜像运行容器
docker run --name test-nginx-php -p 8081:80 -d nginx-php:v1
注意这里用的是-d
参数根据你的情况,大致解决思路是这个样子,可以参考一下