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

时间:2017-11-18 08:17:46

标签: docker nginx

我是一名码头初学者,我做的第一件事就是下载nginx并试图将它安装在80:80端口,但Apache已经在那里了。

docker container run --publish 80:80 nginx

docker container run --publish 3000:3000 nginx

我试着像3000:3000一样在端口3000上使用它但是它不起作用。并且它没有记录任何我可以用来作为参考的东西。

4 个答案:

答案 0 :(得分:10)

当您从Docker开始时,您可以在DockerHub上找到有关图像的有用信息。例如,对于nginx,您有一个关于如何expose public ports

的部分

你可以使用:

docker run --publish 3000:80 nginx

本地主机中的端口3000将被转发到端口80,这是nginx映像用于等待http连接的端口。

我还建议您阅读此官方文档about networking in Docker

答案 1 :(得分:5)

接受的答案不会更改nginx在其上启动的实际端口。

如果要更改端口nginx在容器的内部中启动,则必须修改容器内的/etc/nginx/nginx.conf文件。

例如,要从9080端口启动:

Dockerfile

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.conf

# 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的配置不太熟悉,因此我只重写了整个默认配置。

答案 2 :(得分:0)

您写的您是一个初学者,所以首先我要提到的是,nginx图像的默认配置(假设您使用的是标准图像)是在端口80中监听。
这就是为什么您无法映射到容器内的端口3000的原因,因为没有进程监听此端口。

现在,如果我正确理解了您,并且事实证明您正在将nginx与docker结合使用,则我想您希望能够配置容器的端口(而不是主机端口,因为这很安静)琐碎的。)

@ mancini0开了一个很好的方向,但是我将展示如何以更加动态的方式做到这一点。

我们将使用envsubst命令,该命令将环境变量替换为shell格式字符串。
offical nginx image和高山版本都可以使用此命令。

现在解决。

第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的引用,该文件将用于在容器内设置端口配置:

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,因为我的基本图像是高山的。


第2步(另一个选项)-内联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内,但我不建议您这样做。

答案 3 :(得分:0)

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

nginx.conf 将包含与 nginx 相关的所有配置。此处端口的默认值为 80,我们可以按如下方式更改。

nginx.conf

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