我是一个Docker初学者,我做的第一件事是下载Nginx,并试图将其挂载到80:80端口,但Apache已经坐在那里了。
docker container run --publish 80:80 nginx
和docker container run --publish 3000:3000 nginx我试着像这样做3000:3000在端口3000上使用它,但是它不工作。而且它也不记录任何我可以用来参考的东西。
docker container run --publish 3000:3000 nginx
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配置不是很熟悉,所以我只是覆盖了整个默认配置。
localhost:3333
0sgqnhkj2#
当你开始使用Docker时,你可能会在DockerHub找到关于图像的有用信息。例如,在nginx中,你有一个关于如何expose public ports的部分。您可以只用途:
docker run --publish 3000:80 nginx
localhost中的端口3000将被转发到端口80,这是nginx映像用于等待http连接的端口。我还建议您阅读这些关于Docker中网络的官方文档。
rggaifut3#
你写你是一个初学者,所以首先我只想提到nginx映像的默认配置(我假设你使用的是标准映像)是监听端口80。这就是为什么不能Map到容器内的端口3000,因为没有进程侦听此端口。现在,如果我理解正确的话,并且考虑到您正在使用nginx和docker这一事实,我猜您希望能够配置容器的端口(而不是主机端口,因为这是非常琐碎的)。@mancini0开启了一个很好的方向,但我将展示如何以一种更动态的方式来实现它。我们将使用envsubst命令,该命令将环境变量替换为shell格式字符串。此命令可用于offical nginx image和alpine版本。现在来看看解决方案。
80
3000
site.template
server { listen ${PORT}; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } }
请注意PORT占位符。
/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,因为我的基础图像是alpine。
/bin/sh
/bin/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中,但我不建议您这样做。
CMD
mbskvtky4#
您可以使用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; }
COPY ./nginx.conf /etc/nginx/conf.d/default.conf
nafvub8i5#
docker run -e NGINX_PORT=8080 nginx:latest -d
The page
5条答案
按热度按时间tez616oj1#
接受的答案不会改变nginx启动的实际端口。
如果你想改变nginx在容器内启动的端口,你必须修改容器内的/etc/nginx/nginx.conf文件。
例如,要在端口9080上启动:
停靠文件
nginx.配置文件
现在要从计算机访问服务器:
在浏览器中导航到
localhost:3333
,您将看到内容。可能有一种方法可以包含默认的nginx.conf,并且只覆盖server.listen = PORT属性,但是我对nginx配置不是很熟悉,所以我只是覆盖了整个默认配置。
0sgqnhkj2#
当你开始使用Docker时,你可能会在DockerHub找到关于图像的有用信息。例如,在nginx中,你有一个关于如何expose public ports的部分。
您可以只用途:
localhost中的端口3000将被转发到端口80,这是nginx映像用于等待http连接的端口。
我还建议您阅读这些关于Docker中网络的官方文档。
rggaifut3#
你写你是一个初学者,所以首先我只想提到nginx映像的默认配置(我假设你使用的是标准映像)是监听端口
80
。这就是为什么不能Map到容器内的端口
3000
,因为没有进程侦听此端口。现在,如果我理解正确的话,并且考虑到您正在使用nginx和docker这一事实,我猜您希望能够配置容器的端口(而不是主机端口,因为这是非常琐碎的)。
@mancini0开启了一个很好的方向,但我将展示如何以一种更动态的方式来实现它。
我们将使用envsubst命令,该命令将环境变量替换为shell格式字符串。
此命令可用于offical nginx image和alpine版本。
现在来看看解决方案。
site.template
:请注意PORT占位符。
/etc/nginx/conf.d
目录中,然后执行envsubst
命令,以使用该模板作为default.conf
的参考,default.conf
是将用于在容器中设置端口配置的文件:请注意:
1.之后您需要执行nginx守护进程。
2.我使用
/bin/sh
而不是/bin/bash
,因为我的基础图像是alpine。(*)您也可以使用
CMD
命令将其写入Dockerfile中,但我不建议您这样做。mbskvtky4#
您可以使用nginx. conf将其更改为任何端口。
nafvub8i5#
The page