Exception: cURL error: \"Failed to connect to 127.0.0.1 port 8000: Connection refused\"
我在这个应用程序中同时拥有 Web 和 api,奇怪的是我的 Web 应用程序 HTML 可以找到这些图像。我按照教程创建了一个非常基本的环境。
我使用
http://127.0.0.1:8000/
作为基本 URL 来访问我的应用程序和 api。
ROOT_DIR/public/uploads/report_templates/logo/logo-white.png
http://127.0.0.1:8000/uploads/report_templates/logo/logo-white.png
看到这一点。https://www.google.pl/images/srpr/logo11w.png
都可以找到。curl
表示 http://127.0.0.1:8000/uploads/report_templates/logo/logo-white.png
我正在寻找一种在docker中处理这个问题的正确方法。
.env
Failed to connect to 127.0.0.1 port 8000: Connection refused
docker-compose.yml
...
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=http://127.0.0.1:8000/
...
Dockerfile
version: "3.7"
services:
app:
build:
args:
user: daniyalnasir
uid: 1001
context: ./
dockerfile: Dockerfile
image: f-scope
container_name: f-scope-app
restart: unless-stopped
working_dir: /var/www/
volumes:
- ./:/var/www
networks:
f-scope:
db:
image: mysql:5.7
container_name: f-scope-db
restart: unless-stopped
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_PASSWORD: ${DB_PASSWORD}
# MYSQL_USER: ${DB_USERNAME}
# MYSQL_ALLOW_EMPTY_PASSWORD: 1
SERVICE_TAGS: dev
SERVICE_NAME: mysql
volumes:
- dbdata1:/var/lib/mysql
- ./docker-compose/mysql:/docker-entrypoint-initdb.d
networks:
f-scope:
ipv4_address: 172.24.2.1
nginx:
image: nginx:alpine
container_name: f-scope-nginx
restart: unless-stopped
ports:
- 8000:80
volumes:
- ./:/var/www
- ./public/uploads:/var/www/public/uploads
- ./docker-compose/nginx:/etc/nginx/conf.d/
networks:
f-scope:
networks:
f-scope:
driver: bridge
ipam:
driver: default
config:
- subnet: "172.24.2.0/16"
volumes:
dbdata1:
HTML
FROM php:7.4-fpm
# Arguments defined in docker-compose.yml
ARG user
ARG uid
# Install system dependencies
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
libgd-dev \
libzip-dev \
zip \
sendmail \
unzip
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install PHP extensions
RUN docker-php-ext-configure gd --enable-gd --with-freetype --with-jpeg
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip
# Configure sendmail path
RUN echo "sendmail_path=/usr/sbin/sendmail -t -i" >> /usr/local/etc/php/conf.d/sendmail.ini
#RUN sed -i '/#!\/bin\/sh/aservice sendmail restart' /usr/local/bin/docker-php-entrypoint
#RUN sed -i '/#!\/bin\/sh/aecho "$(hostname -i)\t$(hostname) $(hostname).localhost" >> /etc/hosts' /usr/local/bin/docker-php-entrypoint
# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Create system user to run Composer and Artisan Commands
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer && \
chown -R $user:$user /home/$user
# Set working directory
WORKDIR /var/www
USER $user
创建一个包含图像 url 的 pdf(指向我的应用程序的公共文件夹)。它在我的常规 LAMP 环境中运行良好。 但是,学习
(以及出于其他一些原因)。我决定在本地计算机上的 docker 容器中创建并运行这个应用程序(运行 ubuntu)。除了这一件事之外,在这个 docker 环境中一切都正常工作。
<img src="{{url("uploads/report_templates/logo/logo-white.png")}}" style="width: 250px; height:80px; margin: 70px 0px 40px 30px;" alt="" />
或
localhost
指的是容器本身,而不是运行服务器的主机。这就是为什么您的应用程序无法通过 127.0.0.1
访问图像。一种解决方案是使用 http://127.0.0.1:8000/
主机名,它会自动解析为主机使用的内部 IP 地址。这是 Docker 容器可以用来访问主机的 IP 地址。
因此,您可以更改图像 URL:host.docker.internal
至:
<img src="{{url("uploads/report_templates/logo/logo-white.png")}}" style="width: 250px; height:80px; margin: 70px 0px 40px 30px;" alt="" />
这样,Docker 容器内的应用程序将能够访问主机上运行的服务器提供的映像。
请注意,
<img src="{{url("http://host.docker.internal:8000/uploads/report_templates/logo/logo-white.png")}}" style="width: 250px; height:80px; margin: 70px 0px 40px 30px;" alt="" />
目前仅适用于 Windows 和 Mac。如果您在 Linux 上使用 Docker,则可能需要使用主机的实际 IP 地址,而不是
host.docker.internal
。