今天在公司部署开发环境的中间件。

目前有三个服务,mongodb nginx yapi,由于是开发环境,为了简单部署所以直接使用了docker容器来部署,并把mongodb的数据目录,nginx配置文件映射到宿主机。

我首先创建了一个volume用来存储mongodb的数据,防止容器被删除后数据丢失

sudo docker volume create mongodbdata

docker-compose.yml 中用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 参数,这个容器可以以守护进程的方式一直运行,可以长期提供服务。不仅仅是一个临时的方案。当然如果是要永远开启,建议还是直接修改容器的启动参数。

另外,一个docker-compose.yml文件中配置多个外部网络好像有好几种实现方法,我贴一下我的实现方法,这一块我也不是特别明白,但是这样确定可用

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

分类:
后端
标签: