我有两个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
文件。
答案 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
文件中。