首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使ngnix在坞中运行以重新加载nginx.conf配置

如何使ngnix在坞中运行以重新加载nginx.conf配置
EN

Stack Overflow用户
提问于 2021-01-28 20:15:53
回答 1查看 5.4K关注 0票数 2

我试图让一个基于ngnix的反向代理在Windows/WSL2 2环境中工作。我对码头和尼克斯世界非常陌生。我能够让下面的命令工作

docker run --name nginx-test -p 8080:80 -v /home/skotekar/nginx.conf:/etc/nginx/nginx.conf:ro -v /mnt/d/site1/wwwroot:/usr/share/nginx/html:ro -d nginx:alpine

然后,我可以浏览http://localhost:8080并查看我的静态内容。正如您从命令中看到的,我在本地主文件夹中有一个默认的ngnix.conf,它在运行时被映射到nginx。第一次效果很好。

现在如果我停止使用容器

docker container stop nginx-test

然后更改我的主目录中的ngnix.conf文件,并希望使用follwoing命令使用更新的配置启动容器。

docker container start nginx-test

但是这个命令失败给了我一个非常令人困惑的信息。

Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: process_linux.go:459: container init caused: rootfs_linux.go:59: mounting "/run/desktop/mnt/host/wsl/docker-desktop-bind-mounts/Ubuntu-20.04/c0d0caa87ff063ee46265048f5b1ee489a8945669d39c6f6110cd578b8cda1ed" to rootfs at "/var/lib/docker/overlay2/4e6b279945acb06200b3677272774f4b5fbb6a619214decbca8c594dbbe3b8ec/merged/etc/nginx/nginx.conf" caused: no such file or directory: unknown

让它重新运行的唯一方法是删除容器并再次使用第一个命令。知道该怎么做吗。如果我能够在对配置进行更改之后重新启动容器,在找到我需要的正确的反向代理设置之前,这会更容易一些。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-28 20:46:29

您不需要重新启动容器才能重新加载新配置。Nginx不需要重新启动就可以重新加载配置。

一旦您已挂载卷,您可以进行更改,它们将立即反映在容器中。

要测试您的配置,只需执行以下命令:

代码语言:javascript
复制
docker exec nginx-test nginx -t

要重新加载新配置:

代码语言:javascript
复制
docker exec nginx-test nginx -s reload

编辑!从WSL2中运行的Docker访问Windows主机

根据我的评论,我对你的问题很好奇,因为我在我的职业生涯中没有见过它们。

因此,我重现用例的步骤是:

1.下载windows的任何web应用程序

我选择了caddy web服务器,因为它是一个二进制文件,我知道。它类似于Nginx的应用。

https://caddyserver.com/download

2.在Windows主机上安装简单网页

我为Caddy编写了Caddyfile - Config:

代码语言:javascript
复制
:80

respond "Hello, world from Caddy on Windows!"

然后,我将这个Caddyfile放在同一个目录中,其中有Caddy二进制文件:

代码语言:javascript
复制
PS C:\Users\Daniel\Downloads\caddy> ls


    Directory: C:\Users\Daniel\Downloads\caddy


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        29.01.2021     11:59             52 Caddyfile
-a----        29.01.2021     11:55       34081792 caddy_windows_amd64.exe

3.在Windows上启动Web服务器并对其进行验证。

要启动web服务器运行:./caddy.exe run

示例:

代码语言:javascript
复制
PS C:\Users\Daniel\Downloads\caddy> .\caddy_windows_amd64.exe run
2021/01/29 11:01:27.520 ←[34mINFO←[0m   using adjacent Caddyfile
2021/01/29 11:01:27.528 ←[34mINFO←[0m   admin   admin endpoint started  {"address": "tcp/localhost:2019", "enforce_origin": false, "origins": ["localhost:2019", "[::1]:2019", "127.0.0.1:2019"]}
2021/01/29 11:01:27.529 ←[34mINFO←[0m   tls.cache.maintenance   started background certificate maintenance      {"cache": "0xc000497490"}
2021/01/29 11:01:27.529 ←[34mINFO←[0m   http    server is listening only on the HTTP port, so no automatic HTTPS will be applied to this server {"server_name": "srv0", "http_port": 80}
2021/01/29 11:01:27.530 ←[34mINFO←[0m   tls     cleaned up storage units
2021/01/29 11:01:27.532 ←[34mINFO←[0m   autosaved config        {"file": "C:\\Users\\Daniel\\AppData\\Roaming\\Caddy\\autosave.json"}
2021/01/29 11:01:27.532 ←[34mINFO←[0m   serving initial configuration

现在验证它是否有效。转到浏览器并访问http://localhost/页面:

4.现在验证您在windows主机上运行了WSL2:

代码语言:javascript
复制
PS C:\Users\Daniel> wsl.exe --list --all -v
  NAME            STATE           VERSION
* Ubuntu-20.04    Running         2

如果是,则在那里使用命令wsl进行shell

5.启动docker守护进程

代码语言:javascript
复制
daniel@DESKTOP-K8UQA2E:~$ sudo service docker start
 * Starting Docker: docker

6.在Windows和Linux中检查WSL网络适配器的IPv4地址

打开powershell并执行ifconfig命令,然后查找WSL网络适配器:

代码语言:javascript
复制
Ethernet adapter vEthernet (WSL):

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::e96c:c3d6:464e:2a3b%72
   IPv4 Address. . . . . . . . . . . : 172.20.240.1
   Subnet Mask . . . . . . . . . . . : 255.255.240.0
   Default Gateway . . . . . . . . . :

您的Windows是172.20.240.1

然后转到WSL并执行curl 172.20.240.1,以检查主机是否已连接。

代码语言:javascript
复制
daniel@DESKTOP-K8UQA2E:~$ curl 172.20.240.1
Hello, world from Caddy on Windows!d

现在,使用ip a命令找出Linux,并查看与Windows相同的网络中的IP:

代码语言:javascript
复制
5: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:ce:28:8e brd ff:ff:ff:ff:ff:ff
    inet 172.20.252.177/20 brd 172.20.255.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::215:5dff:fece:288e/64 scope link
       valid_lft forever preferred_lft forever

7.准备简单的nginx配置

代码语言:javascript
复制
worker_processes  5;  ## Default: 1
worker_rlimit_nofile 8192;

events {
  worker_connections  4096;  ## Default: 1024
}

http {
  index    index.html index.htm index.php;

  default_type application/octet-stream;
  sendfile     on;
  tcp_nopush   on;
  server_names_hash_bucket_size 128; # this seems to be required for some vhosts


  server { # simple load balancing
    listen          80;

     location / {
      return  200 "Hello World from Nginx in Linux";
    }

    location /windows {
      proxy_pass      http://172.20.240.1/;
    }
  }
}

这是非常简单的配置

8.采用host网络模式启动码头。

如果不想使用host网络,则必须将数据包从停靠器网络转发到wsl网络,因为您的对接者将无法直接访问windows主机。

但是,假设您可以使用host网络启动容器。

运行以下命令:

代码语言:javascript
复制
daniel@DESKTOP-K8UQA2E:~/nginx-test$ sudo docker run -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf --name="nginx-local" --network=host  -d nginx:latest

确认你的码头工作正常:

代码语言:javascript
复制
daniel@DESKTOP-K8UQA2E:~/nginx-test$ sudo docker logs nginx-local
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
daniel@DESKTOP-K8UQA2E:~/nginx-test$ sudo docker ps | grep nginx

de9873314b77        nginx:latest           "/docker-entrypoint.…"   20 seconds ago      Up 19 seconds

8.尝试从linux和windows获得响应。

代码语言:javascript
复制
daniel@DESKTOP-K8UQA2E:~/nginx-test$ curl localhost
Hello World from Nginx in Linux
daniel@DESKTOP-K8UQA2E:~/nginx-test$ curl localhost/windows
Hello, world from Caddy on Windows!
daniel@DESKTOP-K8UQA2E:~/nginx-test$
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65944578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档