Php 无法在外部dbgetaddrinfo上连接Wordpress失败:名称或服务未知
我想在Php 无法在外部dbgetaddrinfo上连接Wordpress失败:名称或服务未知,php,wordpress,apache,docker,Php,Wordpress,Apache,Docker,我想在Docker上运行我的Wordpress站点,我想将Wordpress数据库连接到另一个只包含我所有站点数据库的容器 为此,我使用以下docker compose.yml创建了一个LAMP容器: version: "3" services: web: image: webdevops/php-apache:alpine-php7 ports: - "4500:80" volumes: - ./
Docker
上运行我的Wordpress
站点,我想将Wordpress
数据库连接到另一个只包含我所有站点数据库的容器
为此,我使用以下docker compose.yml
创建了一个LAMP
容器:
version: "3"
services:
web:
image: webdevops/php-apache:alpine-php7
ports:
- "4500:80"
volumes:
- ./www:/app
- ./uploads.ini:/opt/docker/etc/php/php.ini
db:
image: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
ports:
- "3306:3306"
phpmyadmin:
image: phpmyadmin/phpmyadmin
environment:
MYSQL_ROOT_PASSWORD: root
ports:
- "8088:80"
如您所见,我已使用webdevops
图像安装了Apache
as服务,这将返回以下内容:
然后,我创建了一个新容器,其中包含Wordpress
实例:
version: '3'
services:
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- ./wp/wp-content:/var/www/html/wp-content
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: lamp_db_1:3306
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: root
volumes:
dbdata:
wp-content:
正如你所见,我安装了wp content
文件夹,因为我已经安装了带有插件和媒体的Wordpress。。。然后,我尝试将此容器连接到lamp\u db\u 1
容器,但当我使用以下命令运行此容器时:
docker-compose up --build
我得到:
MySQL连接错误:(2002)php_网络_getaddresses:getaddrinfo失败:名称或服务未知
我做错了什么
如何将wordpress容器连接到
LAMP
容器?您遇到此问题的原因似乎是因为您有两个独立的服务。一个包含您的灯组,另一个包含您的wordpress图像
当您运行docker compose时,它会为您的应用程序设置一个新的应用程序。因此,您的wordpress图像与您的LAMP堆栈不在同一网络上
您可以将wordpress容器添加到LAMP docker-compose.yml文件中,如
version: "3"
services:
web:
image: webdevops/php-apache:alpine-php7
ports:
- "4500:80"
volumes:
- ./www:/app
- ./uploads.ini:/opt/docker/etc/php/php.ini
db:
image: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
ports:
- "3306:3306"
phpmyadmin:
image: phpmyadmin/phpmyadmin
environment:
MYSQL_ROOT_PASSWORD: root
ports:
- "8088:80"
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- ./wp/wp-content:/var/www/html/wp-content
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: root
volumes:
dbdata:
wp-content:
除非您正在对php apache映像执行特定的操作,否则此时实际上可以删除它
如果不希望所有内容都位于同一docker compose文件中,则可以采用另一种方法,即手动定义网络并让容器加入网络。上的答案显示了如何相当容易地实现这一点。您可以在LAMP
堆栈中指定一个,并让您的Wordpress
堆栈和其他Compose文件中定义的其他容器通过使用Compose中的network.external
参数使用此网络
在同一网络上,您将能够作为主机名加入您的lamp\u db
容器
一个完整的例子:
docker compose.yml
用于LAMP
堆栈:
version: '3.5'
services:
db:
# This will be the hostname for your DB container on the network
container_name: lamp_db
image: mysql
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: root
# Have db container join our db network
networks:
- db_network
# Ensure our custom network is managed by this stack
networks:
db_network:
name: db_network
version: '3.5'
services:
wordpress:
image: wordpress:latest
ports:
- "8000:80"
environment:
# Name of the db container
WORDPRESS_DB_HOST: lamp_db:3306
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: root
# Have wordpress container join our db network
networks:
- db_network
# Declare db_network as external with it's name
# Network won't be created by this stack but must exists before running
# See https://docs.docker.com/compose/compose-file/#external-1
networks:
db_network:
external: true
name: db_network
docker compose.yml
用于Wordpress
堆栈:
version: '3.5'
services:
db:
# This will be the hostname for your DB container on the network
container_name: lamp_db
image: mysql
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: root
# Have db container join our db network
networks:
- db_network
# Ensure our custom network is managed by this stack
networks:
db_network:
name: db_network
version: '3.5'
services:
wordpress:
image: wordpress:latest
ports:
- "8000:80"
environment:
# Name of the db container
WORDPRESS_DB_HOST: lamp_db:3306
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: root
# Have wordpress container join our db network
networks:
- db_network
# Declare db_network as external with it's name
# Network won't be created by this stack but must exists before running
# See https://docs.docker.com/compose/compose-file/#external-1
networks:
db_network:
external: true
name: db_network
以及需要使用我们数据库的任何服务的一般示例:
version: '3.5'
services:
some_container:
image: some-image:latest
# Have this container join our db network
networks:
- db_network
# Note: make sure to reference db container by it's hostname lamp_db
networks:
db_network:
external: true
name: db_network
注:
通过db_网络
stack进行管理。当LAMP
打开up
堆栈时,Docker Compose将确保创建此网络。使用此网络的其他堆栈应使用其名称将其声明为灯
- 您需要
或更高版本才能使用版本:'3.5'
配置网络.name
docker compose.yml
?这是一个很好的做法吗?这完全取决于你是否认为他们是一个应用程序。Docker compose提供了一种基本上将多个容器分组为单个应用程序的方法(例如Wordpress、数据库和phpmyadmin)。我个人会确保每个wordpress实例都有自己的数据库,如果db要放在一个容器中,那么每个站点都有一个docker compose文件,其中包含两个容器(db和wordpress)。