docker退出不关闭容器为什么刚运行就退出了

Docker&-&启动一个已经停止的容器
通过docker start命令来启动一个已经停止的容器。
docker start [OPTIONS] CONTAINER [CONTAINER...]
--attach&&&&&&&&
Attach STDOUT/STDERR and forward signals
--detach-keys&&&&&&&
Override the key sequence for detaching a container
--help&&&&&&&&&&&&&&
Print usage
--interactive&&&
Attach container's STDIN
$ docker -H tcp://:2375 start edeecf13732c
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。博客访问: 276734
博文数量: 210
博客积分: 0
博客等级: 民兵
技术积分: 2627
注册时间:
认证徽章:
鸟在笼中,恨关羽不能张飞;Survival of the fittest
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: 虚拟化
1. 查看docker信息(version、info)
2. 对image的操作(search、pull、images、rmi、history)
3.&启动容器(run)
docker容器可以理解为在沙盒中运行的进程。这个沙盒包含了该进程运行所必须的资源,包括文件系统、系统类库、shell 环境等等。但这个沙盒默认是不会运行任何程序的。你需要在沙盒中运行一个进程来启动某一个容器。这个进程是该容器的唯一进程,所以当该进程结束的时候,容器也会完全的停止。
Note: &在执行apt-get 命令的时候,要带上-y参数。如果不指定-y参数的话,apt-get命令会进入交互模式,需要用户输入命令来进行确认,但在docker环境中是无法响应这种交互的。apt-get 命令执行完毕之后,容器就会停止,但对容器的改动不会丢失。
4. 查看容器(ps)
5. 保存对容器的修改(commit)
当你对某一个容器做了修改之后(通过在容器中运行某一个命令),可以把对容器的修改保存下来,这样下次可以从保存后的最新状态运行该容器。
Note:&&image相当于类,container相当于实例,不过可以动态给实例安装新软件,然后把这个container用commit命令固化成一个image。
6. 对容器的操作(rm、stop、start、kill、logs、diff、top、cp、restart、attach)
Note:&attach命令允许你查看或者影响一个运行的容器。你可以在同一时间attach同一个容器。你也可以从一个容器中脱离出来,是从CTRL-C。
7. 保存和加载镜像(save、load)
当需要把一台机器上的镜像迁移到另一台机器的时候,需要保存镜像与加载镜像。
8、 登录registry server(login)
9. 发布image(push)
10.&&根据Dockerfile 构建出一个容器
阅读(49308) | 评论(0) | 转发(1) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。1541人阅读
ubuntu(18)
在我们对docker容器操作的时候,有时候会误操作或者其他的原因无意间退出了正在操作的容器,也许你会担忧你在其中的一些操作未保存下来,无须担忧,本文中将会提供各种方法供你参考(我的建议使用最后一种)。在本文,我们将讨论五种(4+1)连接Docker容器并与其进行交互的方法。例子中所有的代码都可以在GitHub中找到,你可以亲自对它们进行测试。
nsenter 工具在 util-linux 包2.23版本后包含。 如果系统中 util-linux 包没有该命令,可以按照下面的方法从源码安装。
你也可以点击此链接进行下载&
$ cd / curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-; cd util-linux-2.24;
$ ./configure --without-ncurses
$ make nsenter && sudo cp nsenter /usr/local/bin
nsenter 可以访问另一个进程的名字空间。nsenter 要正常工作需要有 root 权限。 很不幸,Ubuntu 14.4 仍然使用的是 util-linux 2.20。安装最新版本的 util-linux(2.24)版,请按照以下步骤:
$ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar. tar xzvf util-linux-2.24.tar.gz
$ cd util-linux-2.24
$ ./configure --without-ncurses && make nsenter
$ sudo cp nsenter /usr/local/bin
从util-linux版本2.23开始,nsenter工具就包含在其中。它用来访问另一个进程的名字空间。nsenter要正常工作需要有root权限。很不幸,Ubuntu 14.4仍然使用的是util-linux版本2.20。安装最新版本的util-linux(2.24)版,请按照以下步骤:
为了连接到容器,你还需要找到容器的第一个进程的PID,通过这个PID,你就可以连接到这个容器:
$ docker inspect --format &{{ .State.Pid }}& &container-id&
//or run 'docker inspect -f &{{ .State.Pid }}& &container-id&'
$ nsenter --target $PID --mount --uts --ipc --net --pid
从0.9版本开始,Docker自身就具有一个管理容器的库,名字为 libcontainer。libcontainer中的nsinit工具允许用户直接访问linux名字空间和cgroup内核。在安装nsinit之前,你首先需要安装Go运行时环境:
$ apt-get installgit golang-go
$ mkdir-p $HOME/go-dev/binmkdir-p $HOME/go-dev/src
$ echo&export GOPATH=\$HOME/go-dev& && ~/.profileecho &PATH=\$PATH:\$GOPATH/bin&&& ~/.profile
$ source~/.profile
接下来才安装nsinit:
$ mkdir -p $GOPATH//dotcloudcd$GOPATH//dotcloud
$ git clone &a target=_blank href=&/dotcloud/docker.git&&/dotcloud/docker.git&/a& $GOPATH//dotcloud/docker
$ /usr/bin/goget -/dotcloud/docker/vendor//docker/libcontainer/nsinit
nsinit读取的是位于/var/lib/docer/execdriver/native/&container-id&容器目录下的配置数据。要运行nsinit,你需要切换到容器目录下。由于/var/lib/docker目录对于root用户是只读权限,因此你还需要root权限。通过docker的ps命令,你可以确定容器ID。一旦你进入/var/lib/docker目录,你就可以连接容器了:
nsinit exec /bin/bash
3.lxc(-attach)
直到Docker 0.8.1版本为止,LXC一直是管理容器的基本工具,Docker一直支持这个工具。但是从0.9.0版本开始,Docker默认使用libcontainer管理容器,不再依赖LXC了。因此默认情况下,你不能使用lxc-attach了。
如果你仍然希望使用lxc-attach,那么你需要使用-e lxc选项来重新启动Docker服务进程。使用这个选项,Docker的内部将再次使用LXC管理容器了。完成这个任务最简单的做法就是创建/etc/default/docker文件(如果这个文件仍然不存在),并添加以下内容:
DOCKER_OPTS=& -e lxc&
现在你可以重新启动Docker服务了。要连接容器,你需要知道完整的容器ID:
docker ps --no-trunc
接下来,你就可以连接这个容器了。要完成下面工作,你还需要root权限:
lxc-attach -n &container-id& -- /bin/bash
上面所有三种方法都要求具有主机系统的root权限。为了不采用root权限,通过ssh访问容器将是一个很好的选择。
要做到这一点,你需要构建一个支持SSH服务的基础映像。此时,我们可能遇到这样的问题:我们是不是用Docker CMD或者ENTRYPOINT运行一条命令就可以了?如果此时有sshd进程运行,那么我们就不要再运行其他进程了。接下来的工作是创建一个脚本或者使用像supervisord这样的进程管理工具来启动其它所有需要启动的进程。有关如何使用supervisord的优秀的文档可以在Docker的web站点上找到。一旦你启动了具有sshd进程的容器,你就可以像以往一样通过ssh客户端了连接这个容器了。
sshd方法可能是最简单的连接容器的方法,而且大多数用户习惯通过ssh连接虚拟机。另外,连接容器时你也不需要一定使用root权限。不过,对于是否一个容器是否应当管理不止一个进程仍然存在许多争议。这种方法最终使得每个容器了多了一个sshd进程,这从根本上来说不是进程虚拟化的所提倡的。
另外三种方法都需要root权限。到0.8.1版本为止,Docker都是使用LXC来管理容器的。正是由于这个原因,使用lxc-attach连接容器就非常容易。不过从版本0.9.0开始Docker服务就必须使用 -e lxc选项启动才能在内部支持LXC管理容器。不过,由于设置了这个选项,Docker将再次依赖LXC,而LXC可能随着发布或者安装的不同可能被剔除。
nsenter和nsinit总的来说是相同的。这两个工具的主要区别是nsinit在本身的容器了建立了一个新的进程,而nsenter只是访问了名字空间。Jerome Petazzoni在里对这一点说的很透彻。
上面的几种方法我也曾试过,他们基本上都是进入正在运行中的容器,nsenter还可实现多终端对一个容器的操作。如果进入已经终止的容器,第一次安装执行的时候是可以的,可以得到PID的值,不过之后再执行的时候发现PID的值为0,如果你接着执行
&del&nsenter --target $PID --mount --uts --ipc --net --pid&/del&
你会发现&切换到了宿主机的超级管理员权限。
正确的方法会在下面介绍,首先先补充一下一些命令的参数的含义:
&&& docker images: 列出images
&&& docker images -a :列出所有的images(包含历史)
&&& docker images --tree :显示镜像的所有层(layer)
&&& docker rmi& &image ID&: 删除一个或多个image
&&& docker ps :列出当前所有正在运行的container
&&& docker ps -l :列出最近一次启动的container
&&& docker ps -a :列出所有的container(包含历史,即运行过的container)
&&& docker ps -q :列出最近一次运行的container ID
5.重点来了:
$ docker ps -a
CONTAINER ID
9cff554fb6d7
ubuntuold:14.04
About an hour ago
Up About an hour
condescending_blackwell
e5c5498881ed
ubuntuold:14.04
About an hour ago
Exited (0) 55 minutes ago
backstabbing_bardeen
&&& 通过以上的信息可以看出两者之间的差别:前者是正在运行的容器;而后者是已经终止的容器(Exited(0))。
&&& docker start/stop/restart&container& :开启/停止/重启container
&&& docker start [container_id] :再次运行某个container(包括历史container)
&&& docker attach [container_id]:连接一个正在运行的container实例(即实例必须为start状态,可以多个窗口同时attach一个container实例)
&&& docker start -i &container&:启动一个container并进入交互模式(相当于先start,在attach)
就以后者e5c5498881ed为例:首先执行
$ docker start e5c5498881ed
//之后再一次查看的时候Exited(0)已经没有了,也就是说明该容器已经从终止的状态变为了正在运行的状态
$docker attach e5c5498881ed
//你会的发现已经进入该容器了,而且之前的操作的文件依然存在
//如果没有反应的话,再一次点击回车即可
&& &docker run -i -t &image& /bin/bash:使用image创建container并进入交互模式, login shell是/bin/bash
&&& docker run -i -t -p &host_port:contain_port&:映射 HOST 端口到容器,方便外部访问容器内服务,host_port 可以省略,省略表示把 container_port映射到一个动态端口。
&& 注:使用start是启动已经创建过得container,使用run则通过image开启一个新的container。
查看root密码
&& docker容器启动时的root用户的密码是随机分配的。所以,通过这种方式就可以得到容器的root用户的密码了。
docker logs f6e 2&&1 | grep 'User: ' | tail -n1
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:32117次
排名:千里之外
原创:18篇
转载:17篇
(2)(4)(3)(2)(1)(12)(13)如何避免Docker容器启动脚本运行后自动退出_百度知道
如何避免Docker容器启动脚本运行后自动退出
不断echo),可以设置一个别名(alias)来解决,不会一直挂着等待响应的;bin&#47,根据官方的文档,就是会自动退出的。-d命令是设置detach为true。另外。这个地方官方早期和现在的文档也确实有些前后不一致:alias dockerbash=&#39,意思是让这个命令在后台运行;bash),但并不是一直运行(我们在一个正常的Linux Terminal中运行&#47,运行完了也就完了,直接运行docker run -i -t CONTAINER_NAME /bin&#47,如果觉得参数比docker attach多;bin/bash&#39,所以确实没办法用daemon方式来跑&#47,现在是detach,早期的文档说指定-d以daemon方式来运行容器,如果你需要跑容器里的bash,可能存在一定的误解;bash 就可以了;docker run -i -t CONTAINER_ID /bin/设置好别名后避免Docker容器启动脚本运行后自动退出的解决办法docker run指定的命令如果不是那些一直挂起的命令(比如运行top
为您提供更好的产品和服务
主营:七彩虹品牌主板,显卡等电脑及配件产品
为您推荐:
其他类似问题
等待您来回答}

我要回帖

更多关于 docker attach 退出 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信