维护者:NGINX Docker维护者
哪里可以得到帮助:Docker社区论坛、Docker社区松弛或堆栈溢出
Nginx(发音为“engine-x”)是用于HTTP、HTTPS、SMTP、POP3和IMAP协议的开源反向代理服务器,以及负载平衡器、HTTP缓存和web服务器(源服务器)。nginx项目一开始就非常关注高并发性、高性能和低内存使用。它是根据类似于BSD的2条款授权的,它运行在Linux、BSD变体、Mac OS X、Solaris、AIX、HP-UX以及其他*nix版本上。它还有一个用于Microsoft Windows的概念验证端口。
$ docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx
或者,可以使用一个简单的Dockerfile来生成包含必要内容的新映像(这是比上面的绑定挂载更干净的解决方案):
FROM nginx
COPY static-html-directory /usr/share/nginx/html
把这个文件放在你的目录下(“静态html目录”),运行docker build-t some content nginx,然后启动你的容器:
$ docker run --name some-nginx -d some-content-nginx
$ docker run --name some-nginx -d -p 8080:80 some-content-nginx
然后你可以打http://localhost/本地主机:8080或http://host ip地址:8080在您的浏览器中。
$ docker run --name my-custom-nginx-container -v /host/path/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx
有关nginx配置文件语法的信息,请参阅官方文档(特别是初学者指南)。
如果希望调整默认配置,请使用以下内容从正在运行的nginx容器中复制它:
$ docker run --name tmp-nginx-container -d nginx
$ docker cp tmp-nginx-container:/etc/nginx/nginx.conf /host/path/nginx.conf
$ docker rm -f tmp-nginx-container
使用一个简单的Dockerfile(in/host/path/)也可以更干净地完成此任务:
FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
如果您在Dockerfile中添加了一个自定义命令,请确保在命令中包含-g daemon off;,以便nginx保持在前台,这样Docker可以正确地跟踪进程(否则您的容器将在启动后立即停止)!
然后用docker build-t自定义nginx构建图像。运行如下:
$ docker run --name my-custom-nginx-container -d custom-nginx
开箱即用,nginx不支持大多数配置块中的环境变量。但是这个图像有一个函数,它将在nginx启动之前提取环境变量。
下面是一个使用docker的例子-合成.yml:
web:
image: nginx
volumes:
- ./templates:/etc/nginx/templates
ports:
- "8080:80"
environment:
- NGINX_HOST=foobar.com
- NGINX_PORT=80
默认情况下,此函数读取/etc/nginx/templates/*.template中的模板文件,并将执行envsubt的结果输出到/etc/nginx/conf.d。
所以如果你放模板/default.conf.template模板包含如下变量引用的文件:
listen ${NGINX_PORT};
输出到/etc/nginx/conf.d/default.conf这样地:
listen 80;
可以通过以下环境变量更改此行为:
NGINX_ENVSUBST_TEMPLATE_目录
包含模板文件的目录(默认值为/etc/nginx/templates)
当此目录不存在时,此函数将不处理模板处理。
NGINX_ENVSUBST_TEMPLATE_后缀
模板文件的后缀(默认值:.template)
此函数仅处理名称以该后缀结尾的文件。
NGINX_ENVSUBST_OUTPUT_DIR(NGINX_ENVSUBST_输出目录)
输出执行envsubt的结果的目录(默认值为/etc/nginx/conf.d)
输出文件名是去掉后缀的模板文件名。
例如)/etc/nginx/模板/default.conf.template模板将输出文件名为/etc/nginx/conf.d/默认.conf.
运行容器的用户必须可以写入此目录。
要以只读模式运行nginx,需要将Docker卷装载到nginx写入信息的每个位置。默认的nginx配置需要对/var/cache和/var/run的写访问。通过运行nginx可以很容易地实现这一点,如下所示:
$ docker run -d -p 80:80 --read-only -v $(pwd)/nginx-cache:/var/cache/nginx -v $(pwd)/nginx-pid:/var/run nginx
如果有更高级的配置要求nginx写入其他位置,只需向这些位置添加更多的卷装入。
自1.9.8版以来的图像都带有nginx调试二进制文件,当使用更高的日志级别时会产生详细的输出。它可以与简单的命令替换一起使用:
$ docker run --name my-nginx -v /host/path/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx nginx-debug -g 'daemon off;'
docker中的类似配置-合成.yml可能是这样的:
web:
image: nginx
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
command: [nginx-debug, '-g', 'daemon off;']
自1.17.0以来,基于alpine和debian的映像变体都使用相同的用户和组ID来删除工作进程的权限:
$ id
uid=101(nginx) gid=101(nginx) groups=101(nginx)
可以将映像作为特权较低的任意UID/GID运行。但是,这需要修改nginx配置以使用可由该特定UID/GID对写入的目录:
$ docker run -d -v $PWD/nginx.conf:/etc/nginx/nginx.conf nginx
哪里nginx.conf格式在当前目录中应重新定义以下指令:
pid /tmp/nginx.pid;
在http上下文中:
http {
client_body_temp_path /tmp/client_temp;
proxy_temp_path /tmp/proxy_temp_path;
fastcgi_temp_path /tmp/fastcgi_temp;
uwsgi_temp_path /tmp/uwsgi_temp;
scgi_temp_path /tmp/scgi_temp;
...
}
Amplify是一个免费的监控工具,可以用来监控基于nginx的微服务架构。Amplify是由nginx软件背后的公司开发和维护的。
使用Amplify,可以跨容器收集和聚合度量,并呈现关键性能数据的一致可视化集,例如每秒的活动连接或请求。它也很容易快速检查任何性能下降,流量异常,并深入了解nginx配置的一般情况。
为了使用Amplify,应该在容器中安装一个基于Python的小型代理软件(Amplify agent)。
有关Amplify的更多信息,请查看此处的官方文档。
nginx图像有多种风格,每种都是为特定的用例设计的。
nginx:
这是真实的图像。如果你不确定你的需求是什么,你可能想用这个。它被设计成既可用作丢弃的容器(装载源代码并启动容器以启动应用程序),也可用作构建其他映像的基础。
nginx:-alpine
此图片基于流行的Alpine Linux项目,可在Alpine官方图片中找到。Alpine Linux比大多数发行版基础映像(约5MB)小得多,因此通常会产生更细的映像。
当需要尽可能小的最终图像尺寸时,强烈建议使用此变体。需要注意的主要问题是,它使用的是musl libc,而不是glibc和friends,因此某些软件可能会遇到问题,这取决于它们的libc需求的深度。然而,大多数软件都没有这个问题,所以这个变种通常是一个非常安全的选择。有关可能出现的问题的更多讨论,以及使用基于Alpine的图像的一些赞成/反对比较,请参阅此黑客新闻评论线程。
为了最小化图像大小,很少有其他相关工具(如git或bash)包含在基于Alpine的图像中。使用此映像作为基础,在您自己的Dockerfile中添加所需的内容(如果您不熟悉,请参阅alpine映像描述以获取如何安装软件包的示例)。