一条命令重启所有已停止的docker容器操作

一条命令重启所有已停止的docker容器

docker ps -a | grep Exited

查看所有已停止的容器

docker ps -a | grep Exited | awk ‘{print $1}'

获取已停止容器的ID

docker ps -a | grep Exited | awk ‘{print $1}' |xargs docker start

把获取到的已停止容器的ID传送给容器启动命令

一条命令停止所有运行中的docker容器

docker ps -a | grep Up | awk ‘{print $1}' |xargs docker stop

补充知识:Docker学习笔记:获取镜像&启动容器&停止容器

获取镜像

默认情况下,使用docker pull命令,会从官方的Docker Hub库中将镜像拉取到本地。

首先介绍这条命令的格式:

docker pull [OPTIONS] <仓库名>:<标签>

其中:

docker pull:Docker拉取镜像的命令关键词;

[OPTIONS]:命令选项;

仓库名:仓库名的格式一般为<用户名>/<软件名>。对于Docker Hub,如果不指定用户名,则默认为library,即官方镜像;

标签:标签是区分镜像不同版本的一个重要参数,<仓库名>:<标签>会唯一确定一个镜像。默认为latest。

例如,我们要从Docker Hub官方仓库拉取一个Ubuntu 14.04的官方镜像,其语句如下:

docker pull ubuntu:14.04

docker pull命令背后的工作

首先,如果tag值为空,即没有指定标签,就会使用默认tag,也就是latest,如果tag值不为空,就使用指定的tag。

然后,默认情况下,会在Docker Hub中寻找名为“repoName”的仓库,如果仓库不存在,返回错误信息。如果仓库存在,就从仓库中拉取对应tag的镜像。例如:如果执行docker pull ubuntu:14.04,那么将从“ubuntu”仓库中拉取tag为14.04的镜像,而如果执行docker pull ubuntu,会从“ubuntu”仓库中拉取tag为latest的镜像。

(在Docker Hub中有很多个镜像仓库,一般情况下会将同一类型的镜像放在同一个仓库中,例如在一个ubuntu仓库中由很多个ubuntu镜像组成,包括ubuntu:14.04、ubuntu:16.04、ubuntu:latest等等镜像)。

最后,将拉取的镜像存储到本地的指定位置。

设置镜像加速器

由于“伟大的墙”的原因,在国内从Docker Hub中拉取镜像的速度可能会比较慢,国内很多云服务商都提供了镜像加速器服务,例如阿里、网易等等。

以Linux系统配置阿里云加速器为例,只需要将下面的命令复制到Linux的终端,以root用户的身份执行之后,就成功的配置了阿里云加速器了!

#以root用户执行以下操作

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{#下面的URL可以替换为你自己的阿里云加速地址
"registry-mirrors": ["https://jxus37ad.mirror.aliyuncs.com "]
}
EOF
systemctl daemon-reload
systemctl restart docker

启动容器

在拉取到一个镜像之后,也就为容器准备了运行环境。

启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。

第一种方式:新建并启动

docker run命令会基于指定的镜像创建一个容器并且启动它。docker run的基本语法如下:

docker run [OPTIONS] 镜像名 [COMMAND] [ARG]

其中:

docker run: Docker创建并启动容器的命令关键词;

OPTIIONS: 命令选项,最常用的包括-d后台运行容器并返回容器ID,-i以交互模式运行容器,-t为容器分配一个伪输入终端,–name指定启动容器的名称。更多选项请参考Docker帮助文档;

镜像名: 以<仓库名>:<标签>的方式来指定;

COMMAND: 设置启动命令,该命令在容器启动后执行;

ARG: 其他一些参数。

docker run背后的工作

Docker在后台运行的标准操作包括:

检查本地是否存在指定的镜像,不存在就从公有仓库下载启动;

利用镜像创建并启动一个容器;

分配一个文件系统,并在只读的镜像层外面挂载一层可读写层;

从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去;

从地址池配置一个ip地址给容器;

执行用户指定的启动命令;

执行完毕后容器被终止。

docker run实例一

创建并启动一个容器,容器中具有ubuntu的运行环境,输出hello docker。

只需要一条命令:docker run ubuntu:14.04 echo ‘hello docker',问题就解决了。

首先由于本地不存在ubuntu:14.04镜像,所以先到Docker Hub中下载镜像;(其实也就是先执行docker pull ubuntu:14.04)

然后在下载完镜像之后,使用镜像创建。由于一个ubuntu镜像包含了一个ubuntu系统的所有内容,使用镜像启动后,容器中就具备了ubuntu的运行环境了。

启动容器后,执行echo 'hello docker'启动命令,执行完启动命令之后终止容器。

docker run实例二

创建并启动一个容器,容器中具有ubuntu的运行环境,容器名为firstContainer,为容器分配一个终端,与用户进行交互。

其中,-i选项告诉Docker保持标准输入输出流对容器开放,-t选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上。–name为容器设置容器名。

注意docker run是创建一个新容器并启动,所以这条命令创建的容器与上个实例的创建的容器不是同一个容器。而且由于本地已经存在ubuntu:latest镜像了,所以并不需要再次从Docker Hub中下载,而是直接使用本地的ubuntu:latest镜像构建容器。

启动容器之后,我们进入容器内部并在终端进行与容器交互。我们可以根据左侧的命令提示符判断自己是否在容器内部。例如上面的例子,当左侧的命令提示符为root@localhost时,表示我们在容器外部,而命令提示符为:root@fe263c9359dd/时,表示我们在容器内部,且容器的ID是fe263c9359dd。我们可以通过exit退出当前的容器。

第二种方式:启动一个已经终止的容器

虽然Docker容器是非常轻量的,这意味着一般情况下,我们在启动完容器并完成操作之后都会将容器删除掉。但是有些时候我们会进入之前创建的容器,而docker run每次都会创建一个新容器,显然不符合我们的需求。这种时候,可以使用docker start命令,使用容器名或者容器id启动一个已经终止的容器。

docker start [OPTIONS] 容器 [容器2...]

其中:

docker start: Docker启动容器的命令关键词;

OPTIIONS: 命令选项;

容器: 需要启动的容器,该容器用“容器ID”或“容器名”表示,如果指定了多个容器,那么就将这些容器都启动。

假设一个名为firstContainer的容器处于终止状态,现在需要将它启动,可以这么做:执行docker start firstContainer,命令执行后,尝试启动firstContainer容器,并执行该容器的启动命令。

但是如果想启动第一个实例创建的容器,既不知道容器的名字(因为我没有指定)而且也不知道它的id。该怎么办呢?

查看容器信息

Docker中有这样一条命令docker ps,可以查看容器的信息,包括容器ID,基础镜像,启动命令,创建时间,当前状态,端口号,容器名字。

如果不加任何参数,只执行docker ps,将会显示所有运行中的容器。例如执行docker ps,如下图所示,在当前的Docker环境中,只有一个正在运行的容器,它的容器Id是fe263c9359dd,基于ubuntu:latest镜像,启动命令为“/bin/bash”,创建时间为2分钟之前,当前状态为“Up 2 minutes”,也就是已经运行了2分钟了,容器名为:firstContainer。

而如果docker ps –a命令,可以查看Docker环境中所有的容器,包括已经停止的容器。执行docker ps –a后,如下图所示:除了名为firstContainer的容器外,还可以看到一个id为ee826f1d58ff的容器容器(容器id随机生成)。但是这个容器的当前状态为Exited (0) 3 minutes ago,这表示它是处于终止状态的,而且是在3分钟前退出的。

对于这个处于终止状态的容器,可以通过docker start ee826f1d58ff或者docker start g\fracious_lewin启动该容器了。

实际情况中,使用docker start ee826f1d58ff去启动第一个实例的容器,然后使用docker ps查看,会看不到该容器。这也就是说明了在执行docker ps时,容器Id为ee826f1d58ff的容器并不是处于运行状态,而是处于终止状态。

docker ps的执行结果如下所示:容器Id为ee826f1d58ff的容器的当前状态为Exited (0) 2 seconds ago!!!这表示ee826f1d58ff容器确实处于终止状态,但是它是2秒之前退出的,注意是2秒前!这表明2秒前启动过容器,但是由于某种原因,容器终止了!!

实际情况下,执行docker start ee826f1d58ff启动容器id为ee826f1d58ff的容器了!!但是在执行完启动命令之后,该容器就立即结束了。

停止容器

使用docker stop停止一个容器

docker stop可以用来终止一个正在运行的容器。它的命令格式如下:

docker stop [OPTIONS] Container [Container ...]

其中:

docker stop: Docker停止容器的命令关键词;

OPTIONS:命令选项,其中-t指定等待多少秒后如果容器还没终止,就强行停止,默认等待10秒;

Container:需要启动的容器,该容器用“容器ID”或“容器名”表示,如果指定了多个容器,那么就将这些容器都启动。

例如想要停止一个名为firstContainer 的容器,可以这么执行docker stop firstContainer。该命令执行完之后,firstContainer将会处于终止状态。终止状态的容器,可以使用docker ps –a查看到。

实际工作中,执行docker stop可能并不会立即终止容器,而是需要等待一段时间。

容器实际上是一个进程。而执行docker stop之后,首先会向容器的主进程发送一个SIGTERM信号,让主进程释放资源保存状态,尝试自己终止。但当等待时间超过了-t设置的时间后,会向容器的主进程发送一个SIGKILL信号,使容器立即终止。

在什么情况下容器启动后会立即终止?

实际情况中,除了使用docker stop命令来强制地终止一个容器以外,当容器的启动命令终结时,容器也自动会终止。

以docker run --name testcontainer ubuntu echo 'hello docker'为例,echo 'hello docker'就是该容器的启动命令。实际上执行完这条命令后,执行docker ps -a,可以发现testcontainer容器是处于终止状态的,如下所示:

[root@localhost Desktop]# docker run --name testcontainer ubuntu echo 'hello docker'
hello docker
[root@localhost Desktop]# docker ps -a
CONTAINER ID    IMAGE        COMMAND         CREATED       STATUS           PORTS        NAMES
da14116bf641    ubuntu       "echo 'hello docker'"  6 seconds ago    Exited (0) 4 seconds ago            testcontainer

在容器启动时,会执行容器的启动命令。而执行上述命令创建并启动容器后,由于容器的启动命令echo 'hello docker'会立刻执行完毕,所以容器也随之终止,因此使用docker ps -a查看该容器的状态是终止状态。

Docker容器是一个进程,实际上它以sh作为主进程。如果主进程停止了,那么容器也就停止了。而如果容器的“启动命令”执行完之后,由于主进程没有命令继续执行,所以主进程会停止,容器也就因此而停止了。

如何才能使容器启动后不立即终止?

如果容器的sh主进程不停止,是不是以为这容器就不会停止?答案是肯定的。因此,如果使启动命令不能执行完毕,或者在执行完启动命令后,容器的sh主进程不停止,那么容器在启动后就不会立即终止了!

下面举两个能使容器启动后不立即停止的例子:

将启动命令设置为死循环

docker run ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"

这条命令在创建并启动容器之后,会执行/bin/sh -c “while true; do echo hello world; sleep 1; done”,由于该命令永远都不会执行完毕,除非强行终止,所以容器的主进程sh不会停止,因此容器也将不会停止。但是这样的做的话,无法正常的操作容器,而且它会占据资源,所以这种做法在实际的工作中意义并不大。

将启动命令设置为“启动一直运行的子进程”

docker run --name first_container -it ubuntu /bin/bash

执行完这条命令后,创建并启动容器之后,执行/bin/bash,会启动一个子进程,此时父进程(也就是容器的主进程sh)会进入sleep状态,由于sleep状态不是终止状态,所以容器会继续运行。

为什么在容器中输入exit或者执行ctrl D后,容器将会终止呢,这是因为exit会退出(结束)当前进程,也就是/bin/bash,由于子进程结束,sh主进程恢复到运行态,然而由于没有命令需要继续执行,所以sh主进程结,因此容器终止。

以上这篇一条命令重启所有已停止的docker容器操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 解决docker容器启动后马上退出的问题

    最近在看docker如何让容器在启动时直接运行某些进程,后来发现Dockerfile可以在容器启动的时候指定容器运行命令. CMD指定,但是每个Dockerfile只能有一条CMD指令,如果指定了多条CMD指定,只有最后一条会被执行. 于是就想了一个办法,在写了一个脚本,在脚本里面启动多个进程,在Dockerfile里运行这个脚本. 最后证明这个方法是可行的,在实验过程中遇到一个问题,容器启动后会马上停止. 经查阅资料: Docker容器同时只能管理一个进程,如果这个进程退出那么容器也就退出了,

  • 如何进入、退出docker的container实现

    1 启动docker服务 首先需要知道启动docker服务是: service docker start 或者: systemctl start docker 2 关闭docker服务 关闭docker服务是: service docker stop 或者: systemctl stop docker 3 启动docker某个image(镜像)的container(容器) Docker的镜像称为image,容器称为container. 对于Docker来说,image是静态的,类似于操作系统快照

  • 如何解决docker容器启动失败

    问题:电脑重启之后,docker里面的mysql容器重启不了,不知道是什么原因 上面的步骤:如果sudo docker start name 能重新启动,也就是输入:docker ps 能看到自己所需要的服务已经开启,那就不需要再进行下面的步骤了,如果刚好像上面那样,那就接着看下文: 解决办法:删除启动不了的容器,然后再重新运行镜像. 注意此时的容器名已经变为mysql了,为关闭状态,再运行镜像时还是运行不了,但此时再启动镜像时就可以启动了 内容补充 1.查看docker占用的挂载点 cat /

  • 一条命令重启所有已停止的docker容器操作

    一条命令重启所有已停止的docker容器 docker ps -a | grep Exited 查看所有已停止的容器 docker ps -a | grep Exited | awk '{print $1}' 获取已停止容器的ID docker ps -a | grep Exited | awk '{print $1}' |xargs docker start 把获取到的已停止容器的ID传送给容器启动命令 一条命令停止所有运行中的docker容器 docker ps -a | grep Up |

  • android错误 aapt.exe已停止工作的解决方法

    在使用eclipse进行安卓java的编程的时候,有时候我们会遇到这样的问题:那就是无故弹出aapt.exe停止工作的提示,虽然程序不会崩溃,但是这个提示经常弹出很是烦人.今天,小编就来教大家aapt.exe停止工作如何解决 android异常--aapt.exe已停止工作 在android开发时,当build项目时,发生如下异常: aapt.exe已停止工作,其他无任何错误提示,发生这个错误一般是资源文件或是xml文件中有错误造成的. 解决方法: clean一下,可以发现console中会有错

  • python实现多线程的方式及多条命令并发执行

    一.概念介绍 Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法:另一种是创建一个threading.Thread对象,在它的初始化函数(__init__)中将可调用对象作为参数传入. Thread模块是比较底层的模块,Threading模块是对Thread做了一些包装的,可以更加方便的被使用. 另外在工作时,有时需要让多条命令并发的执行, 而不是顺序执行. 二.代码样例 #!/usr/bin/py

  • Linux 连续执行多条命令的方法(推荐)

    每条命令使用";"隔开,则无论前边的命令执行成功与否都会继续执行下一条命令 这里,故意将第二条命令中的echo多写了一个o,命令执行出错,但并不影响后续命令的执行 可以这么想,如果用分号来间隔命令,就相当于将命令分隔在了不同的行,无论前一行的命令成功或失败,都不影响下一行命令的执行. $ echo 1; echoo 2; echo 3; echo 4 1 -bash: echoo: command not found 3 4 若命令间使用"&&"隔开

  • 三条命令搞定Winload.exe出现0xc000000e错误

    微软前一段时间放出了Windows Server (TM) Code Name "Longhorn" Build 6001 Beta 3,也就是最近才改名的Windows Server 2008 Beta 3,偶就给自己装了上去,谁让自己有用服务器系统的习惯呢. Beta 3是英文版,装完之后,弄了半天,设置得差不多了,才发现网上有中文语言包,郁闷!赶快下了语言包装上,顺带把桌面体验也装上,哈哈,这不是节省内存版的Vista嘛,而且还是正版的(序列号是微软给的,可以通过微软激活),玩了

  • 初窥Linux 之我最常用的20条命令总结

    玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因为我们只需要掌握我们最常用的命令就可以了.当然你也可以在使用时去找一下man,他会帮你解决不少的问题.然而每个人玩Linux的目的都不同,所以他们常用的命令也就差异非常大,而我主要是用Linux进行C/C++和shell程序编写的,所以常用到的命令可以就会跟一个管理Linux系统的人有所不同.因为不想在使用是总是东查西找,所以在此总结一下,方便一下以后的查看.不多说,

  • docker run起来之后执行多条命令

    最近在搞jenkins pipeline的部署工作,而在对.net core进行部署时不希望安装dotnet sdk,为了移植性更好,打算直接使用aspnetcore的docker镜像,通过docker去run它,而在这个时间出现了一个问题 docker run aspnetcore:2.0之后如果希望同时执行多个sh命令出现了问题,还非要写个脚本文件,这是大叔不喜欢的! docker run aspnetcore:2.0 ls && ls 结果是第一个ls显示的是容器里的内容,而第二个l

  • 一条命令解决mac版本python IDLE不能输入中文问题

    安装完Python通常自动就有了一个简易的集成环境IDLE,但在mac上,无法在IDLE中使用中文. 通常故障有两种情况: 1.在IDLE中,中文输入法根本无法工作,不会弹出输入框,所有的输入都被当做英文对待. 这种情况是由于IDLE使用了Tkinter 图形库,Tkinter使用的依赖库Tcl/Tk,在macOS中已经有了一个较低的内置版本,这造成了中文无法输入的问题,解决办法可以重新安装使用高版本Tcl/Tk编译的python,在Homebrew下只需要一条命令: brew reinstal

  • 详解Docker容器运行多条命令(supervisor)

    一, 简介 Dockerfile 运行只支持一条命令,当在Docker里要运行多条命令,用supervisor来管理就比较合适了. Supervisor是一个 Python 开发的 client/server 系统,可以管理和监控类 UNIX 操作系统上面的进程.它可以同时启动,关闭多个进程,使用起来特别的方便. 组成部分 supervisor 主要由两部分组成: supervisord(server 部分):主要负责管理子进程,响应客户端命令以及日志的输出等: supervisorctl(cl

  • java Runtime如何执行多条命令

    目录 java Runtime如何执行多条命令 Runtime.getRuntime().exec 执行多条 java Runtime如何执行多条命令 使用 && 分隔命令 public static void cmd() { String ls = " cd /home/ && dir "; Process process = null; String cmd = getOsCmd()+ ls; try { process = Runtime.getR

随机推荐