我目前正在将wordpress应用进行容器化以进行开发。到目前为止,一切进展顺利:)
目前,我每个应用使用一个docker-compose.yml文件(和一些配置)。每个应用程序都由一个nginx网络服务器,一个数据库和带有fpm的wordpress组成。 (下面的示例docker-compose.yml)。每个应用程序都自己处理ssl,我已经确认它可以正常工作。
我的总体规划的下一步是使用nginx反向代理来同时启动所有应用程序容器,而无需使用主机上的其他端口。
据我了解,jwilder/nginx-proxy是工作的最佳工具。所以我在想-如果不是最佳实践,请纠正我-我可以为nginx-proxy创建一个compose.yml文件,该文件可以一直运行,并且在自动生成端口时将端口80和443暴露给主机之后我为每个容器旋转的nginx-configs。
version: '3.6'
services:
nginx-proxy:
image: jwilder/nginx-proxy
container_name: nginx_proxy
ports:
- '80:80'
- '443:443'
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
networks:
default:
external:
name: nginx-proxy
我尝试使用nginx-proxy将端口80暴露给主机,并使用mariadb:latest和wordpress:latest图像在其自己的docker-compose.yml文件中安装了wordpress应用程序。确实确实如此,只需添加暴露值:\ -80和VIRTUAL_HOST环境变量即可。
但是我在前面提到的wordpress应用之前还不太了解如何使用反向代理。该文档指出:
SSL后端
如果您希望反向代理使用HTTPS而不是HTTP连接到后端,请在后端容器上设置VIRTUAL_PROTO = https。
注意:如果使用VIRTUAL_PROTO = https并且后端容器公开端口80和443,则nginx-proxy将在端口80上使用HTTPS。这几乎肯定不是您想要的,因此您还应该包括VIRTUAL_PORT = 443。 / p>
所以我尝试将这些环境变量添加到应用程序的docker-compose.yml文件中。特别是在内部的nginx服务上,并添加了公开的端口80和443。
version: '3.6'
services:
wordpress:
image: wordpress:4.7.2-php7.1-fpm
volumes:
- ../public:/var/www/html
environment:
- WORDPRESS_DB_NAME=${WORDPRESS_DB_NAME:-wordpress}
- WORDPRESS_TABLE_PREFIX=${WORDPRESS_TABLE_PREFIX:-wp_}
- WORDPRESS_DB_HOST=${WORDPRESS_DB_HOST:-mysql}
- WORDPRESS_DB_USER=${WORDPRESS_DB_USER:-root}
- WORDPRESS_DB_PASSWORD=${WORDPRESS_DB_PASSWORD:-password}
depends_on:
- db
restart: always
db:
image: mariadb:${MARIADB_VERSION:-latest}
volumes:
- tss-data:/var/lib/mysql
# - ./db:/docker-entrypoint-initdb.d/
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-password}
- MYSQL_USER=${MYSQL_USER:-root}
- MYSQL_PASSWORD=${MYSQL_PASSWORD:-password}
- MYSQL_DATABASE=${MYSQL_DATABASE:-wordpress}
restart: always
nginx:
image: nginx:${NGINX_VERSION:-latest}
container_name: nginx
volumes:
- ${NGINX_CONF_DIR:-./nginx}:/etc/nginx/conf.d
- ${NGINX_LOG_DIR:-./logs/nginx}:/var/log/nginx
- ${WORDPRESS_DATA_DIR:-./wordpress}:/var/www/html
- ${SSL_CERTS_DIR:-./certs}:/etc/letsencrypt
- ${SSL_CERTS_DATA_DIR:-./certs-data}:/data/letsencrypt
environment:
- VIRTUAL_HOST:local.my-app.com
- VIRTUAL_PROTO:https
- VIRTUAL_PORT:443
expose:
- 80
- 443
depends_on:
- wordpress
restart: always
volumes:
tss-data:
networks:
default:
external:
name: nginx-proxy
A,如果我尝试通过端口80浏览至local.my-app.com, 503服务暂时不可用
如果我尝试使用端口443,nginx反向代理完全不响应。我觉得我似乎遗漏了一些明显的东西,但似乎找不到,我对此表示感谢。
答案 0 :(得分:0)
最后,我选择不处理每个应用程序中的SSL加密。但是相反,我将反向代理更改为
version: '3.6'
services:
nginx-proxy:
image: jwilder/nginx-proxy:alpine
container_name: nginx_proxy
ports:
- '80:80'
- '443:443'
volumes:
- ./certs:/etc/nginx/certs
- /var/run/docker.sock:/tmp/docker.sock:ro
restart: unless-stopped
networks:
default:
external:
name: nginx-proxy
现在,我可以在端口80上访问每个应用程序,直到为其添加证书为止,在这种情况下,它可以在端口443上访问。