Skip to content

相同主机上不同docker-compose服务之间通信

背景

目前手头自建服务器的服务都是容器化的,使用docker-compose,基本能满足需求。但最近发现个问题,多个服务都有mysql数据库,都有nginx接入服务。因为目前的服务性质决定了性能绝对是过剩的。所以将mysql服务容器、nginx服务器、拆出来,多个服务共用。

问题

拆出服务后,将mysql服务单独一个docker-compose配置启动后,其他服务可以通过mysql服务所在vps的域名+端口访问mysql服务。但此时原先大量原先本地流量就变成了公网流量,nginx服务也是同样的问题。如果是gcp之类的大厂,应该可以放在同一个vpc内,避免之类费用。但手上杂牌vps并不具备这样的条件。流量浪费了一倍也是钱呀,怎么办?

解决方案

将较大网络流量的业务服务和mysql放在同一个vps上。在业务服务中添加mysql的docker network。

mysql服务的docker-compose.yml

version: '3.5'
services:
  db:
    image: mysql:8.0
    restart: always
    container_name: mysql
    environment:
      MYSQL_DATABASE: your-db-name
      MYSQL_ROOT_PASSWORD: yourpass
    ports:
      - 3306:3306
    volumes:
      - my-db:/var/lib/mysql
      - ./config-file.cnf:/etc/mysql/conf.d/config-file.cnf
volumes:
  my-db:
user@machine ~ # docker network ls
NETWORK ID     NAME                     DRIVER    SCOPE
6d3f9fbd7df1   mysql_default            bridge    local

在使用到mysql的服务的docker-compose.yml上添加对应的配置

version: "3.5"
  
networks:
  net_default:
  mysql_default:
    external: true
...
services:
  web:
    container_name: web
    restart: always
    image: some-web-image
    environment:
      MYSQL_PASSWORD: yourpass
      MYSQL_HOST: mysql
      MYSQL_PORT: 3306
      DJANGO_ENV: production
      TZ: Asia/Shanghai
      REDIS_HOST: redis
    volumes:
      - .:/usr/src/app
    depends_on:
      - redis
    networks:
      - net_default
      - mysql_default
    ports:
      - 8080:8080
    working_dir: /usr/src/app
    command: uwsgi uwsgi.ini

参考

https://docs.docker.com/compose/networking/

Published in技术

Be First to Comment

Leave a Reply

Your email address will not be published. Required fields are marked *