如何将dockers与compose、mysql和golang连接起来

9q78igpj  于 2022-11-21  发布在  Mysql
关注(0)|答案(3)|浏览(158)

我有一个数据库对接器,我们将称之为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,但有时会发生变化。谢谢!

xdnvmnnf

xdnvmnnf1#

您可以只使用您的Docker服务名称database,而不是容器ip
UPD您还应该共享以下端口

"3306:3306"

或端口将随机Map
请参阅输出

docker-compose ps

UPD2根据mysql docker image doc还需要定义更多的环境变量,例如MYSQL_DATABASE

niwlg2el

niwlg2el2#

你也可以考虑把它们放在一个网络中。这样你就可以从你的web容器访问database:3306上的数据库。这种方法的优点是数据库不会暴露给外界(你的本地机器),只有mynet网络上的容器才能看到它。

version: '3'

services:
  web:
    image: web_docker
    ports:
      - 8080:8080
    depends_on:
      - database
    networks:
      - mynet

  database:
    image: mariadb
    environment:
      - MYSQL_ROOT_PASSWORD=password
    volumes:
      - /data:/var/lib/mysql
    networks:
      - mynet
 networks:
   mynet:
     driver: "bridge"

(code未测试)

lstz6jyr

lstz6jyr3#

没有 必要 添加 默认 情况 下 由 Docker 处理 的 网络 。

version: '3.9'
services:
    api:
        container_name: webapi
        build:
            context: .
            dockerfile: Dockerfile
        restart: unless-stopped
        depends_on:
            - mariadb
        ports:
            - 8080:8080
    mariadb:
        image: mariadb
        container_name: mariadb
        restart: unless-stopped
        environment:
            - ROOT_PASSWORD=xxxx
            - MYSQL_USER=user
            - MYSQL_PASSWORD=xxxx
            - MYSQL_DATABASE=dbname
        volumes:
            - database:/var/lib/mysql
        ports:
            - 3306:3306

中 的 每 一 个
这样 你 就 可以 使用 mariadb , dockeriptable 就 像 一 个 DNS 服务 器 一样 。 所以 , 在 go 中 用 container_name 替换 ipport , 如下 所 示 :

func main() {
    ...
    dsn := "user:xxxx@tcp(mariadb)/dbname?charset=utf8"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

    if err != nil {
        panic(err)
    }
    ...
}

格式

相关问题