Docker部署第二个Django+Apache应用绑定8006端口无法访问求解
问题核心原因梳理
- 基础镜像冲突:你使用
httpd:latest作为基础镜像,该镜像为官方编译的Apache版本,配置路径位于/usr/local/apache2/,但你后续安装的是Debian系的apache2软件包,配置路径为/etc/apache2/,二者路径不匹配导致你修改的Apache配置未被加载。 - 镜像缓存残留:从容器运行状态可以看到
0.0.0.0:8006->80006/tcp的异常映射,说明你启动的是旧缓存版本的镜像,新的配置没有被构建到镜像中。 - 站点未显式启用:你将站点配置放在
/etc/apache2/sites-available/目录下,但没有执行a2ensite命令启用该配置,Apache默认不会加载该目录下的未启用站点。 - 冗余配置:
demo-site.conf中重复写了两次static目录权限配置,属于无效冗余。
认知纠正
你关于端口的认知部分正确:宿主机的同一个端口不能同时绑定多个容器,但每个容器有独立的网络命名空间,所以多个容器内部可以同时监听80端口,只要宿主机映射的外部端口不同即可。你也可以把第二个应用的配置改成容器内监听80、宿主机映射8006:80,和第一个应用的配置逻辑保持一致,反而降低出错概率。
可行解决方案
步骤1:修复Dockerfile
将你的Dockerfile替换为以下内容:
# 改用Ubuntu作为基础镜像,避免Apache路径冲突 FROM ubuntu:22.04 # 禁用apt交互提示 ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update RUN apt-get install -y apt-utils vim curl apache2 apache2-utils RUN apt-get -y install python3 libapache2-mod-wsgi-py3 RUN ln /usr/bin/python3 /usr/bin/python RUN apt-get -y install python3-pip RUN ln /usr/bin/pip3 /usr/bin/pip RUN pip install --upgrade pip RUN pip install django ptvsd # 先禁用默认站点 RUN a2dissite 000-default.conf ADD ./demo_site.conf /etc/apache2/sites-available/000-default.conf # 显式启用你的站点配置 RUN a2ensite 000-default.conf ADD ./GSTDP_Develop /var/www/html/GSTDP_Develop RUN chown -R www-data:www-data /var/www/html/GSTDP_Develop RUN a2enmod wsgi RUN pip install -r /var/www/html/GSTDP_Develop/requirements.txt RUN python /var/www/html/GSTDP_Develop/manage.py collectstatic --noinput EXPOSE 8006 CMD ["apache2ctl", "-D", "FOREGROUND"]
步骤2:修复demo-site.conf
删除重复的static目录配置,修正后的配置如下:
WSGIPythonPath /var/www/html/GSTDP_Develop Listen 8006 <VirtualHost *:8006> ServerAdmin webmaster@localhost DocumentRoot /var/www/html/GSTDP_Develop WSGIApplicationGroup %{GLOBAL} Alias /static /var/www/html/GSTDP_Develop/src/static <Directory /var/www/html/GSTDP_Develop/static> Require all granted </Directory> WSGIScriptAlias / /var/www/html/GSTDP_Develop/src/wsgi.py <Directory /var/www/html/GSTDP_Develop/src> <Files wsgi.py> Require all granted </Files> </Directory> WSGIDaemonProcess GSTDP_Develop processes=2 threads=6 display-name=gst-dna ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
步骤3:清理旧资源重新构建
执行以下命令清理旧的镜像容器,避免缓存影响:
# 停掉旧容器 docker stop sharp_keldysh test-app # 删除旧容器 docker rm sharp_keldysh test-app # 删除旧镜像 docker rmi test-app # 重新构建启动 docker-compose up -d --build
步骤4:验证访问
- 先在宿主机本地测试是否能通:
curl http://127.0.0.1:8006 - 如果本地能访问但外部无法访问,执行以下命令开放防火墙端口:
ufw allow 8006/tcp ufw reload
内容的提问来源于stack exchange,提问作者Nag Arjun
相关产品推荐
相关产品推荐

