docker入门——管理容器
除了交互式的容器(interactive container),我们也可以创建长期运行的容器。守护式容器(daemonized container)没有交互式会话,非常适合运行应用程序和服务。大多数时候我们都需要以守护式来运行我们的容器。
创建守护式容器
# docker run --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
64b5c862a23cb5b15e489fbd51dab5cfc958ca447db936732abb0f01ca2282b0
- -d 参数,docker会将容器放到后台运行,并返回容器ID
我们还在容器要运行的命令里使用了一个while循环,该循环会一直打印hello world,直到容器或其进程停止运行。通过组合使用上面的这些参数,可以发现docker run命令并没有像上一个容器一样将主机的控制台附着到新的shell会话上,而是仅仅返回了一个容器ID而已,我们还是在宿主机的命令行之中。通过docker ps 命令可以看到一个正在运行的容器。
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
64b5c862a23c ubuntu "/bin/sh -c 'while t 19 minutes ago Up 19 minutes daemon_dave
同时我们也可以通过docker logs命令来获取容器的日志,探究该容器内部都在干什么。
# docker logs daemon_dave
hello world
hello world
hello world
...
通过 -f 参数可以跟踪守护式容器的日志,功能类似与tail -f命令,通过Ctrl+c退出日志跟踪。
# docker logs -f daemon_dave
hello world
hello world
hello world
...
通过--tail 10 可以获取日志最后10行的内容,另外也可以通过--tail 0 -f 命令来跟踪某个容器的最新日志而不必读取整个日志文件。
# docker logs --tail 10 daemon_dave
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world # docker logs --tail 0 -f daemon_dave
hello world
hello world
hello world
hello world
hello world
--tail命令
为了让调试更简单,我们还可以使用-t标志为每条日志项加上时间戳,同样通过Ctrl+c退出日志跟踪。
# docker logs --tail 0 -ft daemon_dave
2017-05-11T08:16:11.088410871Z hello world
2017-05-11T08:16:12.090729257Z hello world
2017-05-11T08:16:13.093541541Z hello world
查看容器内的进程:
除了容器的日志,我们也可以查看容器内部运行的进程。通过docker top我们可以看到容器内所有的进程:
# docker top daemon_dave
UID PID PPID C STIME TTY TIME CMD
root 9691 1339 0 15:45 ? 00:00:00 /bin/sh -c while true; do echo hello world; sleep 1; done
root 12526 9691 0 16:29 ? 00:00:00 sleep 1
在容器内部运行进程:
我们可以通过docker exec命令在容器内部额外启动新进程。可以在容器内运行的进程有两种类型:后台任务和交互式任务。后台任务在容器内运行且没有交互需求,而交互式任务则保持在前台运行。对于需要在容器内部打开Shell的任务,交互式任务是很实用的。下面先看一个后台任务的例子:
# docker exec -d daemon_dave touch /etc/new_config_file
这里-d表示需要运行一个后台进程,-d标志之后,指定的是要在内部执行这个命令的容器的名字以及要执行的命令。上面例子中的命令在daemon_dave容器内创建了一个空文件,文件名为/etc/new_config_file。通过docker exec后台命令,我们可以在正在运行的容器中进行维护、监控以及管理任务。
我们也可以在daemon_dave容器中启动一个诸如打开shell的交互式任务:
# docker exec -t -i daemon_dave /bin/bash
root@64b5c862a23c:/# ls -l /etc/new_config_file
-rw-r--r-- 1 root root 0 May 11 08:39 /etc/new_config_file
和运行交互容器时一样,这里的-t 和 -i 标志为我们执行的进程创建了TTY并捕捉STDIN。这条命令会在daemon_dave容器内创建一个新的bash会话,有了这个会话,我们就可以在该容器中运行其他命令了。这里我们找到了之前我们通过后台任务创建的文件。
停止守护式容器:
## 只需要执行docker stop + 容器名 命令,就可以停止守护式容器
# docker stop daemon_dave
daemon_dave ## 当然我们也可以通过docker stop + 容器ID 来停止守护式容器
自动重启容器:
如果由于某种错误而导致容器停止运行,我们可以通过--restart标志,让Docker自动重启该容器。--restart标志会检查容器的退出代码,并据此来决定是否要重启容器。默认的行为是Docker不会重启容器。
# docker run --restart=always --name daemon_dave_restart -d ubuntu /bin/sh -c "while true; do echo hello world;sleep 1; done"
0e6bf4b02e2593605821dc53c0daea7ec3d899e844bd56902f1c0a548c85ea68
这里--restart标志被设置为always。无论容器的退出代码是什么,Docker都会自动重启该容器。除了always,我们还可以将这个标志设为on-failure,这样,只有当容器的退出代码为非0值的时候,才会自动重启。另外,on-failure还接受一个可选的重启次数参数
--restart=on-failure:5
这样,当容器退出代码为非0时,Docker会尝试自动重启该容器,最多重启5次。
深入容器
除了通过docker ps命令获取容器的信息,我们还可以使用docker inspect来获取更多的容器信息
# docker inspect daemon_dave
[
{
"Id": "4e01f78301baf396cc1870a880dd09414117c9a5a30eed59dfbfcebdd2baf768",
"Created": "2017-05-11T09:05:49.882890923Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true; do echo hello world; sleep 1; done"
],
"State": {
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 14828,
"ExitCode": 0,
...
docker inspect命令会对容器进行详细的检查,然后返回其配置信息,包括名称、命令、网络配置以及很多有用的数据。
我们也可以用-f或者--format标志来选定查看结果
## 这条命令会返回容器的运行状态
# docker inspect --format='{{ .State.Running }}' daemon_dave
true ## 我们还可以通过它来获取容器的IP地址等
# docker inspect --format='{{ .NetworkSettings.IPAddress }}' daemon_dave
172.17.0.9 ## 我们也可以同时指定多个容器,并显示每个容器的输出结果
# docker inspect --format='{{ .Name }} {{ .State.Running }}' daemon_dave SetName
/daemon_dave true
/SetName false
除了查看容器,我们还可以通过浏览/var/lib/docker目录来深入了解Docker的工作原理。该目录存放着Docker镜像、容器以及容器的配置。所有的容器都保存在/var/lib/docker/containers目录下。
删除容器:
如果容器不再使用,我们可以使用docker rm命令来删除它们
# docker rm daemon_dave
Error response from daemon: Cannot destroy container daemon_dave: Conflict, You cannot remove a running container. Stop the container before attempting removal or use -f
Error: failed to remove containers: [daemon_dave] ## 需要注意的是,运行中的容器是无法直接删除的!必须先通过docker stop或docker kill命令停止容器,才能将其删除
# docker stop daemon_dave
daemon_dave # docker rm daemon_dave
daemon_dave # docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
78679e02be1c ubuntu "/bin/bash" 4 hours ago Exited (0) About an hour ago SetName
f4d39b81dd5d ubuntu "/bin/bash" 4 hours ago Exited (0) 4 hours ago clever_noyce
目前,还没有办法一次删除所有容器,不过可以通过docker rm `docker ps -a -q`删除所有容器。docker ps -a 会列出现有的全部容器,而-q标志则是表示只需要返回容器的ID而不返回容器的其他信息,并传递给了docker rm命令,从而达到删除所有容器的目的。
docker入门——管理容器的更多相关文章
- Docker学习笔记之使用 Docker Compose 管理容器
0x00 概述 通过之前的介绍,我们已经基本掌握了构建.运行容器的方法,但这还远远不够,由于 Docker 采用轻量级容器的设计,每个容器一般只运行一个软件,而目前绝大多数应用系统都绝不是一个软件所能 ...
- Docker入门之三容器
上一篇博客学习了下镜像,今天来学习容器.容器类似一个手机中的沙盒环境,用来运行app实例.和镜像一样也是对容器的创建.删除.导出等. 由于我买的参考书中的例子好多都是基于linux的,所以我将dock ...
- docker 入门2 - 容器 【翻译】
入门,第 2 部分:容器 先决条件 安装的 Docker 版本是 1.13 及以上. 读完 第一部分 用下面的命令快速测试你的环境是否完备: docker run hello-world 概述 现在开 ...
- docker入门(二)容器与镜像的理解
10张图带你深入理解Docker容器和镜像 申明:此篇文章是转载的(原文地址http://dockone.io/article/783),今天意外发现已经有人转载了(复制了),希望大家关注原创 原本打 ...
- docker入门(二)容器与镜像的关系
[编者的话]本文用图文并茂的方式介绍了容器.镜像的区别和Docker每个命令后面的技术细节,能够很好的帮助读者深入理解Docker. 这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(co ...
- Docker 入门:容器
容器看着像机器,实际是进程,是一个运行时程序. 要操作一个 Docker 容器,只需要执行 docker container 命令. 可以通过 help 查看 run 运行容器 基础使用: docke ...
- Docker入门(三):容器(Containers)
这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...
- Docker入门(七):部署app
这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...
- Docker入门(六):Stacks
这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...
随机推荐
- scrapy模拟知乎登录(无验证码机制)
---恢复内容开始--- spiders 文件夹下新建zhihu.py文件(从dos窗口中进入虚拟环境,再进入工程目录之后输入命令 scrapy genspider zhihu www.zhihu.c ...
- JavaScript的7种继承模式
<JavaScript模式>一书中,对于JavaScript的几种继承模式讲解得很清楚,给我提供了很大帮助.总结一下,有如下7种模式. 继承模式1--设置原型(默认模式) 实现方式: // ...
- RBTree 红黑树
红黑树 一.红黑树概述 红黑树不仅是一个二叉搜索树,并且满足以下规则: 1>每个节点不是红的就是黑的, 2>根结点为黑色, 3>如果节点为红色,其子节点必须为黑色, 4>任一节 ...
- k8s创建资源的两种方式
命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1. 用 kubectl 命令直接创建 kubectl run nginx-deployment --image=nginx: -- ...
- ubantu对pycharm创建快捷方式
如果你刚开始没有建立快捷方式自己建立一个快捷方式,方法如下 终端输入:sudo gedit /usr/share/applications/Pycharm.desktop粘贴模板: [Desktop ...
- HDU 2552 三足鼎立(数学函数)
/* <耶律javac++>欲找出三人所在逐个击破, 现在他发现威士忌的位置s,天外来客的位置u, 不过很难探查到亦纷菲v所在何处,只能知道三人满足关系: arctan(1/s) = ar ...
- (转)python之并行任务的技巧
Python的并发处理能力臭名昭著.先撇开线程以及GIL方面的问题不说,我觉得多线程问题的根源不在技术上而在于理念.大部分关于Pyhon线程和多进程的资料虽然都很不错,但却过于细节.这些资料讲的都是虎 ...
- [BZOJ2753]滑雪与时间胶囊
第一问直接把可以走的边连起来bfs一遍即可 第二问可以用类似kruskal的方法,只不过排序的依据应该变为第一关键字为终点高度(从大到小),第二关键字为边权(从小到大),只排序可以走的边 因为同样高度 ...
- 【数论】【筛法求素数】【欧拉函数】bzoj2818 Gcd
gcd(x,y)(1<=x,y<=n)为素数(暂且把(x,y)和(y,x)算一种) 的个数 <=> gcd(x/k,y/k)=1,k是x的质因数 的个数 <=> Σ ...
- 【bzoj1296】【[SCOI2009]粉刷匠】多次背包dp及小小的优化
先放题面 Description windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜 ...