跨 docker-compose.yml 配置的 Docker 容器的网络互通
Docker
技术
背景
一个服务器上分别用单独的 docker-compose.yml
配置了两个单机网站项目
- 网站项目(有 nginx、php-fpm、MySQL 等容器)
- caddy 反向代理
现在希望 caddy 的容器可以反向代理到项目1里面的 nginx 上,这就涉及到了容器网络互通的问题。
原配置
项目1的配置:
version: "3.6"
services:
nginx:
image: nginx:latest
build: ./nginx
container_name: site-nginx
restart: always
ports:
- 8080:80
- 8443:443
volumes:
- ./logs:/var/log/nginx
- ./nginx/nginx-conf/docker-nginx.conf:/etc/nginx/nginx.conf
- ./wwwroot:/wwwroot
- ./.well-known:/wwwroot/.well-known
项目2的配置:
version: '3'
services:
caddy:
image: abiosoft/caddy
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/Caddyfile
- ./.caddy:/root/.caddy
- ./wwwroot:/srv
- ./logs:/opt/logs
restart: always
environment:
- ACME_AGREE=true
- TZ=Asia/Shanghai
一波操作
Docker Compose 文档 提到 Docker Compose 在不同配置文件的容器默认会用不同的 network,所以目标是让他们容器都绑定到同一个 network 上。
一番寻找发现了 network 和 external 配置,所以剩下要做的事情就是:
- 创建一个单独的网络(这里起名
frontend
)
sudo docker network create frontend
- 两个项目的 docker-compose.yml 文件的所有容器的网络都指定到刚创建的网络,并标记为 external
项目1:
version: "3.6"
services:
nginx:
image: nginx:latest
build: ./nginx
container_name: site-nginx
restart: always
ports:
- 8080:80
- 8443:443
volumes:
- ./logs:/var/log/nginx
- ./nginx/nginx-conf/docker-nginx.conf:/etc/nginx/nginx.conf
- ./wwwroot:/wwwroot
- ./.well-known:/wwwroot/.well-known
networks:
- frontend
networks:
frontend:
external: true
项目2:
version: '3'
services:
caddy:
image: abiosoft/caddy
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/Caddyfile
- ./.caddy:/root/.caddy
- ./wwwroot:/srv
- ./logs:/opt/logs
restart: always
environment:
- ACME_AGREE=true
- TZ=Asia/Shanghai
networks:
- frontend
networks:
frontend:
external: true
-
分别
docker-compose up -d
重建容器 -
Caddyfile 配置文件里面指定服务名即可访问容器(Docker 会自动将容器 IP 绑定到对应的 host,用这个 host 访问即可)
abcde.cn {
gzip
log /opt/logs/access.log
tls example@gmail.com
proxy / http://nginx
}
简单总结
docker-compose
只是一个编排工具,相当于用配置文件描述了 docker 的命令何时执行docker-compose
在不指定 network 的配置下,会创建一个单独的 network 作为项目涉及到所有的容器的默认网络- 用
external: true
配置可以指定容器使用外部已有的网络
Docker 容器的网络的工作细节还待探索。
社区也发了一份:https://0xffff.one/d/1017