如何在docker nginx中访问主机api接口

如何在docker nginx中访问主机api接口,docker,nginx,Docker,Nginx,我的服务器提供了api 如果我不使用docker,nginx配置可以正常工作 server { listen 80; server_name 127.0.0.1; location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html; } location ^

我的服务器提供了api

如果我不使用docker,nginx配置可以正常工作

server {
   listen       80;
    server_name  127.0.0.1;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
    }
    location ^~/api/ { proxy_pass http://127.0.0.1:5438/api/; }
 }
如果我使用的是docker,那么nginx配置不起作用

sudo docker run \
  -d -p 80:80 \
  -v /usr/share/nginx/html:/usr/share/nginx/html \
  -v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
  -v /usr/share/nginx/html/nginx.conf:/etc/nginx/sites-enabled/nginx.conf \
  nginx
那么如何在docker nginx中访问主机的5438端口呢?

在docker run命令中将“-p80:80”修改为“-p5438:80”,这将docker的80端口连接到主机的5438端口

sudo docker run \
-d -p 5438:80 \
-v /usr/share/nginx/html:/usr/share/nginx/html \
-v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /usr/share/nginx/html/nginx.conf:/etc/nginx/sites-enabled/nginx.conf \
nginx

希望它能工作

如果您不关心网络toplogic,请尝试添加
--net=host
,但限制是主机不应具有服务使用
80
端口

sudo docker run \
  --net=host \
  -d \
  -v /usr/share/nginx/html:/usr/share/nginx/html \
  -v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
  -v /usr/share/nginx/html/nginx.conf:/etc/nginx/sites-enabled/nginx.conf \
  nginx

侦听tcp 0.0.0.0:5438:bind:address已在使用
端口5438已在运行以提供api。如果您的nginx服务器已在主机上运行端口5438,则无法绑定该端口。您需要停止已经运行的nginx服务器,或者尝试使用ex:5439的其他端口来测试和检查它是否工作。127.0.0.1:5438是一个不使用nginx的node js express后端。例如,127.0.0.1:5438/api/user/1将响应用户1的信息。我想使用docker中的nginx,它监听端口80以访问127.0.0.1:5438。据我所知,127.0.0.1:5438已被运行docker容器的主机中的NodeJ使用。如果正确,则无法将同一端口绑定到docker nginx容器,因为它已在nodejs应用程序中使用。更改nodejs侦听端口或docker nginx端口。问题是尝试对主机上已在端口5438上运行的服务器进行出站调用。
docker run-p
选项只会影响到容器中的入站调用。也请记住,可能的重复。