如何将Docker/Podman容器作为系统服务运行
诸如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.