共计 4173 个字符,预计需要花费 11 分钟才能阅读完成。
这篇文章主要介绍“怎么重启 service”,在日常操作中,相信很多人在怎么重启 service 问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么重启 service”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!
当开始使用 Docker 时,人们经常问:“我该如何进入容器?”,其他人会说“在你的容器里运行一个 SSH 服务器”。但是,从这篇博文中你将会了解到你根本不需要运行 SSHd 守护进程来进入你的容器。当然,除非你的容器就是一个 SSH 服务器。
运行 SSH 服务器是很想当然的,因为它提供了进入容器的简便方式。在我们公司基本上每个人都最少使用过一次 SSH。我们中有很大一部分人每天都会使用它,并且他们很熟悉公钥与私钥,无密码登录,密钥代理,甚至有时会使用端口转发和其他不常用的功能。正因如此,人们建议你在容器中运行 SSH 并不奇怪。但你应该仔细考虑下。
假设你正在假设一个 Redis Server 或 Java Webservice 的 Docker 镜像, 我会问你以下几个问题:
你需要用 SSH 来做什么? 一般来说, 你想做备份, 检查日志, 或者重启进程, 调整配置, 还有可能用 gdb, strace 或其他类似的工具来 debug 服务器。那我们会看一下我们怎么不使用 SSH 来做这些事情。
你怎么管理你的密钥和密码的?一般来说,你要么把它们写到你的镜像中,要么就把它们放在一个卷中。你想一下如果你要更新这些密钥或密码你会怎么做呢。如果你把它们写到镜像里了,你就需要重建镜像,重新部署它们,然后重启容器。这还好,不算是世界末日,但是这绝不是一个高大上的方法。把它们放到卷中,然后通过管理卷来管理它们倒是比前一种好得多。这种方法是可用的,可是却有严重的缺陷。你必须要确认容器没有这个卷的写权限;否则,容器有可能会破坏密钥(这让你之后就进不去容器了),如果你再用一个卷共享给多个容器的话,情况会变得更糟。如果不用 SSH,我们不就少一个需要担心的事了吗?
你如何管理安全升级呢?SSH 服务器是挺安全的,但是仍然会有安全问题,你会在必要的时候不得不升级所有使用 SSH 的容器。这意味着大量的重建和重启。也就是说,及时你有一个简单小巧的 memcached 服务,你还是不得不确保及时的安全更新,否则千里之堤可能毁于蚁穴。所以还是这句话,如果不用 SSH,我们不就少一个需要担心的事了吗?
你需要“仅安装一个 SSH 服务器”来达到目的吗?当然不。你需要加装进程管理器,比如 Monit 或者 Supervisor。这是因为 Docker 自己只会监视一个进程。如果你需要运行多个进程,你就必须在上面加装一层可以看着他们的应用。换句话说,你在把简单问题复杂化。如果你的应用停了(正常退出或者崩溃),你必须要从你的进程管理日志里面去查看,而不能简单的查看 Docker 提供的信息。
你可以负责把应用放到容器中,但你是否应该同时负责管理访问策略和安全限制呢?在小机构中,这都不是事。但是在大型机构中,如果你是负责设立应用容器的人,那很可能有另外一个人负责定义远程访问策略。你所在的公司很可能有严格的策略定义说明谁能访问,如何访问或者其他各种审查跟踪的要求。那样的话,你肯定不会被允许把一个 SSH 服务器扔进你的容器中.
但我该如何做…备份我的数据?
你的数据应该存在于 volume 中. 然后你可以使用 –volumes-from 选项来运行另一个容器,与第一个容器共享这个 volume。这样做的好处:如果你需要安装新的工具(如 s75pxd)来将你备份的数据长期保存,或将数据转移到其他永久存储时,你可以在这个特定的备份容器中进行,而不是在主服务容器中。这很简洁。
检查日志?
再次使用 volume! 如果你将所有日志写入一个特定的目录下,且这个目录是一个 volume 的话,那你可以启动另一个 log inspection 容器(使用 –volumes-from,还记得么?) 且在这里面做你需要做的事。如果你还需要特殊的工具(或只需要一个有意思的 ack-grep),你可以在这个容器中安装它们,这样可以保持主容器的原始环境。
重启 service?
基本上所有 service 都可以通过信号来重启。当你使用 /etc/init.d/foo restart 或 service foo restart 时,实际上它们都会给进程发送一个特定的信号。你可以使用 docker kill -s signal 来发送这个信号。一些 service 可能不会监听这些信号,但可以在一个特定的 socket 上接受命令。如果是一个 TCP socket,只需要通过网络连接上就可以了。如果是一个 UNIX 套接字,你可以再次使用 volume。将容器和 service 的控制套接字设置到一个特定的目录中,且这个目录是一个 volume。然后启动一个新的容器来访问这个 volume;这样就可以使用 UNIX 套接字了。
“但这也太复杂了吧!”-其实不然。假设你名为 foo 的 servcie 在 /var/run/foo.sock 创建了一个套接字,且需要你运行 fooctl restart 来完成重启。只需要使用 -v /var/run(或在 Docker 文件中添加 VOLUME /var/run) 来启动这个 service 就可以了。当你想重启的时候,使用 –volumes-from 选项并重载命令来启动相同的镜像。像这样:
# Starting the service
CID=$(docker run -d -v /var/run fooservice)
# Restarting the service with a sidekick container
docker run --volumes-from $CID fooservice fooctl restart
很简单吧!
修改我的配置文件
如果你正在执行一个持久的配置变更,你最好把他的改变放在 image 中,因为如果你又启动一个 container,那么服务还是使用的老的配置,你的配置变更将丢失。所以,没有您的 SSH 访问!“但是我需要在服务存活期间,改变我的配置;例如增加一个新的虚拟站点!”这种情况下,你需要使用……等待……volume!配置应该在 volume 中,并且该 volume 应该和一个特殊目的“配置编辑器”容器共享。你可以在这个容器中使用任何你喜欢的东西:SSH + 你最喜欢的编辑器,或一个接受 API 调用的 web 服务,或一个从外部源抓取信息的定时任务;诸如此类。另外,分离关注:一个容器运行服务,另外一个处理配置更新。“但是我做临时更改,因为我正在测试不同的值!”在这种情况下,查看下一章节!
调试我的应用?
这可能是唯一需要进入 container 的场景了。因为你要运行 gdb, strace, tweak 配置,等。这种情况下,你需要 nsenter。
介绍 nsenter
nsenter 是一个小的工具,用来进入命名空间中。技术上,它可以进入现有的命名空间,或者产生一个进程进入新的一组命名空间。“命名空间是什么?”他们是容器的重要组成部分。简单点说:通过使用 nsenter,你可以进入一个已经存在的 container 中,尽管这个 container 没有运行 ssh 或者任意特殊用途的守护进程。
从哪里获得 nsenter?
在 GitHub 上查看 jpetazzo/nsenter 。简单的安装是:
docker run -v /usr/local/bin:/target jpetazzo/nsenter
它将会把 nsenter 安装到 /usr/local/bin 中,你就可以立刻使用它了。
nsenter 也可以在你的发行版中获得(在 util-linux 包中)。
如何使用?
首先,计算出你要进入容器的 PID:
PID=$(docker inspect --format {{.State.Pid}} container_name_or_ID )
然后进入容器:
nsenter --target $PID --mount --uts --ipc --net --pid
在容器里,可以操作 shell 解析器。如果要想以自动化的方式来运行特殊的脚本或程序,把它作为参数添加到 nsenter 中。除了它使用容器代替了简单目录来工作外,它的工作方式有点像 chroot。
远程访问怎么样?
如果你需要从一个远程主机进入一个容器,有(至少)两个方法:
SSH 进入 Docker 主机,并使用 nsenter;
SSH 进入 Docker 主机,通过一个特殊的密钥参数授权 esenter 命令 (也就是,nsenter)。
第一种方法相对简单;但是需要 root 权限访问 Docker 主机(从安全角度来说不是很好)。第二种方法在 SSH 的 authorized_keys 文件中使用 command= 模式。你可能熟悉 “古典的” authorized_keys 文件,它看起来像这样:
ssh-rsa AAAAB3N…QOID== jpetazzo@tarrasque
(当然,实际上一个真正的密钥是很长的,一般都会占据好几行。)你也可以强制使用一个专有的命令。如果你想要在你的系统上查看一个远程的主机上可以有效使用的内存,可以使用 SSH 密钥,但是你不会希望交出所有的 shell 权限,你可以在 authorized_keys 文件中输入下面的内容:
command= free ssh-rsa AAAAB3N…QOID== jpetazzo@tarrasque
现在,当使用专有的密钥进行连接时,替换取得的 shell,它可以执行 free 命令。除此之外,就不能做其他的。(通常,你可能还想要添加 no-port-forwarding;如果希望了解更多信息可以查看 authorized_keys(5) 的手册(manpage))。这种机制的关键是使得责任分离。Alice 把服务放在容器内部;她不用处理远程的访问,登陆等事务。Betty 会添加 SSH 层,在特殊情况(调试奇怪的问题)下使用。Charlotte 会考虑登陆。等等。
到此,关于“怎么重启 service”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!