docker - Docker + webdevops:“无法访问此站点”
问题描述
在当前项目中,我使用 Docker。我必须澄清一下,我对此非常缺乏经验。
我的项目是一个 PHP/Symfony 项目。在那之前,我使用nginx:alpine
并phpdocker/php-fpm
让我的项目在我的开发环境中运行。但是,我发现这些不适合我的情况,因为我的产品实际上使用了 Apache。
我发现我正在进行的另一个项目使用webdevops
Docker 映像没有问题。我想用一个webdevops/php-apache-dev:alpine
docker 镜像替换上面列出的两个容器。
尽管两个项目之间的配置看起来几乎相同,但我的开发环境似乎无法正常工作:我最终得到以下结果:
无法访问此站点 - 172.18.0.7 拒绝连接。
(我也使用 Traefik,但路由 URI 并不能更好地工作。虽然错误消息略有不同:)Bad Gateway
。
我发现自己无法调试这个。我什至不知道在哪里看。
以下是docker-compose.yml
我要使用的配置:
version: '3.2'
services:
app:
image: webdevops/php-apache-dev:alpine
container_name: my-app
working_dir: /app
env_file: .env
environment:
WEB_DOCUMENT_ROOT: /public
WEB_DOCUMENT_INDEX: index.php
LOG_STDOUT: ./var/log/app.stdout.log
LOG_STDERR: ./var/log/app.stderr.log
# @todo list of unwanted PHP modules, cf. https://dockerfile.readthedocs.io/en/latest/content/DockerImages/dockerfiles/php-apache-dev.html#php-modules
# PHP_DISMOD:
php.error_reporting: E_ALL
PHP_DISPLAY_ERRORS: 1
PHP_POST_MAX_SIZE: 80M
PHP_UPLOAD_MAX_FILESIZE: 200M
PHP_MEMORY_LIMIT: 521M
PHP_MAX_EXECUTION_TIME: 300
PHP_DATE_TIMEZONE: Europe/Paris
volumes:
- .:/app
# - ./docker/apache2/conf.d:/opt/docker/etc/httpd/conf.d
- ~/.ssh:/home/application/.ssh:ro
- ~/.composer:/home/application/.composer
depends_on:
- elasticsearch
- database
其他容器和以前一样工作。这是唯一一个失败的。
调用时docker-compose up
不会抛出错误。我可以在容器中找到的所有日志都保持沉默。据我所知,Traefik 似乎不是问题。这是结果docker ps
:
[/var/www/html/citizen-game]$ docker ps *[master]
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6e9639e7a84d webdevops/php-apache-dev:alpine "/entrypoint supervi…" 4 hours ago Up 4 hours 80/tcp, 443/tcp, 9000/tcp my-app-app
be1b90fdf768 docker.elastic.co/elasticsearch/elasticsearch:6.2.4 "/usr/local/bin/dock…" 4 hours ago Up 4 hours (healthy) 9200/tcp, 9300/tcp my-app-elasticsearch
76fb8743a12f phpmyadmin/phpmyadmin "/run.sh supervisord…" 4 hours ago Up 4 hours 80/tcp, 9000/tcp my-app-phpmyadmin
dd41b4afe267 mysql:5.7 "docker-entrypoint.s…" 4 hours ago Up 4 hours (healthy) 3306/tcp, 33060/tcp my-app-database
91893783bcb1 rabbitmq:3.7-management "docker-entrypoint.s…" 4 hours ago Up 4 hours 4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp my-app-rabbitmq
63f551884bbf traefik:maroilles "/traefik --web --do…" 4 hours ago Up 4 hours 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:8080->8080/tcp
我的问题是,我猜:我该如何调试呢?我错过了一些微不足道的事情吗?
编辑
这是docker-compose.override.yml
文件的(部分)内容:
version: '3.2'
services:
app:
volumes:
- ~/.ssh:/home/application/.ssh
- ~/.composer:/home/application/.composer
labels:
- "traefik.backend=my-app"
- "traefik.frontend.rule=Host:my-app.docker"
- "traefik.docker.network=proxy"
networks:
- internal
- proxy
environment:
PHP_DEBUGGER: xdebug
#XDEBUG_REMOTE_HOST: <your host IP address>
XDEBUG_REMOTE_PORT: 9000
XDEBUG_REMOTE_AUTOSTART: 1
XDEBUG_REMOTE_CONNECT_BACK: 1
XDEBUG_PROFILER_ENABLE: 1
XDEBUG_PROFILER_ENABLE_TRIGGER: 1000
traefik:
image: traefik
container_name: citizen-game-traefik
command: --web --docker --docker.domain=docker --logLevel=DEBUG
ports:
- "80:80"
- "443:443"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
restart: always
networks:
- internal
- proxy
rabbitmq:
networks:
- internal
- proxy
networks:
proxy:
external:
name: traefik
internal:
编辑2:
@Mostafa
我运行了以下内容:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-app-app
结果是:
172.18.0.7172.19.0.5
直接从浏览器尝试这些会失败“无法访问此站点”。我想这是意料之中的。
我从容器内部运行以下内容:
bash-4.4# supervisorctl status apache:apached
apache:apached RUNNING pid 13575, uptime 0:00:00
按照建议,我使用了ss -plant | grep 80
. 这在容器内不起作用。这是在外部调用时的结果:
[/var/www/html/my-app]$ ss -plant | grep 80
LISTEN 0 80 127.0.0.1:3306 0.0.0.0:*
ESTAB 0 0 192.168.1.88:39360 198.252.206.25:443 users:(("chromium-browse",pid=4203,fd=80))
SYN-SENT 0 1 192.168.1.88:50680 192.241.181.178:443 users:(("chromium-browse",pid=4203,fd=41))
LISTEN 0 128 *:80 *:*
LISTEN 0 128 *:8080 *:*
我不确定它是否能说明很多。我尝试ss
从容器内部安装,apk
但是:
bash-4.4# apk add ss
ERROR: unsatisfiable constraints:
ss (missing):
required by: world[ss]
编辑 3:
这是调用的结果netstat
:
bash-4.4# netstat -plant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 229/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.11:32843 0.0.0.0:* LISTEN -
tcp 0 0 :::22 :::* LISTEN 229/sshd
tcp 0 0 :::9000 :::* LISTEN 225/php-fpm.conf)
bash-4.4# netstat -plant | grep httpd
(nothing)
不过,我不确定这有多大帮助,因为我的另一个有效的项目会产生相同的结果 n bash-4.4# netstat -plant | grep httpd
。但是,如果没有 grep,它会包含更多行。
解决方案
正如您发布的输出描述了80,443,9000
该图像中容器的暴露端口webdevops/php-apache-dev:alpine
然后,您可以直接从浏览器使用其 IP 访问容器。因此,首先您需要从以下方面确保:
- 检查是否
172.18.0.7
是my-app-app
容器的实际 IP,使用以下命令检查正在运行的容器的 IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-app-app
或者只是docker inspect my-app-app
为了获取有关容器的所有信息
- 检查日志
my-app-app
,您可能需要进入容器本身并通过执行以下命令检查 apache 是否实际运行,该supervisorctl
命令将告诉您apache
服务的状态
$ supervisorctl status apache:apached
apache:apached RUNNING pid 72, uptime 0:07:43
如果 apache 运行正常,那么您应该能够使用容器 IP 浏览内容,在我的情况下,它给了我类似的东西,因为我没有实际的应用程序
关于您的问题,traefik
这是Bad Gateway
因为traefik
它本身无法访问您的后端服务,my-app-app
在我们的案例中是容器。您需要确保两者traefik
都my-app-app
在同一个网络中,或者至少它们可以ping通彼此的IP
更新:
而不是ss
图像包含netstat
命令,为了检查 apache 使用的端口,您可以从容器内部执行以下操作:
# netstat -plant | grep httpd
tcp 0 0 :::80 :::* LISTEN 98/httpd
tcp 0 0 :::443 :::* LISTEN 98/httpd
推荐阅读
- python - @user_passes_test 没有按预期工作 - Django Python
- python - 将列表列表转换为元组的元组
- android - 如何在 FirebaseRecyclerAdapter 上获取用户 ID 的价值?
- node.js - 使用 NodeJs 的 SQL 过程
- firebase - Nuxt 服务器中间件在 Firebase Cloud Functions 上不起作用
- javascript - 如何将此代码从 jQuery 转换为 Vanilla Javascipt?
- javascript - 如何使用数组值评估“全有或全无条件”
- postgresql - PostgreSQL 字段类型,用于存储字符串、int 或 json
- reactjs - 为什么 this.state.text 在函数中抛出错误?
- python - 任何东西都可以进入函数吗?