因为要在docker里面配置一些工具,但很多工具的自动化安装脚本都依赖于systemd服务,而docker本身是没有自带systemd的。
因为要使用别的初始镜像(例如nvidia的cuda官方镜像),不能直接使用已经安装好systemd的官方镜像,因此研究了一番如何在现有容器上启用systemd服务。

docker的基本操作参考:docker使用命令笔记

主机操作系统:Ubuntu22.04
docker操作系统:Ubuntu22.04

1、安装systemd

简单地在容器中运行命令:

apt-get install -y systemd systemd-sysv 

2、将docker打包为镜像

由于systemd服务涉及系统初始化,因此需要重新构造容器启动点,所以要从镜像重新构造一个新的容器。

3、从镜像新建启动时运行systemd服务的容器

重要启动参数说明:

-d # -d后台运行
--gpus all \ # 使用所有GPU
--privileged \ # 给予足够的权限
--cgroupns=host \  # 强制使用宿主机的cgroup命名空间
-v /sys/fs/cgroup:/sys/fs/cgroup \ # 挂载cgroup,systemd依赖它管理进程
--tmpfs /sys/fs/cgroup/systemd \  # 为systemd单独挂载临时目录
-it my_image:250915_1441 /sbin/init  # 以init作为入口,启动systemd

因此,一个创建容器的命令样例是:

docker run -d \
--name new_container --gpus all \
--privileged \
--cgroupns=host \
-v /sys/fs/cgroup:/sys/fs/cgroup \
--tmpfs /sys/fs/cgroup/systemd \
-it my_image:250915_1441 /sbin/init

运行命令后,终端不会进入容器内部终端,而是让容器在后台运行。
然后手动进入容器的bash终端:

docker exec -it new_container bash

测试systemd服务运行状态:

systemctl status

发现输出为:

State: running

此时,就可以正常安装其它依赖于systemd服务的工具了。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐