Docker创建容器后退出无法重新连接,docker attach使用遇阻求助
我来帮你理清这里的问题,以及对应的解决办法:
为什么你现在连不上容器?
首先,你用docker run -ti ubuntu /bin/bash启动容器时,这个容器的主进程就是/bin/bash。当你在容器里执行exit或者按Ctrl+D退出bash时,这个主进程就结束了,Docker容器会随之停止运行。这时候你用docker ps是看不到它的,得用docker ps -a才能找到这个已停止的容器。
另外,默认的Ubuntu Docker镜像里是没有安装SSH服务的,所以你尝试用SSH连接肯定行不通——容器里根本没跑SSH服务进程。
正确的重新连接方式(推荐)
1. 重启已停止的容器并进入
首先找到你停止的容器:
docker ps -a
你会看到之前的0e37da213a37容器状态是Exited。
先启动这个容器:
docker start 0e37da213a37
然后用docker exec命令进入容器(这是Docker官方推荐的方式,因为它会在容器里启动一个新的bash进程,不会影响容器的主进程):
docker exec -ti 0e37da213a37 /bin/bash
这次你再退出bash(exit或Ctrl+D),容器依然会保持运行状态,下次可以直接用同样的docker exec命令进入。
2. 启动容器时让它后台运行,避免退出就停止
如果你希望容器启动后一直运行,不用每次都重启,可以在启动时加上-d参数(后台模式):
docker run -dti ubuntu /bin/bash
这里的-d让容器在后台运行,-t分配伪终端,-i保持标准输入打开。之后你随时可以用docker exec进入容器。
关于docker attach的问题
docker attach是用来连接到容器的主进程的,但有个坑:如果你用Ctrl+D退出attach,主进程会结束,容器就停了。如果想从attach里退出但保持容器运行,应该按Ctrl+P然后Ctrl+Q来 detach。
不过还是更推荐用docker exec,因为它更灵活,不会因为退出操作导致容器停止。
不推荐:用SSH连接容器
虽然可以通过安装SSH服务来实现SSH连接,但这不符合Docker的最佳实践(Docker提倡一个容器只运行一个主进程,SSH会额外增加复杂度)。如果非要试,步骤如下:
- 进入容器后安装SSH服务:
apt update && apt install -y openssh-server - 设置root密码:
passwd root - 启动SSH服务:
service ssh start - 退出容器后,重新启动并映射端口(比如把容器的22端口映射到主机的2222端口):
docker run -d -p 2222:22 0e37da213a37 - 然后从主机SSH连接:
ssh root@localhost -p 2222
但再次强调,这种方式没必要,用Docker自带的exec或attach足够日常操作容器。
内容的提问来源于stack exchange,提问作者user9518022

