【问题标题】:How to connect dockers with compose, mysql, and golang如何将docker与compose、mysql和golang连接起来
【发布时间】:2018-01-25 23:11:34
【问题描述】:

我有一个我们称之为 mariadb 的数据库 docker,我还有一个使用 golang 的 web docker。我要做的是使用compose连接两个docker,但是在我的golang代码中,我必须提前知道数据库docker的ip地址。

Golang main.go:

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,但有时会发生变化。谢谢!

【问题讨论】:

    标签: mysql docker go docker-compose


    【解决方案1】:

    您可以只使用您的 docker 服务名称数据库,而不是容器 ip

    UPD 您还应该共享端口,例如

    "3306:3306"
    

    或者端口会随机映射

    查看输出

    docker-compose ps
    

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

    【讨论】:

    • 非常感谢您的帮助!
    【解决方案2】:

    您也可以考虑将它们放在一个网络中。这样,您就可以从您的 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"
    

    (代码未测试)

    【讨论】:

      猜你喜欢
      • 2019-11-25
      • 2020-11-09
      • 2020-08-05
      • 2020-09-18
      • 1970-01-01
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      相关资源
      最近更新 更多