Docker入门
Docker入门
上一节中,我们了解到了Docker 的一些基本知识点,它的一些核心概念,Docker的使用安装等。此篇文章我们对 Docker 进行入门讲解
Docker 基本指令
查看Docker 基本信息
首先,我们会查看Docker 是否能够正常运行
使用 docker info
查看 Docker 程序是否存在,功能是否正常
上面我们使用了 docker info 指令,该命令会返回所有容器和镜像的数量、Docker 使用的执行驱动和存储驱动,以及Docker 的基本配置
Docker 是基于客户端-服务器架构的。它有一个 Docker 程序,既能作为客户端,又能作为服务端。作为客户端时,docker 程序向 Docker 守护进程发送请求,然后再对返回的请求结果进行处理。
运行容器
现在,我们尝试启动第一个容器,我们可以使用docker run
方法创建容器,docker run 提供了容器的创建到启动的过程。docker run 的执行流程如下图所示:
现在我们开始运行一条指令docker run -i -t ubuntu /bin/bash
,-i 标志保证容器中的 STDIN 时开启的,尽管我们并没有附着到容器中。持久的标准输入时交互式shell 的"半边天",-t 标志则是另外"半边天",它告诉 Docker 为要创建的容器分配一个 tty 终端。这样,docker 才能提供一个交互式的 shell 。示例中的 ubuntu 是一个常备镜像,也被称为基础镜像,它由Docker 公司提供并保存在 Docker Hub Registry 上。
随后,Docker 在文件系统内部利用这个镜像创建了一个新的容器。该容器拥有自己的网络、IP地址,以及一个用来和宿主机通信的桥接网络接口。最后,我们告诉 Docker 在新容器内要运行什么命令,我们在容器中运用 /bin/bash 创建了一个 Bash Shell。
使用容器
现在,我们已经切换到了新的容器中
容器ID 是@18178c34cd5a
,这是一个完整的 ubuntu 系统,下面我们就来研究一下这个系统,你可以使用
hostname
获取主机名
你会发现主机名和 root 后面的字符串一致,也就是说root 后面其实跟的是主机ID。
我们再来看看 /etc/hosts 文件,如下所示
还可以查看容器中运行的进程,ps -aux
用于查询容器中的进行进程
接下来我们要干什么?安装一个软件包?安装一下 vim 软件吧,使用apt-get update && apt-get install vim
进行安装。通过上述命令,我们可以在Ubuntu宿主机上使用 vim 口令和语法了。
当你想退出时,直接使用 exit
就退回宿主机的命令行了。
那么这个容器怎么样了?容器现在已经停止运行,只有在制定的/bin/bash 处于运行状态时,容器才会处于运行状态。一旦退出,容器也就停止了运行。
但是容器还是存在的,你可以使用 docker ps -a
查看系统中的容器列表
默认情况下,使用 docker ps
能够列出所有正在运行的容器列表,使用 docker ps -a
列出系统出所有的容器列表包括正在运行的和已经停止的。
容器命名
Docker 会为我们创建的每个容器自动生成一个随机的名称。例如我们上面创建的 /bin/bash 的名称,如果想要指定名称,通过 --name 标志实现,例如sudo docker --name cxuan_container -i -t ubuntu /bin/bash
上述命令会为你创建一个 cxuan_container 的ubuntu 镜像,你可以使用 docker ps -a 来查看最近的一个镜像。
容器的名称必须是唯一的,而且有效的名称能够帮助我们理清楚上下级关系,所以明明很重要!!!
重新启动已经停止的容器
例如,我使用docker ps
命令没有发现容器正在启动
但是你可以使用 docker start cxuan_container
启动指定的container。
重新使用 docker ps 查看活跃的docker 容器
也可以直接根据container id进行启动,我先用 docker ps -a 查看一下所有的container
比如我想启动containerId 为 18178c34cd5a 这个容器,就直接使用 docker start 18178c34cd5a
,启动完成后会直接输出 containerId。
重新查询现在正在运行的 docker container ,发现两个都在运行了
附着到容器上
Docker 容器重新启动的时候,会沿用docker run 命令时指定的参数来运行,因此我们容器重新启动后会运行一个交互式会话shell。此外,我们也可以用 docker attach
命令,重新附着该容器到会话上
![image-20190812221942603](/Users/mr.l/Library/Application Support/typora-user-images/image-20190812221942603.png)
也可以通过 docker attach containerId
的方式附着到会话上,如下所示
如果退出 shell 进程,容器也会随之停止运行
创建守护式容器
除了这些交互式运行的容器,我们也可以创建长期运行的容器。守护式容器没有交互式会话,非常适合运行应用程序和服务。大多数情况下我们需要以守护式来运行我们的容器。下面我们创建一个守护式容器
上面的示例中使用了 -d ,因此 Docker 会将容器放在后台进行。
我们还在容器要运行的命令行里使用了一个 while 循环,该循环会一致打印 hello world 直到容器或者进程停止运行。
容器内部都在干什么
上面的示例我们创建了一个 docker 的守护式进程,进程里面一直在使用 while 进行循环输出 hello world,为了探究容器内部都在做什么,我们使用docker logs
命令来获取容器的日志,如下
可以看到,其内部一直在做while 循环并输出 hello world,Docker 会输出最后几条日志并返回,我们可以使用 -f 参数来监控Docker 的日志,这与 tail -f 命令非常像
我们在日志的循环输出中加了几个空行,能让你直观的感受到我们正在监控 docker 日志的运行过程,你可以使用 control + c 来退出监控。
我们也可以跟踪日志的某一片段,例如,可以使用 docker logs --tail 10 daemon_dave
获取日志的最后10行内容。另外,也可以使用 docker logs --tail 0 -f daemon_dave
命令来追踪某个容器的最新日志而不必读取整个日志文件
追踪最新日志:
其实可以看到,日志一直在循环输出,没有显示之前的日志信息。
为了让调试更加简单,我们可以使用 -t 来为每条日志加上时间戳,如下
查看容器内的进程
除了容器的日志,我们也可以查看容器内部运行的进程,为了做到这一点,我们使用docker top
命令
执行命令后,我们看到容器内的所有进程,运行进程的用户,时间,执行指令
容器内部运行进程
在 Docker 1.3 之后,我们可以通过 docker exec
命令在容器内部额外启动新进程。可以在容器内部运行的进程有两种类型: 后台任务和交互式任务。后台任务在容器内部运行并且没有交互需求,而交互式任务保持在前台运行。对于需要在容器内部打开的 shell 任务,交互式任务还是很实用的,下面是一个后台任务的例子
这里的标志 -d
表示是一个后台进程。-d 标志之后,跟的是要在内部创建进程的名字以及要执行的命令,上面的例子会在daemon_dave 之后创建了一个新文件,文件名为/etc/new_configP_file ,通过 docker exec 后台命令,我们可以在正在运行的容器中进行维护、监控以及任务管理。
我们也可以在容器内部打开一个交互式任务,如下
因此你也可以很直观的看出交互式任务
和 后台任务
之间的区别:交互式任务可以进行运行环境的切换,而后台任务一旦运行无法切换,只能进行停止或者开始
上面的-t
和 -i
标志为我们的执行创建了 TTY 并捕捉 STDIN。接着我们指定了要在容器内部运行的名称以及要执行的命令,在上面的例子中,这条命令会在 daemon_dave 容器中创建一个新的 bash 会话,有了这个会话,我们就可以在该容器中运行其他命令了。
tty(终端设备的统称):
在UNIX系统中,计算机显示器通常被称为控制台终端(Console)。它仿真了类型为Linux的一种终端(TERM=Linux),并且有一些设备特殊文件与之相关联:tty0、tty1、tty2等。这些文件赋予了linux同时处理多任务,多窗口切换的能力。STDIN是标准输入,一般指键盘输入到缓冲区里的东西。
其他还有
stdout(Standardoutput)标准输出
stderr(Standarderror)标准错误
停止守护式进程
要停止守护式进程,需要执行 docker stop
命令,例如
也可以停止指定的 containerId,例如
Docker stop 命令会像 Docker 容器进程发送 SIGTERM 信号,如果你想快速停止某个容器,也可以使用 docker kill 命令来向进程发送 SIGKILL 信号。
可以使用 docker ps
来查看正在运行中的 docker 容器,还有一个很实用的命令 docker ps -n x
,该命令会显示最后 x 个容器,不论这些容器是正在运行还是已经停止。
自动重启容器
由于某种错误而导致容器停止运行,可以使用 --restart
命令来重启容器。--restart 会检查容器的退出代码,并据此来决定是否要重启容器。默认的行为是 Docker 不会重启容器。
docker run --restart=always --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1;done"
--restart 标志被设置为 always。无论容器的退出代码是什么,Docker 都会自动重启该容器。除了 always,我们可以将这个标志设置为 on-failure,这样,只有当容器的退出代码为非0 的时候,才会自动重启。另外,on-failure
还接受一个可选的重启次数,如 : --restart=on-failure:5
深入容器
除了使用 docker ps 命令获取正在运行的容器信息,还可以使用 docker inspect
来获取更多的容器信息
下面还有很多信息
我们还可以使用 -f
或者 --format
标志选定查看结果。
删除容器
如果容器已经不在使用,可以使用 docker rm
来删除,如下
目前,还没有办法删除所有的容器,不过可以通过下面的小技巧来删除所有的容器
注意:正在运行的docker 容器是无法删除的,你必须先停止容器的运行,使用 docker stop 或者 docker kill 停止容器,然后才可以删除。
总结
本能文章作为Docker 的入门,主要包括Docker对容器的一些基本用法:
- 查看Docker 基本信息
- 如何运行一个容器
- 给容器命名
- 重启启动容器
- 附着容器
- 创建守护式容器
- 容器日志
- 容器内部运行容器
- 容器停止
- 自动重启容器
- 容器删除
下一篇文章我们会介绍使用 Docker 镜像和仓库
公众号提供 优质Java资料 以及CSDN免费下载 权限,欢迎你关注我
文章参考:
http://www.cloud.tencent.com/developer/article/1341777
《第一本Docker书》
想要获取电子书链接?关注上面公众号,回复002即可获取
作者:cxuan 出处:https://www.cnblogs.com/cxuanBlog/ 本文版权归作者和博客园共有,未经作者允许不能转载,转载需要联系微信: becomecxuan,否则追究法律责任的权利。 如果文中有什么错误,欢迎指出。以免更多的人被误导。 |