最近在学习docker。对了,我在docker里面配置了nginx和php。发现网上关于docker中nginx和php配置的资料很少,有的很老了,不多说了。为了参考,所以我决定自己写一篇文章,分享一下我的经验。版本说明docker:Version17.06.2-ce-mac27(19124)PHP:7.1Nginx:1.13.3操作系统Mac10.12.6安装docker直接在docker官网https://www.docker.com下载dockerforMac本版是docker专门为mac系统编写的一款软件,相当于一个app。下载安装后,打开dockerapp,然后在app中启动docker。安装好Nginx并启动docker后,打开命令行,你的命令行中就会有docker命令:那么我直接使用官方的nginx镜像,下载方式:dockerpullnginx,等待下载完成。安装PHP也是如此。我也是用官方的PHP镜像。事实上,我推荐nginx和php的官方镜像。毕竟官方镜像代表着安全和稳定。dockerpullphp:7.1-fpm如果要下载其他版本,去官方镜像看看。有各种版本的说明,你可以下载任何你想要的版本。我在这里使用最新的php版本。启动Nginx安装nginx后,使用命令启动:dockerrun-p80:80--namemynginx-v/Users/Doubleduan/Documents/project:/home-v/Users/Doubleduan/Documents/conf:/etc/nginx/conf.d-dnginx-p表示将容器中的80端口绑定到宿主机的80端口,这样访问宿主机的80端口就会转发到nginx容器的80端口--namestarted的名称容器自己定义,方便好记。-v是将我宿主机的/Users/Doubleduan/Documents/project目录映射到容器中的/home目录。当你访问容器中的/home时,你会发现是Users/Doubleduan/Documents/project目录下的me/Stuff。我已经映射了项目目录和配置文件,你也可以映射日志目录,这样以后可以直接在宿主机上操作,不用登录容器查看。-d后台运行容器后面的nginx为镜像名称。启动PHPdockerrun-p9000:9000--namemyphp-v/Users/Doubleduan/Documents/project:/home-dphp:7.1-fpm配置nginx配置我的配置服务器贴在文件下面{listen80;服务器名称algo.test.com;根/家/算法;access_log/var/log/nginx/access.logmain;error_log/var/log/nginx/error.log错误;location/{indexindex.htmlindex.htmindex.php;}location~\.php${fastcgi_pass172.17.0.3:9000;fastcgi_indexindex.php;fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;包括fastcgi_params}算法;}我在宿主机的hosts文件中配置test.com指向127.0.0.1,其实就是宿主机的80端口。这里要特别注意两点:第一点:是fastcgi_pass172.17.0.3:9000,其中172.17.0.3是php容器的ip。查询容器IP的方法:dockerinspectcontainerIDorcontainername|grep'"IPAddress"'如果自己配置,就换成自己的php容器ip。注意不要使用127.0.0.1,因为我使用的是docker默认的网络连接方式,也就是dockerbridge方式。这种模式下,需要访问另外一个容器必须使用那个容器的虚拟ip,端口也必须绑定宿主机对应的端口,因为宿主机是一个网关,nginx容器访问php容器必须通过宿主机的网关转发,所以不绑定端口肯定访问不了。第二点是关于fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name的配置。如果要使用$document_root变量,必须让nginx容器的data目录和php容器的data目录保持一致。比如我的nginx容器的data目录是/home/algorithm,在php容器里还是这个。如果更改了php容器中的目录,不是这个,那么php容器就找不到请求的文件了。因为两个容器相当于两套文件系统,路径可能不同。但是,如果要设置不同,只能把地址写死,比如这样写:fastcgi_paramSCRIPT_FILENAME/home/algorithm/$fastcgi_script_name,这样php容器才能访问对应的文件。完成配置文件后,重启nginx容器就可以访问了。
