我正在对我们当前的旧应用程序进行docker化。我们使用多种服务,但我遇到的问题是 php、apache,特别是 apache 的 https。我使用的是“php:5.6.30-apache”镜像,所以我预装了 php 和 apache。
现在我用以下内容更改了“000-default.conf”:
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot /var/www/html/app/htdocsAdmin
ServerName admin.local.app.io
CustomLog /var/log/apache2/app.admin.access.log "trueip_combined"
ErrorLog /var/log/apache2/app.admin.error.log
<Directory /var/www/html/app/htdocsAdmin>
AllowOverride Options FileInfo AuthConfig
Require all granted
</Directory>
</VirtualHost>
这是我的 docker 文件:
FROM php:5.6.30-apache
MAINTAINER Tzook Bar Noy
ADD default /etc/apache2/sites-available/000-default.conf
RUN apt-get update \
&& apt-get install -y apt-utils \
&& apt-get install -y php5-dev php5-memcached \
&& apt-get install -y memcached
RUN apt-get update && apt-get install -y apt-utils
RUN apt-get install -y libz-dev libmemcached-dev
RUN pecl install memcached-2.2.0
RUN echo extension=memcached.so >> /usr/local/etc/php/conf.d/memcached.ini
RUN a2enmod rewrite
RUN a2enmod ssl
EXPOSE 80
EXPOSE 443
不要介意memcached的东西,只需看看我启用“ssl”并公开端口80,443
这是使用 docker-compose 运行的:
php:
build:
context: ./php
dockerfile: Dockerfile
ports:
- "80:80"
- "443:443"
volumes:
- ./../../:/var/www/html
networks:
- appnet
tty: true
但毕竟,我仍然从 chrome 得到这个:
"ERR_SSL_PROTOCOL_ERROR"
除了启用 ssl 和公开端口 443 之外,您还需要创建一个(自签名)证书 + 私钥并确保 Apache 可以访问这些内容。
我建议使用 openSSL 创建自签名证书:
openssl req -new -newkey rsa:4096 -days 3650 -nodes -x509 -subj \
"/C=../ST=...../L=..../O=..../CN=..." \
-keyout ./ssl.key -out ./ssl.crt
填写您的 2 个字母的国家/地区代码 (/C)、您所在的州或省的名称 (/ST)、您所在地区的名称 (/L)、您所在组织的名称,而不是点 (...) (/O) 和您的服务器 FQDN (/CN)
然后将以下行添加到您的 docker 文件中:
COPY ./path/to/ssl.crt /etc/apache2/ssl/ssl.crt
COPY ./path/to/ssl.key /etc/apache2/ssl/ssl.key
RUN mkdir -p /var/run/apache2/
我不确定最后一行是否真的必要,但在我的 docker 容器中,该文件夹还不存在,导致 Apache 在启动时失败。
最后在 000-default.conf 文件中,您需要添加如下内容:
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/ssl.crt
SSLCertificateKeyFile /etc/apache2/ssl/ssl.key
....
</VirtualHost>
请注意,当您使用自签名证书时,大多数浏览器会警告您“您的连接不安全”(Firefox) 或“证书无效”(Chrome)。这是因为没有到可信 CA 的有效安全链。大多数浏览器允许您继续请求或将该网站添加为例外,以便不再显示警告。
以下是我如何在 Docker 中启用 Apache SSL 进行本地开发。这是 Docker 在 macOS 上运行 Ubuntu 映像的情况(尽管
mkcert
也适用于 Linux 和 Windows):
• 在 macOS 中,安装 mkcert:
brew install mkcert
brew install nss # if you use Firefox
mkcert
可以轻松创建和安装 SSL 证书以供本地开发使用。
• 创建 SSL 证书:
mkcert mysite.localhost someothersite.localhost localhost 127.0.0.1 ::1
这将为您在 macOS 上安装它们,但也会在当前工作目录中保留它们的副本:
mysite.localhost+4-key.pem
mysite.localhost+4.pem
• 使两个
.pem
文件可供您的Docker 容器使用。例如:将它们与容器的配置文件一起移动并添加类似的内容:
- ./config/ssl:/etc/apache2/ssl/
• 打开容器
443
中的端口 docker-compose
:
- "443:443"
(你当然也应该在图像中
EXPOSE 443
,尽管出于某种原因它对我有用,但没有这样做。)(编辑:EXPOSE纯粹是文档,并且根据文档不执行任何操作)
• 在 Apache 中启用 SSL:
RUN ln -s /etc/apache2/mods-available/ssl.load /etc/apache2/mods-enabled/ssl.load
不过,从技术上讲,我首先在运行的容器中执行此操作,然后是
apachectl restart
。使测试变得更容易,并确保在提交重建图像之前一切正常。
• 在 Apache 中配置您的网站,以便通过编辑 mysite.localhost
以及您想要使用 SSL 的任何其他域来使用 SSL:
<VirtualHost *:443>
…
SSLEngine on
SSLCertificateFile "/etc/apache2/ssl/clickandspeak.localhost+4.pem"
SSLCertificateKeyFile "/etc/apache2/ssl/clickandspeak.localhost+4-key.pem"
…
</VirtualHost>
…只需复制
<VirtualHost *:80>
中的旧配置,将端口更改为
443
,然后添加上面的三行即可。根据需要重建镜像并重启容器。
…瞧!
将以下内容添加到您的 Dockerfile 中:
# Enable SSL
RUN set -eux; \
apt-get update; \
apt-get install ssl-cert; \
a2enmod ssl; \
a2ensite default-ssl