Nginx的docker作为本地的nodejs代理

目前我在Docker中使用nginx代理我的节点应用程序

例如我在我的主机文件中添加website.dev

和我的实际nginxconfiguration是

 worker_processes 4; pid /run/nginx.pid; events {} http { server { listen 80; server_name website.dev; location / { proxy_pass http://localnode:3000; proxy_set_header X-Base-Path "/"; proxy_set_header Website-Name "test"; } } } 

我用这个命令启动我的docker容器

 docker run --name infra-nginx --add-host localnode:$(ifconfig | grep inet | grep -v inet6 | grep -v 127.0.0.1 | awk '{print $2}') -p 80:80 -d docker-registry.bizzw.com:5000/infra-nginx:dev 

哪里

 $(ifconfig | grep inet | grep -v inet6 | grep -v 127.0.0.1 | awk '{print $2}') is getting my local ip, not working all the time. 

问题是如果我想在没有互联网的情况下工作,我不能。 而当我的IP变化,我不得不重新启动与新的IP容器。

我试着用这个configuration来代替

 worker_processes 4; pid /run/nginx.pid; events {} http { server { listen 80; server_name localhost; location / { return 200 'gangnam style!'; } } server { listen 80; server_name website.dev; location / { proxy_pass http://localhost:3000; proxy_set_header X-Base-Path "/"; proxy_set_header Website-Name "test"; } } } 

并运行

 docker run --name infra-nginx --network host -d docker-registry.bizzw.com:5000/infra-nginx:dev 

在这种情况下,当我运行时:

 curl http://website.dev/ 

我有

 curl: (7) Failed to connect to website.dev port 80: Connection refused 

docker ps正在给予

 81da561dd131 ajouve/infra-nginx:dev "nginx -g 'daemon ..." 32 minutes ago Up 32 minutes infra-nginx 

netstat -plant正在给我

 Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1/nginx: master pro tcp 0 0 172.17.0.1:35962 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35938 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35994 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:45080 172.17.0.5:6379 ESTABLISHED - tcp 0 0 172.17.0.1:35990 172.17.0.4:27017 ESTABLISHED - tcp 0 0 192.168.65.2:44900 151.101.0.204:80 TIME_WAIT - tcp 0 0 172.17.0.1:45126 172.17.0.5:6379 ESTABLISHED - tcp 0 0 172.17.0.1:36000 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35958 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:59172 172.17.0.3:5672 ESTABLISHED - tcp 0 0 172.17.0.1:35976 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:59106 172.17.0.3:5672 ESTABLISHED - tcp 0 0 172.17.0.1:35980 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35996 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:58356 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35966 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:45112 172.17.0.5:6379 ESTABLISHED - tcp 0 0 172.17.0.1:35932 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:58366 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35998 172.17.0.4:27017 ESTABLISHED - tcp 0 0 192.168.65.2:41386 206.251.255.63:80 TIME_WAIT - tcp 0 0 172.17.0.1:58358 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35956 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35924 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:36004 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:58360 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35964 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35916 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:58362 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:59148 172.17.0.3:5672 ESTABLISHED - tcp 0 0 172.17.0.1:59166 172.17.0.3:5672 ESTABLISHED - tcp 0 0 172.17.0.1:35944 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35912 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35954 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:45116 172.17.0.5:6379 ESTABLISHED - tcp 0 0 172.17.0.1:58354 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35988 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:59122 172.17.0.3:5672 ESTABLISHED - tcp 0 0 192.168.65.2:34936 5.153.231.4:80 TIME_WAIT - tcp 0 0 192.168.65.2:44904 151.101.0.204:80 TIME_WAIT - tcp 0 0 172.17.0.1:59162 172.17.0.3:5672 ESTABLISHED - tcp 0 0 172.17.0.1:59180 172.17.0.3:5672 ESTABLISHED - tcp 0 0 172.17.0.1:45130 172.17.0.5:6379 ESTABLISHED - tcp 0 0 172.17.0.1:59140 172.17.0.3:5672 ESTABLISHED - tcp 0 0 172.17.0.1:36002 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35922 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35970 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:58364 172.17.0.4:27017 ESTABLISHED - tcp6 0 0 :::6379 :::* LISTEN - tcp6 0 0 :::15672 :::* LISTEN - tcp6 0 0 :::5672 :::* LISTEN - tcp6 0 0 :::27017 :::* LISTEN - 

从docker集装箱:

 curl -v localhost 

给予

 * Rebuilt URL to: localhost/ * Hostname was NOT found in DNS cache * Trying ::1... * connect to ::1 port 80 failed: Connection refused * Trying 127.0.0.1... * Connected to localhost (127.0.0.1) port 80 (#0) > GET / HTTP/1.1 > User-Agent: curl/7.38.0 > Host: localhost > Accept: */* > < HTTP/1.1 200 OK * Server nginx/1.10.3 is not blacklisted < Server: nginx/1.10.3 < Date: Fri, 29 Sep 2017 08:46:10 GMT < Content-Type: text/plain < Content-Length: 14 < Connection: keep-alive < * Connection #0 to host localhost left intact gangnam style! 

curl -v website.dev正在返回

 * Rebuilt URL to: website.dev/ * Hostname was NOT found in DNS cache * Trying 127.0.0.1... * Connected to website.dev (127.0.0.1) port 80 (#0) > GET / HTTP/1.1 > User-Agent: curl/7.38.0 > Host: website.dev > Accept: */* > < HTTP/1.1 502 Bad Gateway * Server nginx/1.10.3 is not blacklisted < Server: nginx/1.10.3 < Date: Fri, 29 Sep 2017 08:46:37 GMT < Content-Type: text/html < Content-Length: 173 < Connection: keep-alive < <html> <head><title>502 Bad Gateway</title></head> <body bgcolor="white"> <center><h1>502 Bad Gateway</h1></center> <hr><center>nginx/1.10.3</center> </body> </html> * Connection #0 to host website.dev left intact 

docker inspect infra-nginx

 [ { "Id": "16941d22442a257f0874a772df935514c658ac16ec67eb3f65606b4d7c0ee62e", "Created": "2017-09-29T08:31:21.144827953Z", "Path": "nginx", "Args": [ "-g", "daemon off;" ], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 2656, "ExitCode": 0, "Error": "", "StartedAt": "2017-09-29T08:31:21.548119911Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "sha256:25d085baee52923e32f8d134048238fb67e71173e01f758c391119235f7fc565", "ResolvConfPath": "/var/lib/docker/containers/16941d22442a257f0874a772df935514c658ac16ec67eb3f65606b4d7c0ee62e/resolv.conf", "HostnamePath": "/var/lib/docker/containers/16941d22442a257f0874a772df935514c658ac16ec67eb3f65606b4d7c0ee62e/hostname", "HostsPath": "/var/lib/docker/containers/16941d22442a257f0874a772df935514c658ac16ec67eb3f65606b4d7c0ee62e/hosts", "LogPath": "/var/lib/docker/containers/16941d22442a257f0874a772df935514c658ac16ec67eb3f65606b4d7c0ee62e/16941d22442a257f0874a772df935514c658ac16ec67eb3f65606b4d7c0ee62e-json.log", "Name": "/infra-nginx", "RestartCount": 0, "Driver": "aufs", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "", "ExecIDs": null, "HostConfig": { "Binds": null, "ContainerIDFile": "", "LogConfig": { "Type": "json-file", "Config": {} }, "NetworkMode": "host", "PortBindings": {}, "RestartPolicy": { "Name": "no", "MaximumRetryCount": 0 }, "AutoRemove": false, "VolumeDriver": "", "VolumesFrom": null, "CapAdd": null, "CapDrop": null, "Dns": [], "DnsOptions": [], "DnsSearch": [], "ExtraHosts": null, "GroupAdd": null, "IpcMode": "", "Cgroup": "", "Links": null, "OomScoreAdj": 0, "PidMode": "", "Privileged": false, "PublishAllPorts": false, "ReadonlyRootfs": false, "SecurityOpt": null, "UTSMode": "", "UsernsMode": "", "ShmSize": 67108864, "Runtime": "runc", "ConsoleSize": [ 0, 0 ], "Isolation": "", "CpuShares": 0, "Memory": 0, "NanoCpus": 0, "CgroupParent": "", "BlkioWeight": 0, "BlkioWeightDevice": null, "BlkioDeviceReadBps": null, "BlkioDeviceWriteBps": null, "BlkioDeviceReadIOps": null, "BlkioDeviceWriteIOps": null, "CpuPeriod": 0, "CpuQuota": 0, "CpuRealtimePeriod": 0, "CpuRealtimeRuntime": 0, "CpusetCpus": "", "CpusetMems": "", "Devices": [], "DeviceCgroupRules": null, "DiskQuota": 0, "KernelMemory": 0, "MemoryReservation": 0, "MemorySwap": 0, "MemorySwappiness": -1, "OomKillDisable": false, "PidsLimit": 0, "Ulimits": null, "CpuCount": 0, "CpuPercent": 0, "IOMaximumIOps": 0, "IOMaximumBandwidth": 0 }, "GraphDriver": { "Data": null, "Name": "aufs" }, "Mounts": [], "Config": { "Hostname": "moby", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "ExposedPorts": { "443/tcp": {}, "80/tcp": {} }, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "NGINX_VERSION=1.10.3-1~jessie" ], "Cmd": [ "nginx", "-g", "daemon off;" ], "ArgsEscaped": true, "Image": "ajouve/infra-nginx:dev", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": {} }, "NetworkSettings": { "Bridge": "", "SandboxID": "175272649c9a9c5abbfde7516328bdab5cb3825e1e027eee0580eb18f7ff77cb", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": {}, "SandboxKey": "/var/run/docker/netns/default", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "", "Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "", "IPPrefixLen": 0, "IPv6Gateway": "", "MacAddress": "", "Networks": { "host": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "3e04a4c12b5a5b3f55e7b4e918dadec64806b5c926fc249e8aa3e28398a02954", "EndpointID": "7de54daaa31230c9492a463792015af727e9562eaacbaa0c2d70cdc3d3b04236", "Gateway": "", "IPAddress": "", "IPPrefixLen": 0, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "", "DriverOpts": null } } } } ] 

所以当你使用--net host运行它时,它实际上仍然不在mac网络上。 这就是为什么它不工作。

从文档

Mac有一个不断变化的IP地址(或者如果你没有网络访问权限的话)。 从17.06开始,我们的建议是连接到特殊的仅限于Mac的DNS名称docker.for.mac.localhost,该名称将解析为主机使用的内部IP地址。

所以你需要改变你的配置

 worker_processes 4; pid /run/nginx.pid; events {} http { server { listen 80; server_name localhost; location / { return 200 'gangnam style!'; } } server { listen 80; server_name website.dev; location / { proxy_pass http://docker.for.mac.localhost:3000; proxy_set_header X-Base-Path "/"; proxy_set_header Website-Name "test"; } } } 

你应该如下运行容器

 docker run --name infra-nginx -p 80:80 -d docker-registry.bizzw.com:5000/infra-nginx:dev 

你让它太复杂了。 只需从您的应用程序容器中将8080这样的端口移出。

在nginx中使用:

 listen 80; server_name _; location / { proxy_pass http://127.0.0.2:8080; } 

好吧,我认为我所做的解决方案非常简单。

首先我在本地机器上的端口3000上运行nodejs中的应用程序,所以如果我在浏览器中访问localhost:3000,则可以看到该应用程序正在运行。

然后我在我的机器的一个文件夹~/projects/docker/default.conf创建一个名为default.conf的文件, 你可以在任何你想要的地方创建这个文件 。 并将此代码粘贴到文件中:

 server { listen 80; server_name myapp.com; location / { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } 

}

看看这个行proxy_pass http://localhost:3000; 我重定向到我的本地机器上运行的应用程序。

然后我用下面的命令运行一个nginx container

 sudo docker run -d -p 80:80 --name="nginx" --net="host" -v ~/projects/docker/default.conf:/etc/nginx/conf.d/default.conf:ro nginx 

-p 80:80是将该端口绑定到nginx container

--net="host"是告诉容器,它将使用的网络是一样的主机,这意味着我的机器相同,与此我可以转发到localhost:3000容器内。

-v ~/projects/docker/default.conf:/etc/nginx/conf.d/default.conf:ro是告诉nginx它的配置文件是我在本地机器上的文件。

它的意思是这样的:你会在~/projects/docker/default.conf /etc/nginx/conf.d/default.conf ~/projects/docker/default.conf位置找到这个/etc/nginx/conf.d/default.conf文件

就这样。

如果我去我的浏览器,只输入localhost (没有端口) ,它将通过nginx container ,将被重定向到我的本地计算机上运行localhost:3000的应用程序

让我知道这是否有助于你