如何在docker中获取nginx 运行重新加载nginx.conf配置
How to get ngnix running in docker to reload nginx.conf configuration
我正在尝试让基于 ngnix 的反向代理在 Windows/WSL2 环境中工作。我是 docker 和 nginx 世界的新手。我能够使以下命令工作
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。第一次用还不错
现在,如果我使用
停止容器
docker container stop nginx-test
然后更改我的主目录中的 ngnix.conf 文件,并希望使用以下命令启动具有更新配置的容器
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
取回它的唯一方法运行 是删除容器并再次使用第一个命令。任何想法如何让这个工作。如果我可以在更改配置后重新启动我的容器,直到我找出我需要的正确反向代理设置,那会更容易。
谢谢
您无需重启容器即可重新加载新配置。 Nginx 可以在不重启的情况下热重载配置。
安装卷后,您可以进行更改,它们将立即反映在容器中。
要测试您的配置,只需执行此命令:
docker exec nginx-test nginx -t
要重新加载新配置:
docker exec nginx-test nginx -s reload
编辑!在 WSL2
中从 Docker 运行ning 访问 Windows 主机
根据评论,我对你的问题很好奇,因为我在我的职业生涯中没有见过它们。
所以我重现您的用例的步骤是:
1。下载 windows
的任何 Web 应用程序
我选择了 caddy 网络服务器,因为它是单个二进制文件,我知道这一点。类似于Nginx
的应用
https://caddyserver.com/download
2。在 Windows 主机
上设置简单网页
我准备了 Caddyfile
- Caddy Web 服务器的配置:
:80
respond "Hello, world from Caddy on Windows!"
然后我把这个 Caddyfile
放在我有 Caddy Server 二进制文件的同一目录中:
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 服务器并验证它。
启动网络服务器运行:./caddy.exe run
示例:
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 运行ning:
PS C:\Users\Daniel> wsl.exe --list --all -v
NAME STATE VERSION
* Ubuntu-20.04 Running 2
如果是 shell 有命令 wsl
5。启动 docker 守护程序
daniel@DESKTOP-K8UQA2E:~$ sudo service docker start
* Starting Docker: docker
6。在 Windows 和 Linux
中检查 WSL 网络适配器的 IPv4 地址
打开powershell
执行ifconfig
命令,然后找到WSL网卡:
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 IP 是 172.20.240.1
然后去WSL执行curl 172.20.240.1
,检查你的主机是否连接。
daniel@DESKTOP-K8UQA2E:~$ curl 172.20.240.1
Hello, world from Caddy on Windows!d
现在用ip a
命令找出Linux主机IP,查看与Windows同一网络的IP:
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 配置
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
网络模式启动 docker。
如果您不想使用 host
网络,您必须将数据包从 docker 网络转发到 wsl 网络,因为您的 docker 将无法访问 windows直接主持。
但是假设您可以使用 host
网络启动容器。
运行 这个命令:
daniel@DESKTOP-K8UQA2E:~/nginx-test$ sudo docker run -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf --name="nginx-local" --network=host -d nginx:latest
验证您的 docker 工作正常:
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
获得响应
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$
我正在尝试让基于 ngnix 的反向代理在 Windows/WSL2 环境中工作。我是 docker 和 nginx 世界的新手。我能够使以下命令工作
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。第一次用还不错
现在,如果我使用
停止容器docker container stop nginx-test
然后更改我的主目录中的 ngnix.conf 文件,并希望使用以下命令启动具有更新配置的容器
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
取回它的唯一方法运行 是删除容器并再次使用第一个命令。任何想法如何让这个工作。如果我可以在更改配置后重新启动我的容器,直到我找出我需要的正确反向代理设置,那会更容易。
谢谢
您无需重启容器即可重新加载新配置。 Nginx 可以在不重启的情况下热重载配置。
安装卷后,您可以进行更改,它们将立即反映在容器中。
要测试您的配置,只需执行此命令:
docker exec nginx-test nginx -t
要重新加载新配置:
docker exec nginx-test nginx -s reload
编辑!在 WSL2
中从 Docker 运行ning 访问 Windows 主机根据评论,我对你的问题很好奇,因为我在我的职业生涯中没有见过它们。
所以我重现您的用例的步骤是:
1。下载 windows
的任何 Web 应用程序我选择了 caddy 网络服务器,因为它是单个二进制文件,我知道这一点。类似于Nginx
的应用https://caddyserver.com/download
2。在 Windows 主机
上设置简单网页我准备了 Caddyfile
- Caddy Web 服务器的配置:
:80
respond "Hello, world from Caddy on Windows!"
然后我把这个 Caddyfile
放在我有 Caddy Server 二进制文件的同一目录中:
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 服务器并验证它。
启动网络服务器运行:./caddy.exe run
示例:
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 运行ning:
PS C:\Users\Daniel> wsl.exe --list --all -v
NAME STATE VERSION
* Ubuntu-20.04 Running 2
如果是 shell 有命令 wsl
5。启动 docker 守护程序
daniel@DESKTOP-K8UQA2E:~$ sudo service docker start
* Starting Docker: docker
6。在 Windows 和 Linux
中检查 WSL 网络适配器的 IPv4 地址打开powershell
执行ifconfig
命令,然后找到WSL网卡:
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 IP 是 172.20.240.1
然后去WSL执行curl 172.20.240.1
,检查你的主机是否连接。
daniel@DESKTOP-K8UQA2E:~$ curl 172.20.240.1
Hello, world from Caddy on Windows!d
现在用ip a
命令找出Linux主机IP,查看与Windows同一网络的IP:
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 配置
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
网络模式启动 docker。
如果您不想使用 host
网络,您必须将数据包从 docker 网络转发到 wsl 网络,因为您的 docker 将无法访问 windows直接主持。
但是假设您可以使用 host
网络启动容器。
运行 这个命令:
daniel@DESKTOP-K8UQA2E:~/nginx-test$ sudo docker run -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf --name="nginx-local" --network=host -d nginx:latest
验证您的 docker 工作正常:
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
获得响应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$