ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

docker入门~守护进程容器管理(2)

2022-01-21 17:00:21  阅读:213  来源: 互联网

标签:容器 daemon 入门 dave world docker hello 守护


除了交互式的容器(interactive container),我们也可以创建长期运行的容器。守护式容器(daemonized container)没有交互式会话,非常适合运行应用程序和服务。大多数时候我们都需要以守护式来运行我们的容器。

创建守护式容器

# docker run --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 5; done"
f22acef0ab7bc0c8b7492491879245f83e1872645fb7e8db5015c921c8eccd08
  • -d 参数,docker会将容器放到后台运行,并返回容器ID

我们还在容器要运行的命令里使用了一个while循环,该循环会一直打印hello world,直到容器或其进程停止运行。通过组合使用上面的这些参数,可以发现docker run命令并没有像上一个容器一样将主机的控制台附着到新的shell会话上,而是仅仅返回了一个容器ID而已,我们还是在宿主机的命令行之中。通过docker ps (-a)命令可以看到一个正在运行的容器。

# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED             STATUS                         PORTS     NAMES
f22acef0ab7b   ubuntu    "/bin/sh -c 'while t…"   9 minutes ago       Up 7 seconds                             daemon_dave
09a97b511ef2   ubuntu    "/bin/bash"              About an hour ago   Exited (0) About an hour ago             agitated_lovelace

# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS          PORTS     NAMES
f22acef0ab7b   ubuntu    "/bin/sh -c 'while t…"   9 minutes ago   Up 12 seconds             daemon_dave

同时我们也可以通过docker logs(--tail -f -t)命令来获取容器的日志,探究该容器内部都在干什么。

##
# 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 -f -t daemon_dave
2022-01-21T08:30:17.374984918Z hello world
2022-01-21T08:30:22.375693228Z hello world
2022-01-21T08:30:27.376415470Z hello world

查看容器内的进程:

除了容器的日志,我们也可以查看容器内部运行的进程。通过docker top我们可以看到容器内所有的进程:

# docker top daemon_dave
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                4227                4197                0                   16:25               ?                   00:00:00            /bin/sh -c while true; do echo hello world; sleep 5; done
root                5766                4227                0                   16:32               ?                   00:00:00            sleep 5

 在容器内部运行进程:

我们可以通过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@f22acef0ab7b:/# ls -l /etc/new_config_file
-rw-r--r-- 1 root root 0 Jan 21 08:34 /etc/new_config_file
root@f22acef0ab7b:/# ll

和运行交互容器时一样,这里的-t 和 -i 标志为我们执行的进程创建了TTY并捕捉STDIN。这条命令会在daemon_dave容器内创建一个新的bash会话,有了这个会话,我们就可以在该容器中运行其他命令了。这里我们找到了之前我们通过后台任务创建的文件。

停止守护式容器:

## 只需要执行docker stop + 容器名 命令,就可以停止守护式容器
# docker stop daemon_dave
daemon_dave
# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED             STATUS                         PORTS     NAMES
f22acef0ab7b   ubuntu    "/bin/sh -c 'while t…"   23 minutes ago      Exited (130) 42 seconds ago              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 5; done"
gfe3w4b02e2593605821dc53c4rfea7ec3d899red4bd56902f1c0a548c85eer4

这里--restart标志被设置为always。无论容器的退出代码是什么,Docker都会自动重启该容器。除了always,我们还可以将这个标志设为on-failure,这样,只有当容器的退出代码为非0值的时候,才会自动重启。另外,on-failure还接受一个可选的重启次数参数

--restart=on-failure:5

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

 

深入容器

除了通过docker ps命令获取容器的信息,我们还可以使用docker inspect来获取更多的容器信息。docker inspect命令会对容器进行详细的检查,然后返回其配置信息,包括名称、命令、网络配置以及很多有用的数据。

# docker inspect daemon_dave

我们也可以用-f或者--format标志来选定查看结果

## 这条命令会返回容器的运行状态
# docker inspect --format='{{ .State.Running }}' daemon_dave
true
 
## 我们还可以通过它来获取容器的IP地址等
# docker inspect --format='{{ .NetworkSettings.IPAddress }}' daemon_dave
172.17.0.2
 
## 我们也可以同时指定多个容器,并显示每个容器的输出结果
# docker inspect --format='{{ .Name }} {{ .State.Running }}' daemon_dave agitated_lovelace
/daemon_dave true
/agitated_lovelace 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 rm `docker ps -a -q`删除所有容器。原理:docker ps -a 会列出现有的全部容器,而-q标志则是表示只需要返回容器的ID而不返回容器的其他信息,并传递给了docker rm命令,从而达到删除所有容器的目的。

标签:容器,daemon,入门,dave,world,docker,hello,守护
来源: https://www.cnblogs.com/test_home_c/p/15830922.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有