別のコンテナにあるdbに接続したい


別のコンテナにあるdbに接続したい場合。
(別のDocker Composeファイル(.ymlファイル) で設定しているコンテナに接続したい場合)

apple-apiからcarot_dbに接続したい

元yamlファイル

apple/docker-compose.yaml

version: "3"

services:
  db:
    build:
      context: "."
      dockerfile: ./orange/Dockerfile
    container_name: orange-mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: apple
      MYSQL_USER: iphone
      MYSQL_PASSWORD: iphonese
      TZ: 'Asia/Tokyo'
    volumes:
      - ./db/data:/var/lib/mysql
    ports:
      - 3306:3306
    networks:
      - apple_net

  api:
    build:
      context: "."
      dockerfile: ./apple/Dockerfile
    container_name: apple-api
    volumes:
      - "../app:/go/src"
    ports:
      - "8080:8080"
    tty: true
    networks:
      - apple_net

networks:
  apple_net:
    driver: bridge

carot/docker-compose.yaml

version: '3.6'
services:
  mysql:
    image: mysql:5.7
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
    container_name: "carot_db"
    hostname: "carot_db"
    ports:
      - "3316:3306"
    volumes:
      - "./hoge:/hoga"
      - "./ugo:/uga"
    environment:
      MYSQL_ROOT_PASSWORD: password
      TZ: Asia/Tokyo

apple/docker-compose.yamlを修正

version: "3"

services:
  db:
    build:
      context: "."
      dockerfile: ./orange/Dockerfile
    container_name: orange-mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: apple
      MYSQL_USER: iphone
      MYSQL_PASSWORD: iphonese
      TZ: 'Asia/Tokyo'
    volumes:
      - ./db/data:/var/lib/mysql
    ports:
      - 3306:3306
    networks:
      - apple_net

  api:
    build:
      context: "."
      dockerfile: ./apple/Dockerfile
    container_name: apple-api
    volumes:
      - "../app:/go/src"
    ports:
      - "8080:8080"
    tty: true
    networks:
      - apple_net
      - carot_db_default

networks:
  apple_net:
    driver: bridge
  carot_db_default:
    external: true

参照
https://docs.docker.jp/compose/compose-file.html#id63

carot_db_defaultはどこから来た??

carot/docker-compose.yamlではnetworksの設定をしていないので
確認する必要があった。

docker network ls 
NETWORK ID     NAME                    DRIVER    SCOPE
7beb35729a36   bridge                  bridge    local
5356019c2b25   carot_db_default        bridge    local
030857de59a3   docker_container-link   bridge    local
5c490e6b8809   docker_apple_net        bridge    local
b32dc86cede2   host                    host      local
207b881e58ds   none                    null      local

docker network ls で出た結果一覧を上から
docker inspectで確認。

docker inspect carot_db_default
略
"Containers": {
    "9aa972e700a3faff897177dd9ce8f4df2a7b929984f87afcd8faf13edbd93e2b": {
        "Name": "carot_db",
        "EndpointID": "a671f5a445611fd21b3699a33d2012c829b2ed4f337d209c406423fea9a68545",
        "MacAddress": "02:42:ac:14:00:03",
        "IPv4Address": "172.20.0.3/16",
        "IPv6Address": ""
    },
},
略

コンテナ名を確認できた。
carot_dbはcarot_db_defaultネットワークを使用している事が
わかった為apple/docker-compose.yamlに記述している。

external: true

networksの設定だけで(external: true無しで)docker-composeを起動すると
そんなnetworkはないというエラーが出てしまうので
外部のものを使用します、ということでexternal: trueが設定されるらしい。