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-compose快速启动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

Docker-compose提示 exited with code 0

docker-compose 简单搭建nginx的ssl环境