以前介紹 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