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

Ser*_*hin 2 linux macos nginx web docker

我想使用 docker 机器在 OSX 上运行基本的 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
Run Code Online (Sandbox Code Playgroud)

在当前目录中,我有 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
}
Run Code Online (Sandbox Code Playgroud)

和 docker.dev 文件夹,其中包含 index.html 文件。

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

192.168.99.100 docker.dev
Run Code Online (Sandbox Code Playgroud)

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

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

tha*_*tah 6

nginx.conf 的位置不正确

您使用的配置文件位置不正确。如官方 nginx 镜像readme 所述,配置文件的位置是/etc/nginx/nginx.conf,所以你应该使用;

-v $(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro
Run Code Online (Sandbox Code Playgroud)

对于配置文件。

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

服务多个域

通常,我建议为您要运行的每个域/网站使用专用容器。要在单个 docker 机器上为多个网站(因此,多个容器)提供服务,您可以:

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

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

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

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

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

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