linux - 使用自定义虚拟主机在 docker 中运行 nginx

标签 linux macos web nginx docker

我想在 OSX 上用 docker 机器运行基本的 nginx 容器。

我运行以下代码:

docker pull nginx
docker run -d -i -t \
    -p 8080:80 \
    -v $(pwd)/vhost.conf:/etc/nginx/sites-enabled/vhost.conf \
    -v $(pwd)/docker.dev:/var/www/docker.dev nginx

在当前目录中我有 vhost.conf 文件:

server {
    listen 80;
    index index.html;
    server_name docker.dev;
    error_log /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log
    root /var/www/docker.dev
}

和 docker.dev 文件夹,里面有 index.html 文件。

同样在我的主机 OSX 系统上的/etc/hosts 中我有:

192.168.99.100 docker.dev

但是当我访问http://192.168.99.100:8080在浏览器中我得到默认的 nginx 页面,而不是我的 index.html

我可以通过将 index.html 文件放在/usr/share/nginx/html 文件夹中来实现所需的结果。但我想弄清楚如何调整我自己的网络根目录位置。

最佳答案

nginx.conf 的位置不正确

您使用的配置文件位置不正确。如 readme for the official nginx image 中所述,配置文件的位置是 /etc/nginx/nginx.conf , 所以你应该使用;

-v $(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro

对于配置文件。

鉴于您将在您的容器中只提供一个网站,您甚至不必在您的虚拟主机中指定域名(到达 nginx 容器的任何请求都应该针对该域)。

服务于多个域

一般来说,我建议为您要运行的每个域/网站使用专用容器。要在一台 docker 机器上为多个网站(因此,多个容器)提供服务,您可以;

使用端口映射;每个容器都发布在主机的不同端口上(-p 8080:80 用于网站“A”,-p 8081:80 用于网站“B”)

使用代理容器。这可能是一个更好的方法;您像往常一样运行您的网站容器,但不要发布它们的端口。因此,这些容器无法公开访问。您无需直接发布端口,而是运行一个代理服务器,根据域名将流量转发到正确的容器。

基于域名的转发需要一些配置。但是,有一种方便的方法可以全自动执行此操作。 jwilder/nginx-proxy是一个设计用于在 Docker 容器中运行的 nginx 代理服务器;您需要做的就是运行该容器,并为其授予对 docker API 的访问权限。

随后,启动您的网络服务器容器,但在它们上设置一个环境变量,指定它们服务的域(例如 -e VIRTUAL_HOST=www.example.com,example.com)。

nginx-proxy 容器监听“docker 事件”,并自动生成配置以将流量转发到正确的容器。

如果您的 DNS(或 /etc/hosts)设置正确,您现在可以简单地访问 http://www.example.com。 ,并查看该网站。

关于linux - 使用自定义虚拟主机在 docker 中运行 nginx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34935695/

相关文章:

Linux HZ 和公平调度时间片

java - 三角形不在 OSX 上的 OpenGL 2.1 中绘制

javascript - 如何从javascript获取变量到php?

c - shell 中的历史功能

linux - 使用 write syscall linux 的正确方法

ios - Apple 全局开发者关系证书颁发机构中级证书和 iOS

swift - macOS 应用程序中的表单验证问题

javascript - 如何在生产构建或断开连接中排除/禁用 Redux devtools?

javascript - 在 React 的父组件中使用按钮提交表单

linux - 如何在不更改 cd 的情况下更改 tcsh 中的目录 -