使用Docker时如何更改nginx的端口

bnlyeluc  于 2023-01-29  发布在  Nginx
关注(0)|答案(5)|浏览(367)

我是一个Docker初学者,我做的第一件事是下载Nginx,并试图将其挂载到80:80端口,但Apache已经坐在那里了。

docker container run --publish 80:80 nginx

docker container run --publish 3000:3000 nginx
我试着像这样做3000:3000在端口3000上使用它,但是它不工作。而且它也不记录任何我可以用来参考的东西。

tez616oj

tez616oj1#

接受的答案不会改变nginx启动的实际端口。
如果你想改变nginx在容器内启动的端口,你必须修改容器内的/etc/nginx/nginx.conf文件。
例如,要在端口9080上启动:

停靠文件

FROM nginx:1.17-alpine
COPY <your static content> /usr/share/nginx/html
COPY nginx.conf /etc/nginx/
EXPOSE 9080
CMD ["nginx", "-g", "daemon off;"]

nginx.配置文件

# on alpine, copy to /etc/nginx/nginx.conf
user                            root;
worker_processes                auto;

error_log                       /var/log/nginx/error.log warn;

events {
    worker_connections          1024;
}

http {
    include                     /etc/nginx/mime.types;
    default_type                application/octet-stream;
    sendfile                    off;
    access_log                  off;
    keepalive_timeout           3000;
    server {
        listen                  9080;
        root                    /usr/share/nginx/html;
        index                   index.html;
        server_name             localhost;
        client_max_body_size    16m;
    }
}

现在要从计算机访问服务器:

docker build . -t my-app
docker run -p 3333:9080 my-app

在浏览器中导航到localhost:3333,您将看到内容。
可能有一种方法可以包含默认的nginx.conf,并且只覆盖server.listen = PORT属性,但是我对nginx配置不是很熟悉,所以我只是覆盖了整个默认配置。

0sgqnhkj

0sgqnhkj2#

当你开始使用Docker时,你可能会在DockerHub找到关于图像的有用信息。例如,在nginx中,你有一个关于如何expose public ports的部分。
您可以只用途:

docker run --publish 3000:80 nginx

localhost中的端口3000将被转发到端口80,这是nginx映像用于等待http连接的端口。
我还建议您阅读这些关于Docker中网络的官方文档。

rggaifut

rggaifut3#

你写你是一个初学者,所以首先我只想提到nginx映像的默认配置(我假设你使用的是标准映像)是监听端口80
这就是为什么不能Map到容器内的端口3000,因为没有进程侦听此端口。
现在,如果我理解正确的话,并且考虑到您正在使用nginx和docker这一事实,我猜您希望能够配置容器的端口(而不是主机端口,因为这是非常琐碎的)。
@mancini0开启了一个很好的方向,但我将展示如何以一种更动态的方式来实现它。
我们将使用envsubst命令,该命令将环境变量替换为shell格式字符串。
此命令可用于offical nginx image和alpine版本。
现在来看看解决方案。

    • 步骤#1**在模板文件中编写nginx配置-我们称之为:site.template
server {
    listen       ${PORT};
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

请注意PORT占位符。

    • 第2步-使用docker-compose**将其装载到/etc/nginx/conf.d目录中,然后执行envsubst命令,以使用该模板作为default.conf的参考,default.conf是将用于在容器中设置端口配置的文件:
web:
  image: nginx:alpine
  volumes:
   - ./site.template:/etc/nginx/conf.d/site.template
  ports:
   - "3000:8080"
  environment:
   - PORT=8080
  command: /bin/sh -c "envsubst < /etc/nginx/conf.d/site.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"

请注意:
1.之后您需要执行nginx守护进程。
2.我使用/bin/sh而不是/bin/bash,因为我的基础图像是alpine。

    • 步骤#2(另一个选项)-inline docker run**如果出于某种原因不想使用docker-compose,可以使用以下bash脚本:
#!/usr/bin/env bash

##### Variables #####
PORT=8080 #Or $1 if you pass it from command line
TEMPLATE_DIR=$(pwd)/site.template
TEMPLATE_REMOTE_DIR=/etc/nginx/conf.d/site.template
IMAGE_NAME=nginx:alpine

echo "Starting nginx on port: $PORT ..."

##### The docker command #####
docker run -p 3000:$PORT -v $TEMPLATE_DIR:$TEMPLATE_REMOTE_DIR $IMAGE_NAME \
/bin/sh -c "envsubst < $TEMPLATE_REMOTE_DIR > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"

(*)您也可以使用CMD命令将其写入Dockerfile中,但我不建议您这样做。

mbskvtky

mbskvtky4#

您可以使用nginx. conf将其更改为任何端口。

    • nginx. conf**将包含所有与nginx相关的配置。这里端口的默认值是80,我们可以如下所示进行更改。
    • nginx.配置文件**
server {
  listen 3000;

  location / {
    root /usr/share/nginx/html;
    index index.html index.htm;
    try_files $uri $uri/ /index.html =404;
  }

  include /etc/nginx/extra-conf.d/*.conf;
}
    • 并在DockerFile中添加一行:**
COPY ./nginx.conf /etc/nginx/conf.d/default.conf
nafvub8i

nafvub8i5#

docker run -e NGINX_PORT=8080 nginx:latest -d

The page

相关问题