如何将Docker中运行的应用部署到Ubuntu服务器并实现域名/IP访问
将Docker应用部署到Ubuntu并通过域名/IP访问的配置步骤
一、Docker容器端口配置
首先确保你的Docker容器正确映射端口到宿主机,且仅允许本地访问(提升安全性):
- 启动容器时使用
-p参数映射端口,例如你的应用在容器内运行在8000端口,执行:
参数说明:docker run -d -p 127.0.0.1:8000:8000 --name my-app --restart always your-image-name127.0.0.1:8000:限制仅宿主机本地能访问该端口,避免直接暴露容器端口到公网--restart always:确保服务器重启后容器自动启动
- 验证容器运行状态:执行
docker ps,确认PORTS列显示127.0.0.1:8000->8000/tcp
二、Apache反向代理配置
1. 启用必要的Apache模块
执行以下命令启用反向代理相关模块:
a2enmod proxy proxy_http proxy_balancer lbmethod_byrequests systemctl restart apache2
2. 配置虚拟主机(域名访问场景)
创建Apache虚拟主机配置文件:
touch /etc/apache2/sites-available/mydomain.com.conf
编辑该文件,添加以下内容:
<VirtualHost *:80> ServerName mydomain.com ServerAlias www.mydomain.com ServerAdmin your-email@example.com # 反向代理到Docker容器映射的端口 ProxyPass / http://127.0.0.1:8000/ ProxyPassReverse / http://127.0.0.1:8000/ # 日志配置(可选) ErrorLog ${APACHE_LOG_DIR}/mydomain.com-error.log CustomLog ${APACHE_LOG_DIR}/mydomain.com-access.log combined </VirtualHost>
启用该虚拟主机并重启Apache:
a2ensite mydomain.com.conf systemctl restart apache2
3. 配置IP访问(无域名场景)
如果直接用服务器IP访问,创建新的虚拟主机配置:
touch /etc/apache2/sites-available/ip-access.conf
添加以下内容:
<VirtualHost *:80> ServerAdmin your-email@example.com ProxyPass / http://127.0.0.1:8000/ ProxyPassReverse / http://127.0.0.1:8000/ ErrorLog ${APACHE_LOG_DIR}/ip-access-error.log CustomLog ${APACHE_LOG_DIR}/ip-access-access.log combined </VirtualHost>
启用并重启Apache:
a2ensite ip-access.conf systemctl restart apache2
三、额外必要配置
1. 域名解析(仅域名访问场景)
在你的域名提供商后台,添加A记录:
- 主机记录:
@(对应mydomain.com)和www(对应www.mydomain.com) - 记录值:服务器的公网IP地址
2. 防火墙设置
开放HTTP(80)和HTTPS(443)端口:
ufw allow 80/tcp ufw allow 443/tcp ufw reload
3. 启用HTTPS(推荐)
使用Certbot申请免费SSL证书并自动配置Apache:
apt install certbot python3-certbot-apache certbot --apache -d mydomain.com -d www.mydomain.com
执行后会自动修改虚拟主机配置,强制HTTPS访问并完成HTTP到HTTPS的301跳转。
四、可选优化:静态文件直接由Apache处理
如果你的应用有静态文件(如CSS、JS、图片),可以让Apache直接托管,减轻容器压力:
在虚拟主机配置中添加:
# 映射静态文件目录 Alias /static /var/www/mydomain/static <Directory /var/www/mydomain/static> Require all granted Options -Indexes </Directory> # 告诉Apache不要代理静态文件路径 ProxyPass /static !
重启Apache生效。
内容的提问来源于stack exchange,提问作者Mirnamiq Abdullayev
相关产品推荐
相关产品推荐

