【问题标题】:docker run vs docker-compose one of these things is not like the otherdocker run vs docker-compose 其中一件事与另一件事不同
【发布时间】:2026-01-17 06:20:05
【问题描述】:

我有一个 nginx 代理设置,其 shellscript 看起来像这样

docker run --detach --name nginx-proxy --publish 80:80 --publish 443:443 --volume /etc/nginx/certs \
--volume /etc/nginx/vhost.d --volume /usr/share/nginx/html --volume /var/run/docker.sock:/tmp/docker.sock:ro --restart unless-stopped jwilder/nginx-proxy:alpine
echo proxy up
docker run --detach --name nginx-proxy-letsencrypt --volumes-from nginx-proxy --volume /var/run/docker.sock:/var/run/docker.sock:ro \
--restart unless-stopped jrcs/letsencrypt-nginx-proxy-companion
echo ssl companion up

docker run -d \
-e VIRTUAL_HOST=[domain] \
\-e "LETSENCRYPT_HOST=[domain]" \
-e "LETSENCRYPT_EMAIL=[emailaddress]" \
--name [domain] \
--expose 80 \
--restart always \
-v /code/[domain]:/var/www/html \
fauria/lamp


    echo test site up at [domain]

并且该站点可以正常运行并按预期运行。 然后我停止 Web 服务器容器并使用以下 docker-compose.yaml 并失败并显示 502..

version: '3.3'
services:
  lamp:
    restart: always
    image: fauria/lamp
    container_name: [domain]
    expose:
      - "80"
    volumes:
      - /code/[domain]:/var/www/html
    environment:
      - VIRTUAL_HOST=[domain]
      - LETSENCRYPT_HOST=[domain]
      - LETSENCRYPT_EMAIL=[emailaddress]

为什么?他们不一样吗?我错过了什么?

【问题讨论】:

    标签: docker nginx proxy docker-compose


    【解决方案1】:

    当您使用 docker-compose 时,docker-compose 会为您创建一个 docker 网络,其中所有服务都可以相互通信。由于您只是停止了容器并使用 docker-compose 启动了它,因此它现在无法访问 localhost 上的容器。这就是您收到 502 错误的原因。您需要做的是将其他容器添加到您的 docker compose 文件中,并确保您使用正确的服务名称连接到主机(而不是使用 localhost 使用 http://service_name:443)。或者,您可以以某种方式让 docker 网络中的容器访问您的本地主机,但我不确定如何执行此操作。也许您需要使用 0.0.0.0 而不是 127.0.0.1?

    【讨论】:

      【解决方案2】:

      问题是我没有将我的 docker-compose 连接到代理映像中默认使用的桥接网络。

      version: '3.3'
      services:
        lamp:
          restart: always
          image: fauria/lamp
          network-mode: bridge
          container_name: [domain]
          expose:
            - "80"
          volumes:
            - /code/[domain]:/var/www/html
          environment:
            - VIRTUAL_HOST=[domain]
            - LETSENCRYPT_HOST=[domain]
            - LETSENCRYPT_EMAIL=[emailaddress]
      

      【讨论】:

        最近更新 更多