朝花夕拾|勿忘初心 朝花夕拾|勿忘初心

Docker 入门

in Docker read (394) 2125汉字 站长Lucifaer 文章转载请注明来源!

运行docker

docker run -i -t ubuntu /bin/bash

首先告诉Docker执行docker run命令,并指定-i-t两个命令行参数。

  • -i标志保证容器中STDIN是开启的,尽管我们并没有附着到容器中。
  • -t标志告诉Docker为要创建的容器分配一个伪tty终端。这样,新创建的容器才能提供一个交互式shell。

若要在命令行下创建一个我们能与之进行交互的容器,而不是一个运行后台服务的容器,这两个参数已经是最基本的参数了。

接下来,我们告诉Docker基于什么镜像来创建容器,示例中使用的ubuntu镜像。

Docker首先会检查本地是否存在Ubuntu镜像,如果本地还没有该镜像,那么Docker就会链接官方维护的Docker Hub Registry,查看Docker Hub中是否有该镜像。Docker一旦找到该镜像,就会下载该镜像并将其保存到本地宿主机中。

随后,Docker在文件系统内部用这个镜像创建了一个新容器。该容器拥有自己的网络、IP地址,以及一个用来和宿主机进行通信的网桥网络接口。最后,我们告诉Docker在新容器中要运行什么命令,在本例中我们在容器中运行了/bin/bash命令启动了一个Bash shell。

使用docker

  • 获取容器的主机名:hostname
  • 在交互式shell中可以执行相应的linux命令
  • 退出容器:exit

当执行完exit命令,就可以返回到Ubuntu宿主机的命令行提示符。

而现在这个容器处于停止运行状态了。只有在指定的/bin/bash命令处于运行状态的时候,容器才会相应的处于运行状态。一旦退出容器,/bin/bash命令也就结束了,这时容器也随之停止了运行。

但容器仍然存在,可以通过docker ps -a来查看当前操作系统中容器的列表。

关于docker ps
默认情况下,当执行docker ps命令时,只能看到正在运行的容器。如果指定-a标志的话,那么docker ps命令会列出所有容器,包括正在运行的和已经停止的。
也可以为docker ps命令指定-l标志,列出最后一个运行的容器,无论其正在运行还是已经停止。也可以通过--format标志,进一步控制显示哪些信息,以及如何显示这些信息。

容器命名

Docker会为我们创建的每一个容器自动生成一个随机的名称。如果想为容器指定一个名称,而不是使用自动生成的名称,则可以用--name标志来实现。

docker run --name lucifaer_container -i -t ubuntu /bin/bash

一个合法的容器名称用正则来表示,就是[a-zA-Z0-9_.-]

在很多Docker命令中,都可以用容器的名称来替代容器ID。容器名称有助于分辨容器,当构建容器和应用程序之间的逻辑连接时,容器的名称也有助于从逻辑上理解连接关系。

容器的命名必须是唯一的。如果试图创建两个名称相同的容器,则命令将会失败。如果要使用的容器名称已经存在,可以先用docker rm命令删除已有的同名容器后,再来创建新的容器。

重新启动已经停止的容器

docker start lucifaer_container

也可以用docker restart命令来重启一个容器。

附着到容器上

Docker容器重新启动的时候,会沿用docker run命令时指定的参数来运行,因此我们的容器重新启动后会运行一个交互式会话shell。此外也可以使用docker attach命令,重新附着到该容器的会话上。

可能需要摁下回车才能进入该会话 :D

创建守护式容器

除了交互式运行的容器,也可以创建长期运行的容器。守护式容器没有交互式会话,非常适合运行应用程序和服务。大多数时候都需要以守护式来运行我们的容器。下面启动一个守护式容器:

docker run --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

上面的docker run命令使用了-d参数,因此Docker会将容器放到后台执行。

查看容器日志

使用docker logs来获取容器的日志。同时我们也可以使用-f参数来监控Docker的日志。

也可以跟踪日志的某一片段,只需要在tail命令后加入-f --tail标志即可。例如,获取日志的最后10行内容:

docker logs --tail 10 daemon_dave

另外也可以通过:

docker logs --tail 0 -f daemon_dave

来跟踪某个容器的最新日志而不必读取整个日志文件。

为了让调试更简单,还可以使用-t标志为每条日志项加上时间戳。

Docker日志驱动

自Docker1.6开始,也可以控制Docker守护进程和容器所用的日志驱动,这可以通过--log-driver选项来实现。可以在启动Docker守护进程或者执行docker run命令时使用这个选项。

有好几个选项,包括默认的json-filejson-file也位我们前面看到的docker logs命令提供了基础。

其他可用的选项还包括syslog,该选项将禁用docker logs命令,并且将所有容器的日志输出都重定向到Syslog。可以启动Docker守护进程时指定该选项,将所有容器的日志都输出到Syslog,或者通过docker run对个别的容器进行日志重定向输出。

docker run --log-driver="syslog" --name daemon_dwayne -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

上面的命令会将daem_dwayne容器的日志都输出到Syslog,导致docker logs命令不输出任何东西。

最后还有一个可用的选项是none,这个选项会禁用所有容器中的日志,导致docker logs命令也被禁用。

查看容器内的进程

除了容器的日志,也可以查看容器内部运行的进程。要做到这一点,要使用docker top命令。

docker top daemon_dave

该命令执行后,可以看到容器内的所有进程(主要还是while循环)、运行进程的用户及进程ID。

Docker统计信息

除了docker top命令,还可以使用docker state命令,它用来显示一个或多个容器的统计信息。它的输出为一个守护式容器的列表,以及它们的CPU、内存、网络I/O及存储I/O的性能和标志。这对快速监控一台主机上的一组容器非常有用。

在容器内部运行进程

Docker 1.3之后,可以通过docker exec命令在容器内部额外启动新进程。可以在容器内运行的进程有两种类型:后台任务和交互式任务。

后台任务在容器内运行且没有交互需求,而交互式任务则保持在前台运行。对于需要再容器内部打开shell的任务,交互式任务是很实用的。

这个是后台任务的例子:

dcoker exec -d daemon_dave touch /etc/new_config_file

这里的-d标志表明需要运行一个后台进程,-d标识后,指定的是要在内部执行这个命令的容器的名字以及要执行的命令。上例中的命令会在daemon_dave容器内创建一个空文件。通过docker exec后台命令,可以在正在运行的容器中进行维护、监控及管理任务。

从Docker 1.7开始,可以对docker exec启动的进程使用-u标志为新启动的进程指定一个用户属主。

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

docker exec -t -i daemon_dave /bin/bash

停止守护式容器

要停止守护式容器,只需要执行docker stop命令即可。

docker stop daemon_dave

既可以通过容器名,也可以通过容器ID来停止容器。

自动重启容器

如果由于某种错误而导致容器停止运行,还可以通过--restart标志,让Docker自己重新启动该容器。--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

表示,当容器退出代码为非0时,Docker会尝试重启该容器,最多重启5次。

删除容器

可以使用命令docker rm来删除不用的容器。

从Docker 1.6.2开始,可以通过给docker rm命令传递-f标志来删除运行中的Docker容器。

如果想一次删除所有的的容器可以用:

docker rm `sudo docker ps -a -q`

docker ps会列出现有的全部容器,-a标志代表列出所有容器,而-q标志则表示只需要返回容器的ID而不会返回容器的其他信息。

docker
最后由Lucifaer修改于2017-06-01 00:32

此处评论已关闭

博客已萌萌哒运行
© 2018 由 Typecho 强力驱动.Theme by Yodu
PREVIOUS NEXT
雷姆
拉姆