可以理解为镜像是Docker生命周期中的构件或打包阶段,而容器则是启动或执行阶段
① centos8之后不在正式支持docker了,在centos7及之前版本中可直接使用yum install docker安装docker
② 创建一个交互式docker容器
$sudo docker run -i -t centos /bin/bash
($docker create …… 仅创建不运行,可以在容器工作流中对其进行细粒度的控制 )
第一次run会从docker官方拉取centos镜像,普通情况下会显示Client.Timeout exceeded while awaiting headers
即连接不上docker官网,解决办法就是使用dotcloud的加速,将其写在/etc/docker/daemon.json文件中
-i 标志保证容器中STDIN是开启的,持久的标准输入是交互式shell的半边天,-t 标志则是另外的半边天,它告诉Docker为要创建的容器分配一个伪tty终端,这样,新创建的容器才能保证一个交互式shell,这两个参数是创建一个交互式shell最基本的参数。
首先Docker会检查本地是否存在centos镜像,如果本地还没有该镜像的话,那么Docker会连接官方维护的Docker Hub Registry,查看Docker Hub中是否有该镜像。Docker一旦找到该镜像,就会下载该镜像并将其保存到本地宿主机中
随后,Docker在文件系统内部用这个镜像创建了一个新容器。该容器拥有自己的网络、IP地址,以及一个用来和宿主机进行通信的桥接网络接口,最后我们告诉Docker在新容器重要运行什么命令,在本例中我们在容器中运行、bin/bash命令启动了一个bash shell.
当容器创建完毕之后,Docker就会执行容器中的/bin/bash命令,这时就可以看到容器内的shell了。

③ 当你输入exit,就可以返回到宿主机的命令提示符了

④ 输入exi之后,交互式容器已经停止运行了,只有指定的/bin/bash命令处于运行状态的时候,交互式容器才会处于相应的运行状态。
但容器仍然是存在的,可以用docker ps -a 查看当前系统中容器的列表。
当执行docker ps 时,只会列出正在运行的容器。
docker ps -l 带上-l 标志,列出最后一个运行的容器,无论其是正在运行还是已经停止
也可以通过--format标志,进一步控制显示哪些信息
⑤ 创建容器时可以加上--name 指定容器名字,之后便可以通过名字对容器进行操作,如果不指定默认随机产生

⑥ 重新启动已经停止的容器
$docker start/restart byname 重新启动容器,但是交互式容器并不会使用命令提示符

docker容器重新启动的时候,会沿用docker run命令时制定的参数来运行,因此我们这里重新启动后会运行一个交互式会话shell
⑦ 使用name或ID 附着到正在运行的容器上
$docker attach byname

⑧ 创建守护式容器
另一种选择是创建守护式容器,及长期运行的容器,其没有交互式会话,非常适合运行应用程序和服务。
$docker run --name daemon_dave -d centos /bin/bash -c "while true; do echo hello world; sleep 1; done"

-d 参数会将容器放到后台运行。后边的while循环是此容器要执行的任务。
通过组合使用上面这些参数,你会发现docker run并没有像交互式容器一样将主机的控制台附着到新的shell会话上,而是仅仅返回了一个容器ID而已。
查看正在运行的daemon_dave容器

⑨ 为了探究容器内部在干什么,可以用docker logs命令来获取容器的日志。

看到while循环正在向日志中打印hello world。Docker会输出最后几条日志项并返回,我们还可以在命令后使用-f参数来监控Docker的日志,这与tail -f命令相似。

这个命令一直在输出日志,通过ctrl + c 退出日志跟踪
为了让调试更简单,还可以加上-t为每条日志项加上时间戳

⑩ Docker日志驱动
自Docker 1.6开始,也可以控制Docker守护进程和容器所用的日志驱动,这可以通过--log-driver选项来实现。可以在启动Docker守护进程或者执行docker run命令时使用这个选项
有好几个选项,包括默认的json-file,json-file也为我们前面看到的docker logs命令提供了基础
其他可用的选项还包括syslog,该选项将禁用docker logs命令,并且将所有容器的日志输出都重定向到Syslog。可以在启动Docker守护进程时指定该选项,将所有容器的日志都输出到Syslog,或者通过docker run对个别的容器进行日志重定向输出

$ docker run --log-driver="syslog" --name daemon_dwayne -d centos /bin/bash -c "while true; do echo hello world; sleep 1; done"
上面的命令会将daemon_dwayne容器的日志都输出到Syslog,导致docker logs命令不输出任何东西
最后,还有一个可用的选项是none,这个选项将会禁用所有容器中的日志,导致docker logs命令也被禁用
⑪ 查看容器内进程
查看容器内进程要使用docker top命令

该命令执行后,可以看到容器内的所有进程(主要还是我们的while循环)、运行进程的用户及进程ID
⑫ Dcoker统计信息
使用docker stats命令,它用来显示一个或多个容器的统计信息
$ docker stats daemon_dave

能看到一个守护式容器的列表,以及它们的CPU、内存、网络I/O及存储I/O的性能和指标。这对快速监控一台主机上的一组容器非常有用
⑭ 在容器内部运行进程
以通过docker exec命令在容器内部额外启动新进程。可以在容器内运行的进程有两种类型:后台任务和交互式任务。后台任务在容器内运行且没有交互需求,而交互式任务则保持在前台运行。对于需要在容器内部打开shell的任务,交互式任务是很实用的

也可以在daemon_dave容器中启动一个诸如打开shell的交互式任务

和运行交互容器时一样,这里的-t和-i标志为我们执行的进程创建了TTY并捕捉STDIN。接着我们指定了要在内部执行这个命令的容器的名字以及要执行的命令。在上面的例子中,这条命令会在daemon_dave容器内创建一个新的bash会话,有了这个会话,我们就可以在该容器中运行其他命令了

⑮ 停止守护式容器
要停止守护式容器,只需要执行docker stop命令,后跟ID或Name


还有一个很实用的命令docker ps -n x,该命令会显示最后x个容器,不论这些容器正在运行还是已经停止

⑯ 自动重启容器
如果由于某种错误而导致容器停止运行,还可以通过--restart标志,让Docker自动重新启动该容器。--restart标志会检查容器的退出代码,并据此来决定是否要重启容器。默认的行为是Docker不会重启容器
例子:

在本例中,--restart标志被设置为always。无论容器的退出代码是什么,Docker都会自动重启该容器。除了always,还可以将这个标志设为on-failure,这样,只有当容器的退出代码为非0值的时候,才会自动重启。另外,on-failure还接受一个可选的重启次数参数
--restart=on-failure:5
这样,当容器退出代码为非0时,Docker会尝试自动重启该容器,最多重启5次
⑰ 深入容器
除了通过docker ps命令获取容器的信息,还可以使用docker inspect来获得更多的容器信息

docker inspect命令会对容器进行详细的检查,然后返回其配置信息,包括名称、命令、网络配置以及很多有用的数据,也可以用-f或者--format标志来选定查看结果


上面这条命令会返回容器的运行状态,示例中该状态为false
也可以同时指定多个容器,并显示每个容器的输出结果

可以为该参数指定要查询和返回的查看散列(inspect hash)中的任意部分

⑱ 删除容器
如果容器已经不再使用,可以使用docker rm命令来删除它们。目前,还没有办法一次删除所有容器,不过可以通过代码清单3-37所示的小技巧来删除全部容器

上面的docker ps命令会列出现有的全部容器,-a标志代表列出所有容器,而-q标志则表示只需要返回容器的ID而不会返回容器的其他信息。这样我们就得到了容器ID的列表,并传给了docker rm命令,从而达到删除所有容器的目的

















