最近在学习docker,遇到了一个小问题,想了想感觉自己应该记录下。 docker运行或者保持后台很容易了,用上几个参数就好了,可以如果我需要运行一个交互式的程序怎么办呢?

我写了一个简单的dockerfile,把一个socket的服务器端打包成jar,扔到docker里面运行然后输入命令

1
2
docker run -dit -p 9900:9900 hundred666/java7 java -jar /root/Server.jar
#我监听的9900端口,给映射出来啦

出现这个结果

1
2
hundred@hundred:~$ docker run -dit -p 9900:9900 hundred666/java7 java -jar /root/Server.jar
b65e19aaa7321b220853d00180746319c4d5d6cdf2688d259bb27de3841e940f

可是这么一运行,直接返回ID然后就保持后台运行了。 如果不加-d参数呢? 这些确实出现了交互式shell,我也确实可以自己写个client连接上去了。 然后问题来了,我这会宿主这个命令行窗口开着太难受,就想关了,怎么办? ctrl+c或者直接关闭都会直接导致程序退出 docker_it 怎么办呢? 看到官方有个attach,使用-d启动,然后,在使用attach呢? 发现在这个问题上实际效果跟-it一样。 难道就没有解决办法了吗? 终于,在网上百度了好多,加上官方的help文档,发现了一个命令exec,不但可以创建交互式命令,也可以创建后台任务。 在开启这个镜像的时候直接

1
docker run -dit -p 9900:9900 hundred666/java7

然后再开启个任务

1
docker exec -it hundred666/java7 java -jar /root/Server.jar

问题完美解决~