Docker SSH 或分离/附加

标签 docker

我有一个docker image正确设置所有必要的工具和环境。但是,我很难在后台运行它。

似乎有两种方法:

(1) 可以将盒子作为守护进程运行,并且每当我想使用该盒子时我都可以附加到它。但是,在我将容器作为守护进程运行后,容器立即退出,代码为零。

$:~/docker/docker_scrapy$ sudo docker run -ti -v ~/docker/docker_scrapy/myvolume:/var/myvolume 3fb9894af1d9 /bin/bash
root@3fc39116a586:/# python -c 'from bs4 import BeautifulSoup'
root@3fc39116a586:/# cd /var/myvolume/
root@3fc39116a586:/var/myvolume# 

$:~/docker/docker_scrapy$ sudo docker run -d -v ~/docker/docker_scrapy/myvolume:/var/myvolume 3fb9894af1d9
c5fab6e6ac02a579e3371aa641b18ca67feb93a9f4f4934b6d083157182fe4e1
$:~/docker/docker_scrapy$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

显然,我可以在交互模式下启动该盒子,但是当我尝试将其作为守护进程运行时,它会在启动后立即以代码 0 退出。我无法附加它,因为我需要启动它。这是否意味着如果镜像处于空闲状态,则无法在守护进程模式下运行该镜像?

(2 )或者将其设置为 SSH 服务器,我可以随时通过 ssh 登录并完成工作。就像 Vagrant up/ssh..

总结:

(1) 我在分离/附加时做错了什么?

(2) 在后台运行 docker 的正确方法是什么?守护进程/ssh

最佳答案

如果您在启动等待输入的服务后给它另一个命令来运行,那么容器将继续运行,直到您附加并退出该命令。我通常在服务启动后让 shell 保持运行状态,这样我就可以进行调试。这是一个简单的例子:

首先让我们创建一个在后台运行的服务

arthur@a:~$ docker run -ti  ubuntu bash
root@5dc7f330b947:/# cat <<'EOF' >start-service.sh
> while true
> do
>   echo service is running >> service.log
>   sleep 10
> done 
> EOF
root@5dc7f330b947:/# chmod +x start-service.sh 
root@5dc7f330b947:/# exit
arthur@a:~$ docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
5dc7f330b947        ubuntu:12.04        bash                50 seconds ago      Exited (0) 3 seconds ago                       jolly_nobel         
arthur@a:~$ docker commit 5dc7f330b947 service/example
4c37b69b129287d79a6fe3916e4293f935194966b1de49d125f1cf8d6ab14f6f

然后我们就可以启动它(我在这里用 & 作为背景。在您的示例中,不需要 &)。请注意,可以同时使用交互和分离选项。

arthur@a:~$ docker run -ti -d service/example  bash -c "./start-service.sh & bash"
b35a5397ea2d29b4085d93ef32270379b09e49118380b0376309bca74fd719d0
arthur@a:~$ docker ps
CONTAINER ID        IMAGE                    COMMAND                CREATED             STATUS              PORTS               NAMES
b35a5397ea2d        service/example:latest   bash -c './start-ser   7 seconds ago       Up 7 seconds                            cranky_wright       

稍后我们可以通过查看日志文件来附加并检查服务:

arthur@a:~$ docker attach b35a5397ea2d

root@b35a5397ea2d:/# cat service.log 
service is running
service is running
service is running
root@b35a5397ea2d:/# 

我不建议在容器内运行 sshd,因为它为攻击者留下了一个对我来说并不完全有用的选项。

关于Docker SSH 或分离/附加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25940862/

相关文章:

mysql - 在入口点脚本中执行后如何清理临时文件?

spring-boot - 如何在单独的Docker容器中配置和运行Eureka Server,微服务(Eureka Client),Zuul?

docker - 在容器之间共享mountnamespce

docker - 经常提交 docker 容器是一种好习惯吗?

r - Pmetrics : declare default fortran compiler before calling PMBuild()

ubuntu - 我可以使用 docker 在当前系统上提供简单的文件覆盖吗?

wordpress - 如何使持久卷在群集之间保持同步?

javascript - 无法复制 nginx/etc/nginx/conf.d/default.conf 中的配置文件

docker - 如何使用docker(分别为docker-in-docker)在Gitlab CI上启动Nginx?

docker - Express session 无法通过Docker在Graphql中持久化 session