background : 最近为小伙伴们筹划docker系列的技术分享,研究了一会docker相关技术, 在此记录一下构建nginx容器时候的坑
docker 官方镜像提供的nginx基于debian/jessie平台,其文件结构和ubuntu中的nginx中并不相同
eg:
run一个niginx容器
//80端口被占用,so...
$ sudo docker run -it -p 800:800 nginx
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1801a32aab54 nginx "nginx -g 'daemon off" 2 minutes ago Up 2 minutes 80/tcp, 443/tcp, 0.0.0.0:800->800/tcp berserk_kare
进入容器内部
$ sudo docker exec -it 1801a32aab54 /bin/bash
root@1801a32aab54:/#
查看nginx目录
# cd /etc/nginx/
conf.d/ koi-utf mime.types nginx.conf uwsgi_params
fastcgi_params koi-win modules/ scgi_params win-utf
可以看到不仅没有熟悉的 /sites-available,也没有 /sites-enabled
继续查看nginx配置
# cat /conf.d/default.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
#...省略php-fpm配置,好长..
}
根目录配置: root /usr/share/nginx/html;
测试
# cd /usr/share/nginx/html
# touch index.html
# echo "test nginx in docker" >index.html
在浏览器中输入localhost或者在terminal中
curl localhost
首先发现php配置的目录结构和ubuntu还是不一样,dockerfile里面配置改为如下
ADD php.ini /usr/local/etc/php/php.ini
ADD php-fpm.conf /usr/local/etc/php-fpm.conf
进入nginx容器
$ docker ps
# docker exec -it xxx /bin/bash
进入niginx的log
# cd /var/www/log
# tail -f error.log
显示为空,log路径找错了
# cd /opt/log/nginx
# tail -f error.log
2016/05/13 03:19:59 [crit] 6#6: *28 connect() to unix:/run/php/php7.0-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 172.17.0.1, server: _, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", host: "localhost"
可见问题是 连接不到 /run/php/php7.0-fpm.sock ,nginx和php并不在同一个主机中,Domain socket通信当然无法实现
//将host中的workspace挂载到container的服务器根目录 此处的nginx配置被我修改过 所以image名字是mynginx
# docker run -it -p 80:80 -v
/home/jason/workspace:/var/www/html mynginx
在host的workspace目录中新增index.html 并访问
$ cd ~/workspace && touch index.html
$ echo "index in host">index.html
//先关闭host的nginx服务再执行这一步
$ curl localhost
index in host
挂载成功
//run 一个php-fpm容器 并挂载host内的目录
# docker run -p 9000:9000 -v ~/opt:/var/www --name phpfpm -it fancive/php
//run 一个nginx容器并与php容器连接
# docker run --name nginx_server -d -p 80:80 --link phpfpm:phpfpm --volumes-from phpfpm fancive/nginx
测试一下
$ curl localhost
index in host
成功了