我是一名码头初学者,我做的第一件事就是下载nginx并试图将它安装在80:80端口,但Apache已经在那里了。
docker container run --publish 80:80 nginx
和docker container run --publish 3000:3000 nginx
我试着像3000:3000一样在端口3000上使用它但是它不起作用。并且它没有记录任何我可以用来作为参考的东西。
答案 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