在Docker-izing一个nodejs App上工作,我正在尝试设置它,以便它从非标准端口响应,避免已经运行本地Redis容器或服务的团队成员发生潜在冲突。
Redis通常在6379上运行(无论是否为docker或没有)。我想让它听6380.即使我在docker-compose文件中没有它,我想用RethinkDB做同样的事情。
我不想为EITHER Redis或RethinkDB创建新的Dockerfile。
这是我的Docker-Compose文件。
nodejsapp:
image: some-node-container
container_name: nodejsapp
ports:
- "5200:5200" #first number must match CHEAPOTLE_PORT env variable for the cheapotle service
depends_on:
- redis
- rethinkdb
volumes:
- ./:/app
environment:
- NODEJSAPP_PORT=5200 #must match first port number for cheapotle service above.
- REDIS_PORT=6380 #must match first number in redis service ->ports below.
- RETHINKDB_PORT=28016 #must match first number in redis service ->ports below.
redis:
image: redis:3.2-alpine
container_name: redis_cheapotle
ports:
- "6380:6379"
expose:
- "6380" # must match alternate "first" port above to avoid collisions
rethinkdb:
image: rethinkdb
container_name: rethinkdb_cheapotle
ports:
- "28016:28015" #The first number needs to match the RETHINKDB_PORT in environment variables for cheapotle above. You must change both or none, they must always be the same.
- "8090:8080" #this is where you will access the RethinkDB admin. If you have something on 8090, change the port to 8091:8080
expose:
- "28016" # must match alternate "first" port above to avoid collisions
做了几个dockerizations后,我想到这很容易。我会设置我的环境变量,在我的JS文件中使用proces.env.whatever,然后出门到下一个。
错误。
虽然我可以在0.0.0.0:8090到达RethinkDB管理区域(注意 8090备用端口),我的容器都不能互相通话 超过他们指定的端口。
起初我尝试了上面没有YAML的'公开'部分,但是我得到的结果与'曝光'YAML一样。
似乎docker /容器拒绝将进入Host-> Alternate Port的流量转发到Container->标准端口。我做了一些谷歌搜索,并没有在前20分钟找到任何东西所以我想我会发布这个,而我继续我的搜索。
如果我自己在这个过程中找到答案,我会发布答案。
答案 0 :(得分:1)
确定。所以我能够解决这个问题,似乎可能存在一个错误,官方rethinkDB和Redis容器如何处理自正常端口以来的端口转发:" XXXXX:YYYYY" YAML规范被忽略,流量不会从修改后的主机端口发送到标准的docker端口。
解决方案是修改用于启动Redis / RethinkDB容器的命令,以使用命令行端口标志(对于每个系统而言不同)来更改为我的备用端口。
起初我尝试使用环境变量Env文件(但显然在运行时不能立即使用)。我还希望用户能够直接在Docker-Compose文件中查看其堆栈的所有端口/设置,因此上述端口标志解决方案似乎有意义。
我仍然不知道为什么docker不会转发备用主机端口流量 它将成为这两个服务的标准容器端口 转发rethinkDB管理页面的备用主机端口 (8090:8080)。
这是我最终得到的docker-compose文件:
version: "2"
services:
nodejsapp:
image: some-node-container
container_name: cheapotle
ports:
- "5200:5200" #both numbers must match CHEAPOTLE_PORT env variable for the cheapotle service
depends_on:
- redis
- rethinkdb
volumes:
- ./:/app
environment:
- CHEAPOTLE_PORT=5200 #must match cheapotle service ports above.
- RETHINKDB_PORT=28016 #must match rethinkdb service->ports below.
- REDIS_PORT=6380 #must match redis service ->ports below.
- RESQUE_PORT=9292
entrypoint: foreman start -f /app/src/Procfile
redis:
image: redis:3.2-alpine
container_name: redis_cheapotle
ports:
- "6380:6380" #both numbers must match port in command below AND REDIS_PORT cheapotle service variable
command: redis-server --port 6380 #must match above ports AND REDIS_PORT cheapotle service variable
rethinkdb:
image: rethinkdb
container_name: rethinkdb_cheapotle
ports:
- "28016:28016" #The both numbers must match the RETHINKDB_PORT in environment variables for cheapotle above + command below. You must change allor none, they must always be the same.
- "8090:8080" #this is where you will access the RethinkDB admin. If you have something on 8090, change the port to 8091:8080
command: rethinkdb --driver-port 28016 --bind all #must match above ports AND REDIS_PORT cheapotle service variable
可以在此处找到RethinkDB命令行实用程序的文档: https://www.rethinkdb.com/docs/cli-options/虽然可以在此处找到Redis命令行的文档:https://redis.io/topics/config
通过上述内容,我可以在备用端口上启动所有内容,这些端口不会发生冲突,因为团队中的其他开发人员已经在运行rethinkDB和/或Redis。
这不是生产级设置,因此暂时使用风险。显然,RethinkDB需要额外的配置才能允许其他节点在29015以外的其他端口加入集群。
另外!作为任何使用rethinkDB命令行的人之前的警告 flags:用于rethinkDB接受端口更改" - driver-port 28016"必须在" - 绑定所有"之前否则它就好像不是 即使在那里也被忽视了。
答案 1 :(得分:0)
你应该link他们在一起:)
nodejsapp:
.
.
ports:
- "5200:5200"
.
.
links:
- redis
- rethinkdb
redis:
.
.
ports:
- "6380:6379"
expose:
- "6380"
rethinkdb:
.
.
ports:
- "28016:28015"
- "8090:8080"
expose:
- "28016"