[DevOps翻译]如何通过systemd运行一个Docker化的服务

131 阅读4分钟

本文由 简悦SimpRead 转码,原文地址 jugmac00.github.io

直到最近,我都没有看到使用Docker的好理由,因为我选择的部署工具产生了approxim......。

直到最近,我认为没有很好的理由使用Docker,因为我选择的部署工具在我的Ubuntu笔记本上、在staging和production上产生的构建都是大致相同的。

但时间不会停滞不前,尤其是当我要部署一个Java应用程序时,是时候重新考虑我的策略了,因为我不想玩哪个Java运行时环境与哪个应用程序版本配合得好的游戏。

幸运的是,JetBrainsYouTrack提供了预构建的docker镜像,这是我最喜欢的问题跟踪器,也是我今天打算安装的应用。

简单并不总是更好

有了预置的Docker镜像,运行应用程序就可以简单到......

docker run -it --name youtrack-server-instance  \
    -v {path to data directory}:/opt/youtrack/data \
    -v {path to conf directory}:/opt/youtrack/conf  \
    -v {path to logs directory}:/opt/youtrack/logs  \
    -v {path to backups directory}:/opt/youtrack/backups  \
    -p {port on host}:8080 \
    jetbrains/youtrack:{version}

......但是输入这么长的命令是很乏味的,而且这个过程在主机系统重启后也会失效。

注意

你知道docker createdocker rundocker start之间的区别吗?

既然我们在这里,让我们来剖析一下这个复杂的命令。

  • run创建并启动一个容器
  • -it提供一个交互式的tty,即在终端显示输出
  • --name给容器一个名字
  • -v在主机和容器之间映射文件夹
  • -p在主机和容器之间映射端口
  • jetbrains/youtrack:{version}是最后的docker镜像。

以systemd服务的形式运行docker容器

与其手动启动docker服务,不如使用systemd来启动它,即使在重启后也是如此。

JetBrains提供了一个简明文档,介绍如何做到这一点。

单元文件

基本上,只要在/etc/systemd/system/docker.youtrack.service创建一个单元文件,内容如下

[Unit]
Description=YouTrack Service
After=docker.service
Requires=docker.service

[Service]
TimeoutStartSec=0
Restart=always
ExecStartPre=-/usr/bin/docker exec %n stop
ExecStartPre=-/usr/bin/docker rm %n
ExecStartPre=/usr/bin/docker pull jetbrains/youtrack:<version>
ExecStart=/usr/bin/docker run --rm --name %n \
    -v <path to data directory>:/opt/youtrack/data \
    -v <path to conf directory>:/opt/youtrack/conf \
    -v <path to logs directory>:/opt/youtrack/logs \
    -v <path to backups directory>:/opt/youtrack/backups \
    -p <port on host>:8080 \
    jetbrains/youtrack:<version>

[Install]
WantedBy=default.target

......其中,在一个非常高的水平上。

  • 单元部分给这个服务一个名字,并定义了前提条件和依赖性。
  • 服务部分配置了要执行的命令。
  • 而安装部分定义了这个服务应该何时启动。

最后,你可以通过systemctl enable docker.youtrack来启用它,这样它就会在下次重启后启动,并通过sudo service docker.youtrack start/sudo service docker.youtrack stop手动启动和停止。

一些故障

这一切都运行得很好,YouTrack可以通过我的浏览器使用,只是我对systemctl status docker.youtrack的输出有点担心......

为什么会有两个失败?

根据我对Docker的了解,运行命令应该是创建并启动一个容器,所以这个容器应该是持久的,即使在重启后也是如此。

这最终意味着,systemd应该成功地停止和删除docker容器,例如,在重启时。

剖析单元文件中的服务部分

让我们再来看看上面的 Service 部分,特别是下面两行。

ExecStartPre=-/usr/bin/docker exec %n stop
ExecStartPre=-/usr/bin/docker rm %n
  • ExecStartPre是很好的自我解释,意思是 "在启动服务前执行这个命令"
  • 命令前的破折号,-,意味着当下面的命令失败时,它是可以的 = 不要在失败时停止!
  • %n扩展到服务,即docker.youtrack.service

所以,这意味着,失败是可以预期的!

让我们来看看run命令...

ExecStart=/usr/bin/docker run --rm --name %n

  • ExecStart是主进程
  • docker run,正如我们现在所知道的,创建并启动一个容器
  • --rm--在这里,这将确保容器在退出时被删除!
  • --name设置容器的名称
  • %n是服务的占位符

结论

一切都像预期的那样工作!

stopdelete命令只是安全防护措施,以防存在另一个同名的容器,或者甚至正在运行。

运行预先构建的Docker镜像是一件很容易的事。

但你肯定应该知道这些基本知识 :-)


www.deepl.com 翻译