如何将Docker/Podman容器作为系统服务运行

时间:2020-02-23 14:31:48  来源:igfitidea点击:

诸如Podman或者Docker之类的容器引擎没有能力/功能来管理系统服务,例如停止服务,启动顺序,依赖关系检查和故障服务的恢复。这很可能是由于专门开发了其他初始化应用程序(例如init和systemd)来实现此目的的原因,因为它们具有注入的美感。

好消息是,现在可以通过类似的方式来管理Podman/Docker容器,从而可以管理httpd,nginx或者我们习惯的任何其他服务。换句话说,我们可以使主机启动,停止,启用,检查状态,并通常将容器作为系统服务进行管理,我们将在本教程中学习如何做。

在我们开始之前,另一个漂亮的功能是,当容器启动时,还可以使用systemd来启动安装在容器中的给定服务,例如Nginx。

使用systemd启动容器

如果我们尚未安装Podman,请运行以下命令以加快速度

######## CentOS 8/RHEL 8 ##########
sudo dnf -y install podman

在Ubuntu上安装Podman

请按照以下教程在Ubuntu上安装podman:

如何在Ubuntu上安装Podman

让我们开始使用systemd进行运行,启动,停止和检查集装箱的状态。

第1步:如果没有镜像,则拉取镜像

作为示例,让我们从Docker注册表中提取一个Nginx容器

$podman pull docker.io/nginx

检查镜像是否成功拉取

$podman images

REPOSITORY                TAG      IMAGE ID       CREATED        SIZE   
localhost/firstapache     latest   a0c546bc3927   23 hours ago   1.68 GB
docker.io/library/nginx   latest   602e111c06b6   32 hours ago   131 MB

使用Podman运行容器

在这一步中,我们将初始化图像以使用我们选择的名称作为图像运行。如果我们使用的是CentOS/RHEL并且坚持使用SELinux,则必须打开container_manage_cgroup布尔值以使用systemd运行容器,如下所示

sudo setsebool -P container_manage_cgroup on

之后,继续运行容器

$sudo podman run -d --name nginx_server -p 7070:80 nginx
384a42964b1b133d82320ebaa2f54407c7ca23d06154a5f413c8119026bda231

要确认容器正在运行,请运行podman ps命令

$sudo podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED         STATUS             PORTS                 NAMES
384a42964b1b  docker.io/library/nginx:latest  nginx -g daemon o...  48 seconds ago  Up 46 seconds ago  0.0.0.0:7070->80/tcp  nginx_server

将容器配置为systemd服务

我们将在/etc/systemd/system /目录中创建单元配置文件。作为示例,我们将在名为/etc/systemd/system/nginx-container.service的目录中创建一个文件。在文件中,填充如下所示的熟悉的详细信息,并确保nginx_server与在中使用podman运行时为容器提供的名称相同。如果不确定,只需运行sudo podman ps并检查"名称"列。

$sudo vim /etc/systemd/system/nginx-container.service

[Unit]
Description=Cool Nginx container
Wants=syslog.service

[Service]
Restart=always
ExecStart=/usr/bin/podman start -a nginx_server
ExecStop=/usr/bin/podman stop -t 2 nginx_server

[Install]
WantedBy=multi-user.target

如此简单,我们就可以像使用systemd的任何其他服务一样管理容器了。

测试设定是否有效

启动服务
运行通常的systemd start命令以启动我们的服务

sudo systemctl start nginx-container

检查其状态

$systemctl status nginx-container

● nginx-container.service - Cool Nginx container
   Loaded: loaded (/etc/systemd/system/nginx-container.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2017-04-24 21:58:15 UTC; 9s ago
 Main PID: 3910 (podman)
    Tasks: 11 (limit: 11121)
   Memory: 32.2M
   CGroup: /system.slice/nginx-container.service
           └─3910 /usr/bin/podman start -a nginx_server

如果我们希望在系统启动时运行容器,只需按如下所示启用它

$sudo systemctl enable nginx-container

Created symlink /etc/systemd/system/local.target.wants/nginx-container.service → /etc/systemd/system/nginx-container.service.