我正在开发一个用C ++编写的游戏服务器。我有它工作,但想把它放入容器。容器化变体也在起作用,但是,它有一些方面似乎很脆弱。
请注意,这是我第一次涉足Docker,所以我确信在谈到Docker的方式时我会非常沮丧。
我做过一堆阅读和实验,但还没有确定我想做的事情是否可行。
我的理想化状态是使用scratch
作为我的基本图像。我有一个正在运行的版本。这个Dockerfile看起来大致如下
FROM scratch
COPY ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2
COPY libc.so.6 /lib/x86_64-linux-gnu/libc.so.6
COPY libdl.so.2 /lib/x86_64-linux-gnu/libdl.so.2
COPY libgcc_s.so.1 /lib/x86_64-linux-gnu/libgcc_s.so.1
COPY libm.so.6 /lib/x86_64-linux-gnu/libm.so.6
COPY libnss_dns.so.2 /lib/x86_64-linux-gnu/libnss_dns.so.2
COPY libnss_files.so.2 /lib/x86_64-linux-gnu/libnss_files.so.2
COPY libpthread.so.0 /lib/x86_64-linux-gnu/libpthread.so.0
COPY libstdc++.so.6 /usr/lib/x86_64-linux-gnu/libstdc++.so.6
COPY group /etc/group
COPY passwd /etc/passwd
COPY nsswitch.conf /etc/nsswitch.conf
COPY jks-server /root/jks-server
EXPOSE 8383
CMD [ "/root/jks-server/bin/jks-server", "--db_host=172.17.0.1", "--db_port=3307", "--host=172.17.0.3", "--resources_dir=/root/jks-server", "--env=testy" ]
其中
--host=172.17.03
告诉服务器要监听哪个地址。
对我来说,问题是硬编码的地址。特别是172.17.0.3,它是容器的IP地址。根据我的理解,这个地址可能会根据我的运行情况而改变。
理想情况下,我喜欢做类似的事情:
CMD /root/jks-server/bin/jks-server --db_host=172.17.0.1 --db_port=3307 --host=`hostname -i` --resources_dir=/root/jks-server --env=testy
如果我使用ubuntu:16.04作为基本图像,这是有效的。但是,图像尺寸也要大得多。
有没有办法让我得到容器的IP地址惠斯特仍能使用划痕?或者它是硬编码中心?
我知道我能做的另一个选择是听一切(0.0.0.0),但如果我不需要,我真的不想这样做。最初我认为它不会那么糟糕,因为我可以通过-p
上的端口标志(docker run
)定义入站IP地址。
例如,当绑定到0.0.0.0(--host=0.0.0.0
)时,我可以将容器作为
sudo docker run --rm --name jks-server-runtime -p 192.168.1.11:8383:8383 -d jks-server-runtime
在这种情况下,192.168.1.11是我当前在本地网络上为此特定测试服务器指定的静态IP。
如果我的技术很糟糕,请告诉我。我在这里学习。
谢谢!
答案 0 :(得分:0)
只要您在--net=bridge
模式下运行图像(我认为是默认值),如果容器(图像运行时)绑定到localhost
,您可以转发容器端口{{ 1}}到运行时参数3307
的主机端口3307
,一切都应该不错......