如何从Docker容器连接到本地主机和外部数据库

时间:2019-05-27 02:44:11

标签: docker docker-compose

我有两个docker容器nginx和php,我要从中访问在主机上运行的mysql服务器和在远程机上运行的sql服务器。

尝试将网络类型从“网桥”更改为“主机”,但它会返回错误。

version: '2'

services:
    web:
        image: nginx:latest
        ports:
            - "8080:80"
        volumes:
            - /var/www/:/code
            - ./site.conf:/etc/nginx/conf.d/default.conf
        networks:
            - mynetwork
    php:
        image: php:fpm
        volumes:
            - /var/www/:/code
        networks:
           - mynetwork
networks:
    mynetwork:
       driver: bridge

我希望容器中运行的php代码可以连接到这两个数据库。

注意:我不使用docker run运行容器,而是使用docker-compose up -d,所以我只想编辑docker-compose.yml文件。

3 个答案:

答案 0 :(得分:1)

只需确保容器可以通过联机访问外部数据库即可。“ ​​Bridge”和“ host network type”都可以。 首先,您需要确保您具有正确的mysql授予规则,例如%。 1 \您可以使用主机的ip从容器内部访问主机上的mysql。 2 \与主机属于同一LAN的其他mysql实例,也可以使用mysql实例上的LAN ip访问来自容器的访问。 确保ping正常,确保ping正常,否则您的docker安装可能会出现问题,例如iptables中的问题。

答案 1 :(得分:0)

在您的php服务声明中,您必须添加以下内容:

extra_hosts:
      - "local_db:host_ip"

其中local_db是您将在数据库连接字符串中配置的名称,host_ip是您的主机在本地网络上的IP。

您必须确保您的php代码不会尝试连接到“ localhost”,因为这将无法工作。您需要使用服务器名称“ local_db”(在我的示例中)。

您对远程数据库执行相同的操作,只需确保IP可达即可。

您可以删除网络声明,因为它不是必需的。

答案 2 :(得分:0)

为了使Docker容器能够相互访问,您应该将它们链接起来。 docker服务使用链接开关将一个容器的ID和IP添加到另一个容器的/etc/hosts文件中。