在工作中我们可能需要数据库和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

参考