不同的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" 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 environment: DB_HOST: mysql8 DB_PORT: XXXXX DB_PASSWORD: ********** networks: app_net: external: true