在工作中我们可能需要数据库和api接口分开部署的情况,如果都用docker-compose部署的话, 在有的操作系统中可能无法使用(ip+端口)连接数据库,必须使用服务名称去连接。 这时我们就需要让这两个docker-compose启动的服务共享网络,这样就可以相互调用服务了
数据库的 compose 文件
我们可以使用 docker network create my_net 创建一个网络,之后每个docker-compose.yml引用即可
也可以先启动数据库服务,最后api服务的docker-compose.yml引用数据库的网络即可,这里我使用这种方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| version: '3' services: db-mysql: image: mysql:5.7 command: --default-authentication-plugin=mysql_native_password restart: always ports: - "3350:3306" container_name: mysql-container networks: - my_net environment: - MYSQL_ROOT_PASSWORD=root
db-mysql: image: redis:5.0.5-alpine command: redis-server --appendonly yes restart: always ports: - "6379:6379" container_name: redis-container networks: - my_net
networks: my_net: driver: bridge
|
- 这里需要指定网络 my_net,指定后网络名称为当前文件夹加上_my_net,如果不指定会使用当前文件夹的名称加上_default
- 查看网络 docker network ls
- 这里我查看的是 app_my_net
服务的 compose 文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| version: '3' services: api: restart: always container_name: web-api build: context: ./web-api # 指定设定上下文根目录,然后以该目录为准指定Dockerfile dockerfile: Dockerfile networks: - app_my_net # 指定网络 ports: - "8001:7001" environment: TZ: Asia/Shanghai
web: image: nginx:1.17.0 privileged: true restart: always container_name: web-front ports: - "8080:80" volumes: - ./web-front/nginx/nginx.conf:/etc/nginx/nginx.conf - ./web-front:/usr/share/nginx/html
networks: app_my_net: external: true # 来自外部
|
- 在使用共享网络后,我们在连接 mysql和redis的使用就可以使用服务名称,db-mysql或db-mysql
如果是用容器名就是 ${容器名}/${容器端口号}
. 比如以上 MySQL 的容器名为 mysql-container
, 端口映射为 3350:3306
, 则在 Java 服务的 yaml 文件中编写如下
1
| jdbc:mysql://mysql-container:3306/DNNAME?useUnicode=true&characterEncoding=utf8
|
参考