以前介绍 docker 的时候说过它的优点之一,就是能够在同一服务器中搭建多个环境,互相隔离。昨天就实际操做下,万万没想到如此多的坑,比以前从零开始搭建服务器都费时间。变换了好几种方案,最终仍是解决了,中间的心酸就忽略吧,直接说操做方法。java
服务器中已存在的是 laradock 镜像,能够运行 laravel 环境以及其余的 PHP,包含了 nginx、mysql、redis 等。
个人想法是再添加一个 nginx 容器,用来作反向代理。根据子域名进行分发,能够分发给 laradock,也能够给其余任何容器(包括 wordpress、python、java)等等python
要修改的只有一个地方,就是 nginx 监听的端口。mysql
laradock
目录中.env
文件,修改 NGINX_HOST_HTTP_PORT
值由 80
为 8000
nginx
, docker-compose stop nginx
nginx
,docker-compose build nginx
docker-compose up -d nginx
这个时候在浏览器中是不能访问成功的,由于 nginx 已经再也不监听 80
端口。nginx
新添加一个 nginx 容器用来作反向代理。在安装 laradock 的时候,已经有了 nginx:alpine
的镜像,能够直接生成容器。固然你也能够从新 pull
一个新的镜像。(推荐使用 alpine版本)laravel
docker iamges
docker run --name proxy_nginx -p 80:80 -d [nginx image id]
。也能够添加 -v
参数来映射配置文件,个人环境较少变更就不须要了docker exec -it proxy_nginx sh
vim
,apk add vim
/sbin/ip route|awk '/default/ { print $3 }'
/etc/nginx/conf.d/
目录下添加新配置文件 laradock.conf
,内容以下server { listen 80; server_name you_site; location / { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://[宿主机IP]:8000; } }
docker restart proxy_nginx
8000
端口,参考这里 这个时候访问的话,就能够代理到 laradock 中的 nginx 了。后续想要新增其余的容器,只要在 proxy_nginx 中添加新的代理规则就能够了。redis
参考资料:【转载】记一次用 Docker 运行 Nginx 容器作域名反向代理时踩的坑、如何从容器内部获取主机IP。sql