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_网络
    通过
    LAMP
    stack进行管理。当
    up
    打开
    堆栈时,Docker Compose将确保创建此网络。使用此网络的其他堆栈应使用其名称将其声明为
  • 您需要
    版本:'3.5'
    或更高版本才能使用
    网络.name
    配置

嗨,谢谢你的回答!我知道我有两个不同的网络,但是如果我有多个wordpress实例呢?我是否应该将它们附加到相同的
docker compose.yml
?这是一个很好的做法吗?这完全取决于你是否认为他们是一个应用程序。Docker compose提供了一种基本上将多个容器分组为单个应用程序的方法(例如Wordpress、数据库和phpmyadmin)。我个人会确保每个wordpress实例都有自己的数据库,如果db要放在一个容器中,那么每个站点都有一个docker compose文件,其中包含两个容器(db和wordpress)。