不同的docker-compose之间的网络通信

不同的docker-compose之间的网络是不互通的,

1. 背景说明

Docker Compose是一个用来定义和运行复杂应用的Docker工具。
Compose 通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。

可以简单的认为一个docker-compose.yml文件,就是一整套docker的运行环境,多个docker-compose.yml之间的网络默认是不互通的。

举个简单的列子:
A:

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
version: "3"

services:
server:
image: gitea/gitea:1.19.0
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=mysql
- GITEA__database__HOST=db:3306
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=gitea
restart: always
networks:
- gitea
volumes:
- ./gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "222:22"
depends_on:
- db

db:
image: mysql:8
restart: always
environment:
- MYSQL_ROOT_PASSWORD=gitea
- MYSQL_USER=gitea
- MYSQL_PASSWORD=gitea
- MYSQL_DATABASE=gitea
networks:
- gitea
volumes:
- ./mysql:/var/lib/mysql


networks:
gitea:

B:

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
29
30
31
32
33
34
35
36
37
38
39
40
41
version: "3"

services:
webstack:
image: arvon2014/webstack-laravel:v1.2.2
container_name: my_navigation_website
ports:
- "XXXXX:8000"
volumes:
- /etc/navigation_website
networks:
- webstack_network
environment:
DB_HOST: ***.***.***.***
DB_PORT: XXXXX
DB_PASSWORD: **********
depends_on:
- mysql

mysql:
image: mysql:5.6
container_name: navigation_website_mysql
environment:
MYSQL_ROOT_PASSWORD: **************
MYSQL_ALLOW_WMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'XXXXXXXX'
MYSQL_USER: 'XXXXXXX'
MYSQL_PASSWORD: *******************
ports:
- "XXXXX:3306"
volumes:
- /app/mysql/db:/var/libmysql
- /app/mysql/conf/my.cnf:/etc/my.cnf
- /app/mysql/init:/docker-entrypoint-initdb.d
networks:
- webstack_network


networks:
webstack_network:

A和B两个docker-compose.yml中都有mysql的容器在运行,相当于是同时安装了2个mysql。这在某种程度上来说是没必要的,完全可以使用同一个mysql,在里面创建不同的数据库和用户即可。

默认情况下A和B网络是不通的,可以通过以下配置,让其处于一个网络中。

A:

同层目录下创建一个 .env

1
2
3
[root@zmr-service mysql]# cat .env
COMPOSE_PROJECT_NAME=app

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
29
version: '3'

services:
mysql8:
image: mysql/mysql-server:8.0.32
restart: always
container_name: "mysql8"
# ports:
# - 3306:3306
environment:
MYSQL_ROOT_PASSWORD: 12345678
MYSQL_DATABASE: gitea
MYSQL_USER: gitea
MYSQL_PASSWORD: 12345678
LC_ALL: "en_US.UTF-8"
TZ: "Asia/Shanghai"
volumes:
- "/opt/docker-data/mysql/datadir:/var/lib/mysql"
- "/opt/docker-data/mysql/init:/docker-entrypoint-initdb.dl"
command: --default-authentication-plugin=mysql_native_password
networks:
- net
....
....


networks:
net:
driver: bridge

运行起来后,看一下网络情况

1
2
3
4
5
6
[root@zmr-service mysql]# docker network ls
NETWORK ID NAME DRIVER SCOPE
391b4ed84d89 app_net bridge local ----这个就是上面A创建出来的网桥
31d18700914d bridge bridge local
e976eb0945b9 host host local
fa4d4514eb40 none null local

B

在B的docker-compose.yml中继承A的网桥

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
version: "3"

services:
webstack:
image: arvon2014/webstack-laravel:v1.2.2
container_name: my_navigation_website
ports:
- "XXXXX:8000"
volumes:
- /etc/navigation_website
networks:
- app_net # ---这里直接使用 A 创建出来的网桥
environment:
DB_HOST: mysql8 # ---- 这里是可以直接填写 mysql在A中的service名称
DB_PORT: XXXXX
DB_PASSWORD: **********


networks:
app_net: # ----这里直接使用 A 创建出来的网桥
external: true