Docker compose with nginx 不断显示欢迎页面
Posted
技术标签:
【中文标题】Docker compose with nginx 不断显示欢迎页面【英文标题】:Docker compose with nginx keeps displaying welcome page 【发布时间】:2018-11-15 06:43:02 【问题描述】:我是 docker 的新手,并尝试使用最简单的 docker-compose.yml 显示一个 hello world 页面,并在此基础上构建一个完整的 LEMP 堆栈将具有与我的服务器相同的配置。然而,大多数教程都已过时,并且使用 docker 的方法有很多,以至于我找不到仅使用仍然有效的 Docker compose v3 的方法。我检查了文档,对于初学者来说也非常困惑,过去 5 个小时一直在努力让它工作,所以我想我会问一下。
docker-compose.yml
version: '3'
services:
web:
image: bitnami/nginx:1.10.3-r0 #using this version as it's the same on my server
volumes:
- "./test.conf:/etc/nginx/sites-available/test.local"
- "./test.conf:/etc/nginx/sites-enabled/test.local"
- "./code:/var/www/html" #code contains only a basic index.html file
ports:
- "80:80"
test.conf
server
listen 80;
listen [::]:80;
server_name test.local;
index index.html; #Only a basic helloworld index.html file
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/html;
我需要一个 Dockerfile 吗?教程似乎没有提到它是必需的。
注意: 尝试增加音量
- "./default.conf:/etc/nginx/conf.d/default.conf"
但没有任何变化,欢迎页面仍然加载,而使用 nginx:latest 我收到一个包含以下短语的非常详细的错误:“未知:您是否尝试将目录挂载到文件上(或反之亦然)?检查指定的主机路径是否存在并且是预期的类型”。
关于 docker-compose.yml 的更新:
没有"./code:/usr/share/nginx/html"
行,/usr/share/nginx/html
文件夹包含默认的 index.html 文件(预期)
使用"./code:/usr/share/nginx/html"
行,/usr/share/nginx/html
文件夹为EMPTY!
"./:/usr/share/nginx/html"
行,/usr/share/nginx/html
文件夹有一个空的“代码”文件夹和一堆我前段时间删除的随机测试文件。
在尝试之间,我运行我的重置脚本以确保我重新开始:
docker rm $(docker ps -a -q)
docker rmi $(docker images -q) --force
docker volume rm $(docker volume ls -q)
运行docker inspect <container>
会为卷返回此值,但不确定类型是“绑定”为bind mount 而不是volume 是否正常。
"Mounts": [
"Type": "bind",
"Source": "/e/DEV/sandbox/docker",
"Destination": "/usr/share/nginx/html",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
],
【问题讨论】:
我猜,但我认为问题在于,默认配置从“/etc/nginx/conf.d/*.conf”位置获取配置 谢谢朋友,我已经尝试过覆盖该文件,但它不起作用。我在我的问题中添加了更多细节 在启用站点的文件夹中,您将虚拟主机配置文件挂载为test.local
。试着给它一个以.conf
结尾的名字
感谢您的建议,但运气不佳..
在您的 docker-compose.yml 中,卷成对出现 the_left_side:its_right_side 注意完整的冒号分隔符 左侧的目录必须存在于您启动容器的主机本地 右侧的目录被挂载从新容器内部查看到该本地目录,因此它们指向同一个地方
【参考方案1】:
挂载自己的 hello world 页面很容易。我将使用官方的nginx:latest
图像进行解释,但如果您愿意,可以使用 bitnami 图像自己完成。
首先是非常基本的。只需运行 nginx 容器(没有 docker-compose)。我将对其进行详细和基本的解释,当然我可以尝试执行更高级或更快的命令来读取容器内的文件,但这可能会让初学者感到困惑。所以只需运行容器并将其命名为my-nginx
:
$ docker run --rm -d -p 80:80 --name my-nginx nginx
转到localhost:80
,您将看到默认的 nginx 页面。
现在您可以使用容器的名称在容器内执行。 exec 会将您带到“容器内部”,以便您检查其文件。
$ docker exec -it my-nginx bash
root@2888fdb672a1:/# cd /etc/nginx/
root@2888fdb672a1:/etc/nginx# ls
conf.d koi-utf mime.types nginx.conf uwsgi_params
fastcgi_params koi-win modules scgi_params win-utf
现在使用cat
阅读nginx.conf
。
该文件中最重要的一行是:
include /etc/nginx/conf.d/*.conf;
这意味着该目录中的所有confs
都已使用/读取。
所以进入/etc/nginx/conf.d/
。
root@2888fdb672a1:~# cd /etc/nginx/conf.d/
root@2888fdb672a1:/etc/nginx/conf.d# ls
default.conf
default.conf
是唯一的文件。在此文件中,您可以看到配置:
listen 80;
server_name localhost;
location /
root /usr/share/nginx/html;
index index.html index.htm;
服务器为本地主机,端口为80,将显示的文件在目录/usr/share/nginx/html/
现在检查容器中的文件:
root@2888fdb672a1:/etc/nginx/conf.d# cat /usr/share/nginx/html/index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
</style>
...
这是预期的文件。这是我们可以看到的“欢迎使用 Nginx”页面。
那么我们如何展示我们自己的index.html
?只需将其安装在/usr/share/nginx/html
。
你会docker-compose.yaml
看起来像这样。
version: '3'
services:
web:
image: nginx:latest
volumes:
- ./code:/usr/share/nginx/html
ports:
- "80:80"
代码目录只包含一个带有 hello world 的 index.html
。
运行 docker-compose up -d --build
,当你 curl localhost:80
时,你会看到你自己的 index.html
。
如果您真的想将代码放入 /var/www/html
而不是 /usr/share/nginx
,您可以这样做。
使用您的test.conf
。在这里你定义把你的文件放在/var/www/html/
:
server
listen 80;
listen [::]:80;
server_name test.local;
index index.html; #Only a basic helloworld index.html file
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/html;
在 compose 中,您将使用自己的 conf 覆盖 default.conf
,您告诉 nginx 在 /var/www/html
中查找。
您的撰写可能如下所示:
version: '3'
services:
web:
image: nginx:latest
volumes:
- "./test.conf:/etc/nginx/conf.d/default.conf"
- "./code:/var/www/html"
ports:
- "80:80"
现在您还可以在自己指定的位置看到自己的index.html
。答案很长,但我希望这会有所帮助。
【讨论】:
感谢您提供超级详细的答案!我已经知道了大部分,但我仍然尝试过。不幸的是,默认消息仍在显示。但是我发现了一些非常奇怪的东西,请查看我的问题中的最新更新,我真的很困惑 你能不能只用索引文件创建一个目录代码并像这样挂载它:./code:/usr/share/nginx/html 并使用 docker-compose up --build 来确保重建你的图片,请确保您的本地环境也很干净 刚刚尝试使用--build,结果与我的问题相同。容器上的 html 文件夹为空。我在试验之间运行这些命令以清理所有内容,但它仍然没有改变:“docker rm $(docker ps -a -q)”、“docker rmi $(docker images -q) --force”、“docker volume rm $ (docker 卷 ls -q)" 我认为我的 docker 可能已损坏,但它是全新安装的,所以我没有得到它,也不知道在哪里问 你能试试这个吗?:: docker-compose rm --all && docker-compose pull && docker-compose build --no-cache && docker-compose up -d --force-recreate && 【参考方案2】:在这个问题上苦苦挣扎之后,我发现了三个使我使用 docker-compose 进行部署的因素。 我用nodejs做了一个网站。
我们在端口 80 上暴露 web 部件和 nginx
nodejs 的 Dockerfile:[ 重要的一行是 -> EXPOSE 80 ]
FROM node:14-alpine
WORKDIR /
COPY package.json ./
EXPOSE 80
RUN npm install
COPY . .
CMD ["node", "bin/www"]
Nginx.conf for nginx : [ 重要的一行是 -> listen 80; ]
events
http
server
listen 80;
location /
proxy_pass http://nodejs:3000;
我们给 nginx 配置文件,web 镜像的名称和端口
docker-compose.yaml :[重要的一行是 -> image: nodejs ] 即 web 镜像的名称 AND[重要的一行是 -> ports: -"3000:3000" ] 那是运行 web 部分的端口
version: "3.7"
services:
nodejs:
build:
context: .
dockerfile: Dockerfile
image: nodejs
container_name: nodejs
restart: unless-stopped
networks:
- app-network
ports:
- "3000:3000"
webserver:
image: nginx
container_name: webserver
restart: unless-stopped
ports:
- "80:80"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/:/etc/nginx/conf.d
depends_on:
- nodejs
networks:
- app-network
networks:
app-network:
driver: bridge
Nginx.conf for nginx : [ 重要的一行是 -> proxy_pass http://nodejs:3000; ]
events
http
server
listen 80;
location /
proxy_pass http://nodejs:3000;
我们给 nginx 的镜像,volumes 作为配置文件的路径来替换默认文件
树:
mainfolder
.
|_____nginx
| |______nginx.conf
|
|_____Dockerfile
|
|_____docker-compose.yaml
docker-compose.yaml : [重要的一行是 -> ./nginx/nginx.conf:/etc/nginx/nginx.conf ] 替换配置文件
version: "3.7"
services:
nodejs:
build:
context: .
dockerfile: Dockerfile
image: nodejs
container_name: nodejs
restart: unless-stopped
networks:
- app-network
ports:
- "3000:3000"
webserver:
image: nginx
container_name: webserver
restart: unless-stopped
ports:
- "80:80"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
depends_on:
- nodejs
networks:
- app-network
networks:
app-network:
driver: bridge
【讨论】:
以上是关于Docker compose with nginx 不断显示欢迎页面的主要内容,如果未能解决你的问题,请参考以下文章
docker run 和 docker-compose 配置挂载 Volume 并运行 nginx
Docker-compose.yml for NodeJs with MySQL on AWS Elastic Beanstalk 单容器 Docker
Docker-compose提示 exited with code 0