今天在公司部署开发环境的中间件。
目前有三个服务,mongodb nginx yapi,由于是开发环境,为了简单部署所以直接使用了docker容器来部署,并把mongodb的数据目录,nginx配置文件映射到宿主机。
我首先创建了一个volume用来存储mongodb的数据,防止容器被删除后数据丢失
sudo docker volume create mongodbdata
在中用volumes挂载到
/data/db
然后我创建了两个网络
sudo docker network create n-nginx
sudo docker network create n-mongodb
分别作为mongodb的服务网络和nginx转发时可以接触的网络
yapi服务同时加入了这两个网络,这使得它既可以连接内网中的mongodb 又可以被nginx转发到宿主机的端口上对外提供服务
(yapi 不能配置context Path也是一个坑,这个有机会再说)
然后问题来了,我想调试一下我内网中mongodb的数据,但是我的mongodb容器并没有对外开放任何一个端口,但是我是临时想开一个这个外网访问,又不想去改docker-compose。
我查询了一下百度,发现很多人会直接去配置ip-tables来将子网的端口放开,看到那一大堆配置我直接就放弃了,不仅不优雅,也不是临时访问一下这个需求的解决方案。
于是我继续搜索,发现有人提到这个socat,于是我去github主页看了一下,果然它的第二个use case就是我想要实现的效果,于是我就果断了试了一下
sudo docker run --publish 27017:27017 --link mongodb:target --net n-mongodb alpine/socat tcp-listen:27017,fork,reuseaddr tcp-connect:target:27017
用mongodb连接工具试了一下,果然就成功了。
如果加了-d 参数,这个容器可以以守护进程的方式一直运行,可以长期提供服务。不仅仅是一个临时的方案。当然如果是要永远开启,建议还是直接修改容器的启动参数。
另外,一个文件中配置多个外部网络好像有好几种实现方法,我贴一下我的实现方法,这一块我也不是特别明白,但是这样确定可用
services:
network:
- n-mongodb
- n-nginx
networks:
n-mongodb:
external: true
n-nginx:
external: true
复制代码
如果是只连一个外部网络,网上的帖子还有另一种配置,我试了也是可用的
networks:
default:
external:
name: n-nginx
复制代码
参考:
GitHub - alpine-docker/socat: Run socat command in alpine container