我使用 docker-compose(和 nginx-proxy)运行多个 WordPress 网站。因此,我可以对我使用的每个网站使用相同的 docker-compose 文件 .env。我希望每个 MariaDB 容器使用不同的端口(因为它们共享相同的外部 docker 网络)。
我有下面的撰写文件,但是当我打开它时,我得到了。
MySQL Connection Error: (2002) Connection refused
以前,我使用相同的撰写文件,但没有使用 ports: 部分,而是在 WordPress 部分中对端口进行了硬编码,这样就可以了。
我哪里做错了?
docker-compose.yml
version: '3'
services:
db:
image: mariadb
container_name: ${DB_CONTAINER}
hostname: ${DB_CONTAINER}
ports:
- ${DB_PORT}:3306
volumes:
- ./db:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: ${DB_WP_PASSWORD}
wordpress:
depends_on:
- db
image: wordpress:latest
restart: always
container_name: ${WP_CONTAINER}
hostname: ${WP_CONTAINER}
volumes:
- ./html:/var/www/html
expose:
- 80
restart: always
environment:
VIRTUAL_HOST: ${DOMAINS}
LETSENCRYPT_HOST: ${DOMAINS}
LETSENCRYPT_EMAIL: ${EMAIL}
WORDPRESS_DB_HOST: db:${DB_PORT}
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: ${DB_WP_PASSWORD}
networks:
default:
external:
name: nginx-proxy
.env
DB_CONTAINER=test_click_db
WP_CONTAINER=test_click_wp
DB_PORT=13306
[email protected]
DOMAINS=test.click.tvpp.tv
DB_ROOT_PASSWORD=aabbcc
DB_WP_PASSWORD=xxyyzz
答案1
实际上,我发现数据库服务需要在环境中添加以下内容:
MYSQL_TCP_PORT: ${DB_PORT}
MYSQL_UNIX_PORT: ${DB_PORT}
答案2
这行
WORDPRESS_DB_HOST: db:${DB_PORT}
应改为
WORDPRESS_DB_HOST: db:3306
(我猜这实际上是你之前做的)然后 wordpress 容器将直接连接到端口 3306 上的 mariadb 容器容器的。该db
部分由docker网络的内部DNS服务器解析为你的mariadb容器的IP地址。
你不需要这个部分
ports:
- ${DB_PORT}:3306
这意味着docker将${DB_PORT}
映射您的主机到服务(容器)中的端口 3306,因此您也可以通过连接到端口 的主机来访问数据库${DB_PORT}
。这通常仅适用于您打算从主机外部连接到容器的情况。