【问题标题】:Get PHP container on port 8000 after php artisan servephp artisan serve 后在 8000 端口获取 PHP 容器
【发布时间】:2019-12-29 12:55:54
【问题描述】:

即使在我的 docker-compose.yml 文件中添加端口映射后,我也无法在端口 8000 上进行监听。

所有相关文件都可以在这里找到:https://github.com/salvatore-esposito/laravel-dockerized

我运行了以下命令:docker-compose exec app php artisan serve,它已经成功运行了。

无论如何,如果我进入容器内部,curl 会按预期工作,但从外部无法正常工作。连接被拒绝。

我使用docker-machine ip获取了ip

请注意,我通过 docker-compose.yml 映射了容器中的内外端口,即使在存储库中没有映射。

我尝试将所有文​​件复制到构建的映像并启动:

docker run --rm -p 8000:8000 --name laravel salvio/php-laravel php artisan serve

docker exec -it laravel bash

再一次,如果运行“curl localhost:80”和“curl localhost:8000”,前者不起作用,后者起作用,而如果我通过 docker 检查 name_container 和数字 curl ip_of_container:8000 获取容器的 ip什么都没有。

【问题讨论】:

  • php artisan 不应该用于托管 laravel 站点,您应该将 apache 配置为指向 laravel 文件夹。您可以绑定8000:80,以便能够使用80000 从主机访问容器
  • 我知道,但是例如,如果我只使用没有 apache 的 php 容器,它应该工作吗?我的好奇心是我无法通过端口 8000 访问容器,即使有内部 php 服务器正在监听。
  • 它在哪里列出它运行serve 命令? github.com/salvatore-esposito/laravel-dockerized/blob/master/…。 @Salvio
  • 我是通过 bash 手动完成的:docker-compose exec app php artisan serve。我告诉它:这只是我的好奇心,因为使用端口 80 一切正常。
  • 这不是特定于内部 php 服务器的,这是大多数应用程序的默认设置。我更新了答案以包含主机信息,您可以将其标记为已解决吗? @Salvio

标签: php laravel docker port


【解决方案1】:

当使用docker-compose exec 时,命令会一直运行,直到它的交互式会话停止(通过使用ctrl-c 或关闭终端),因为它没有作为服务运行。为了能够保持以下命令运行

docker-compose exec app php artisan serve

您必须打开 2 个终端,1 个使用命令打开,1 个连接到容器并 ping 端口 8000

如果您想访问您的容器端口 8000,您必须在 Dockerfile 中公开端口 8000

# rest of docker file
# Copy existing application directory permissions
#COPY --chown=www-data:www-data ./code /var/www/html

# Change current user to www-data
#USER www-data

# Expose port 9000 and start php-fpm server
EXPOSE 80
EXPOSE 80000

并在docker-compose(file) 中将其映射到您的主机:

app:
    build:
      context: .
      dockerfile: .config/php/Dockerfile
    image: salvio/php-composer-dev
    container_name: app
    restart: unless-stopped
    tty: true
    environment:
      SERVICE_NAME: app
      SERVICE_TAGS: dev
    working_dir: /var/www/html
    ports:
      - "80:80"
      - "8000:8000"
    volumes:
      - ./code/:/var/www/html
      - .config/php/php.ini:/usr/local/etc/php/conf.d/local.ini
    networks:
      - myproject-network

请记住php artisan serve 绑定到localhost:8000。这意味着这只能在容器内访问。使用

php artisan serve --host 0.0.0.0

绑定到共享网络接口。查看以下资源:

  1. https://stackoverflow.com/a/54022753/6310593
  2. How do you dockerize a WebSocket Server?

【讨论】:

  • 我使用了两个终端,然后通过浏览器尝试。我尝试使用 curl 并且无法访问。
  • 你运行了什么命令? 1. ./init 2. docker-compose exec app php artisan serve 在第一航站楼和 3. docker-compose exec app ping localhost:8000 在第二航站楼? @Salvio
  • 当 laravel 准备好并且容器响应端口 80 时,我运行 docker-compose exec app php artisan serve。不,在第二个终端我运行“curl ip_of_app_container:8000”。无论如何启动我运行的所有 ./init.sh
  • 如果你想访问一个容器端口,你必须在你的Dockerfiledocker-compose中暴露端口(8000)。查看示例的更新答案@Salvio
  • 我通过复制图像中的所有文件并运行单个图像来做到这一点。我曝光了8000,但什么也没曝光。
猜你喜欢
  • 2021-05-08
  • 2018-08-19
  • 2015-03-12
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
  • 2018-02-22
  • 2014-01-30
  • 2021-04-09
相关资源
最近更新 更多