相关疑难解决方法(0)

是否可以在正在运行的容器中启动shell会话(没有ssh)

我天真地期望这个命令在一个正在运行的容器中运行一个bash shell:

docker run "id of running container" /bin/bash
Run Code Online (Sandbox Code Playgroud)

它看起来不可能,我得到错误:

2013/07/27 20:00:24 Internal server error: 404 trying to fetch remote history for 27d757283842
Run Code Online (Sandbox Code Playgroud)

所以,如果我想在一个正在运行的容器中运行bash shell(例如用于诊断目的)

我必须在其中运行SSH服务器并通过ssh登录吗?

docker

335
推荐指数
6
解决办法
23万
查看次数

在docker容器中自动运行服务

我正在设置一个简单的图像:一个保存Riak(一个NoSQL数据库).该图像riak start作为CMD 启动Riak服务.现在,如果我将它作为守护进程运行docker run -d quintenk/riak-dev,它确实启动了Riak进程(我可以在日志中看到它).但是,它会在几秒钟后自动关闭.如果我使用docker run -i -t quintenk/riak-dev /bin/bashriak进程运行它没有启动(更新:请参阅答案以获得解释).事实上,根本没有服务运行.我可以使用终端手动启动它,但我希望Riak自动启动.我认为其他服务也会出现这种情况,Riak只是一个例子.

因此,运行/重新启动容器应该会自动启动Riak.设置它的正确方法是什么?


作为参考,这里是用于创建图像的Dockerfile(更新:使用所选答案进行更改):

FROM ubuntu:12.04
RUN apt-get update
RUN apt-get install -y openssh-server curl 
RUN curl http://apt.basho.com/gpg/basho.apt.key | apt-key add -
RUN bash -c "echo deb http://apt.basho.com precise main > /etc/apt/sources.list.d/basho.list"
RUN apt-get update
RUN apt-get -y install riak
RUN perl -p -i -e 's/(?<=\{http,\s\[\s\{")127\.0\.0\.1/0.0.0.0/g' /etc/riak/app.config
EXPOSE 8098 
CMD /bin/riak start && tail -F /var/log/riak/erlang.log.1
Run Code Online (Sandbox Code Playgroud)

编辑:-f根据他的评论,在CMD中改为-F


我自己的答案

在与Docker合作一段时间之后,我养成了使用supervisord来调整我的进程的习惯.如果您想要示例代码,请查看https://github.com/Krijger/docker-cookbooks.我使用我的主管图像作为我所有其他图像的基础.我在这里写了一篇关于使用主管的博客.

riak docker

35
推荐指数
4
解决办法
5万
查看次数

docker attach vs lxc-attach

更新:Docker 0.9.0现在使用libcontainer,从LXC转移请参阅:将进程附加到Docker libcontainer容器

我正在运行弹性搜索:

docker run -d -p 9200:9200 -p 9300:9300 dockerfile/elasticsearch
Run Code Online (Sandbox Code Playgroud)

检查它显示的过程如下:

$ docker ps --no-trunc
CONTAINER ID                                                       IMAGE                             COMMAND                                           CREATED             STATUS              PORTS                                            NAMES
49fdccefe4c8c72750d8155bbddad3acd8f573bf13926dcaab53c38672a62f22   dockerfile/elasticsearch:latest   /usr/share/elasticsearch/bin/elasticsearch java   About an hour ago   Up 8 minutes        0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   pensive_morse   
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试连接正在运行的容器时,我得到堆积:

$  sudo docker attach 49fdccefe4c8c72750d8155bbddad3acd8f573bf13926dcaab53c38672a62f22
[sudo] password for lsoave:
Run Code Online (Sandbox Code Playgroud)

tty没有连接,提示没有回来.使用lxc-attach做同样的工作正常:

$ sudo lxc-attach -n 49fdccefe4c8c72750d8155bbddad3acd8f573bf13926dcaab53c38672a62f22
root@49fdccefe4c8:/# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0 49 20:37 ?        00:00:20 /usr/bin/java -Xms256m -Xmx1g -Xss256k -Djava.awt.headless=true -XX:+UseParNewGC …
Run Code Online (Sandbox Code Playgroud)

linux virtualization lxc docker

9
推荐指数
1
解决办法
4894
查看次数

Docker更改端口绑定

我正在old_container使用exposed端口80 运行容器(让我们称之为)并使用-p标志将端口绑定到端口80上的主机接口.

sudo docker run -p 80:80 -i -t <old-image-id>

在我的生产环境中,我想现在切换old_container到a new_container.所以我想关闭old_container并启动new_container.

首先,我必须做一些手动更改new_container.所以我在没有-p标志的情况下运行它,因为在完成此更改之前我无法将其绑定到端口80.

sudo docker run -i -t < new-image-id >
#now I m doing my manual changes
Run Code Online (Sandbox Code Playgroud)

当我完成我的更改后,我退出了new_container.我的计划现在是停止old_container并绑定new_container到端口80.但是该[start][1]命令不提供端口绑定的可能性.

所以提出我的问题:我正在寻找为已停止的容器设置端口绑定,最好没有创建提交映像new_container并将此映像作为另一个新容器运行的解决方法.

port docker

9
推荐指数
2
解决办法
1万
查看次数

标签 统计

docker ×4

linux ×1

lxc ×1

port ×1

riak ×1

virtualization ×1