Docker容器中运行nginx
nginx简介
Nginx是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。与旧版本(<=2.2)的Apache不同,nginx不采用每客户机一线程的设计模型,而是充分使用异步逻辑,削减了上下文调度开销,所以并发服务能力更强。整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活。在Linux操作系统下,nginx使用epoll事件模型,得益于此,nginx在Linux操作系统下效率相当高。同时Nginx在OpenBSD或FreeBSD操作系统上采用类似于epoll的高效事件模型kqueue。
dockerhub拉取
dockerhub是docker官方的镜像源,里面有做好的nginxdockerimage,当然也可以发布自己的镜像到上面去。
如果官方镜像速度很慢,可以考虑用
阿里云的docker镜像仓库
主要步骤如下:
登录阿里云的docker镜像仓库
获取专属加速器地址
升级docker客户端(建议在1.6.0以上)
修改daemon配置文件(阿里已经给出了所有的命令,基本上只要copypaste即可)
然后使用
dockerpullnginx
就可以快速下载官方的nginxdockerimage了。
基础的docker命令可以参看Docker初体验
Nginxdockerimage
在docker官方的页面上,有部分样例的说明。可以发现,网站的主目录是/usr/share/nginx/html,这跟我搜到的一些文章的说明不同。
我的需求是实现nginx搭建的文件浏览站。说白了就是下载站。实验室(or校园内)共享文件。原来采用的是Python救急HttpServer和Ftpserver,尽管后来采用了python多线程启动httpserver,但还是经常因为卡线程的问题,导致地址访问失败。所以那个方法作为临时应急工具还是可以的,但是如果想要长期共享文件,必须采用有完善功能的httpserver。
nginx的配置文件都在/etc/nginx/下面,可以看到熟悉的conf.d文件夹,明显里面是用户自定义配置文件的位置。
修改自定义配置
default.conf文件内容如下:
server{ listen80; server_namelocalhost; #charsetkoi8-r; #access_log/var/log/nginx/log/host.access.logmain; root/usr/share/nginx/html; location/{ root/usr/share/nginx/html; indexindex.htmlindex.htm; ##下面三行是添加的。 autoindexon; autoindex_exact_sizeon; autoindex_localtimeon; } #error_page404/404.html; #redirectservererrorpagestothestaticpage/50x.html # error_page500502503504/50x.html; location=/50x.html{ root/usr/share/nginx/html; } #proxythePHPscriptstoApachelisteningon127.0.0.1:80 # #location~\.php${ #proxy_passhttp://127.0.0.1; #} #passthePHPscriptstoFastCGIserverlisteningon127.0.0.1:9000 # #location~\.php${ #roothtml; #fastcgi_pass127.0.0.1:9000; #fastcgi_indexindex.php; #fastcgi_paramSCRIPT_FILENAME/scripts$fastcgi_script_name; #includefastcgi_params; #} #denyaccessto.htaccessfiles,ifApache'sdocumentroot #concurswithnginx'sone # #location~/\.ht{ #denyall; #} }
只需要完整的复制出来,并添加
autoindexon; autoindex_exact_sizeon; autoindex_localtimeon;
运行
dockerrun-p8001:80--namemynginx-v/home/embedded_310/haoyueming/2017:/usr/share/nginx/html:ro-v/home/embedded_310/haoyueming/dockerfile/default.conf:/etc/nginx/conf.d/default.conf-d--restart=alwaysnginx
run
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。新建并启动所需要的命令主要为dockerrun。
-p
端口绑定外部端口:容器内端口
–name
给容器制定一个特定的名字,而不是自动生成的一长串hex。
-v
使用-v标记也可以指定挂载一个本地主机的目录到容器中去。-v本地文件夹:容器里的文件夹:读写权限
-d
更多的时候,需要让Docker在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时,可以通过添加-d参数来实现。
–restart=always
运行容器时使用–restart参数可以指定一个restart策略,来指示在退出时容器应该如何重启或不应该重启。
no–容器退出时不要自动重启。这个是默认值。
on-failure[:max-retries]–只在容器以非0状态码退出时重启。可选的,可以退出dockerdaemon尝试重启容器的次数。
always–不管退出状态码是什么始终重启容器。当指定always时,dockerdaemon将无限次数地重启容器。容器也会在daemon启动时尝试重启,不管容器当时的状态如何。
unless-stopped–不管退出状态码是什么始终重启容器,不过当daemon启动时,如果容器之前已经为停止状态,不要尝试启动它。
nginx
镜像的名称,表示以什么镜像作为底包新建一个容器。
tips
我之前运行的时候,一般都采用交互式:
-i保证容器的stdin开启-t为容器生成一个tty终端,在命令的最后加一个/bin/bash来保证可以交互。但是实际上,nginx并没有运行,导致我以为容器的端口绑定不是持久化的。
以前的错误做法:
dockerrun-itnginx/bin/bash