我有一个数据库对接器,我们将称之为mariadb,我也有一个使用golang的web对接器,我试图做的是使用compose连接这两个对接器,但在我的golang代码中,我必须提前知道数据库对接器的ip地址。
戈朗主星,出发:
db, err := sql.Open("mysql",
"root:passsword@tcp(<should_be_database_docker_ip>:3306)/database")
Docker-compose.yml
version: '3'
services:
web:
image: web_docker
ports:
- "8080"
depends_on:
- database
database:
image: mariadb
ports:
- "3306"
environment:
- MYSQL_ROOT_PASSWORD=password
volumes:
- /data:/var/lib/mysql
再次澄清一下,我不能简单地将主机设置为localhost,因为我使用的数据库在docker中,通常是172.17.0.2或.3,但有时会发生变化。谢谢!
3条答案
按热度按时间xdnvmnnf1#
您可以只使用您的Docker服务名称database,而不是容器ip
UPD您还应该共享以下端口
或端口将随机Map
请参阅输出
UPD2根据mysql docker image doc还需要定义更多的环境变量,例如MYSQL_DATABASE
niwlg2el2#
你也可以考虑把它们放在一个网络中。这样你就可以从你的web容器访问database:3306上的数据库。这种方法的优点是数据库不会暴露给外界(你的本地机器),只有mynet网络上的容器才能看到它。
(code未测试)
lstz6jyr3#
没有 必要 添加 默认 情况 下 由 Docker 处理 的 网络 。
中 的 每 一 个
这样 你 就 可以 使用
mariadb
, dockeriptable 就 像 一 个 DNS 服务 器 一样 。 所以 , 在 go 中 用container_name
替换ip
和port
, 如下 所 示 :格式