如何在Docker容器中运行systemd以启动Docker守护进程?
在Docker容器内运行Docker的解决方案
方案一:直接启动Docker守护进程(无需依赖systemd)
这个方案跳过systemd,直接启动dockerd,适合不想折腾systemd的场景:
- 第一步:在容器镜像中安装Docker组件
如果你的基础镜像还没装Docker,根据系统类型执行安装命令:- Debian/Ubuntu系:
apt-get update && apt-get install -y docker.io - RHEL/CentOS系:
yum install -y docker
- Debian/Ubuntu系:
- 第二步:修改启动脚本
start.sh
在原脚本的合适位置添加启动docker daemon的命令,比如后台启动并指定socket:
然后继续执行原# 启动Docker守护进程,后台运行 dockerd --host=unix:///var/run/docker.sock --host=tcp://0.0.0.0:2375 & # 等待Docker daemon启动完成(可选,避免后续命令因服务未就绪报错) sleep 5start.sh的其他业务逻辑。 - 第三步:特权模式启动容器
Docker daemon需要访问内核级资源,必须以特权模式启动容器:docker run --privileged -d [你的镜像名]
方案二:让systemd成为容器PID1(用systemd管理Docker)
如果一定要用systemctl start docker的方式,需要调整容器启动逻辑让systemd作为PID1:
- 第一步:在容器镜像中安装systemd
根据基础镜像类型安装systemd包:- Debian/Ubuntu系:
apt-get update && apt-get install -y systemd - RHEL/CentOS系:大部分默认自带,若缺失执行
yum install -y systemd
- Debian/Ubuntu系:
- 第二步:修改Dockerfile的启动命令
将原来的CMD ["start.sh"]替换为:
这样容器启动时systemd会成为PID1进程。CMD ["/sbin/init"] - 第三步:调整容器启动参数
启动容器时需要挂载cgroup文件系统(systemd依赖)并启用特权模式:docker run --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro -d [你的镜像名] - 第四步:整合原有
start.sh脚本
因为现在systemd是PID1,原start.sh不会自动执行,需要把它加入systemd的启动流程:- 创建systemd服务文件
/etc/systemd/system/start-script.service:[Unit] Description=Start custom script After=docker.service [Service] ExecStart=/path/to/start.sh Type=simple Restart=on-failure [Install] WantedBy=multi-user.target - 启用并启动该服务:
systemctl enable start-script.service systemctl start start-script.service
start.sh的内容追加到/etc/rc.d/rc.local,并给该文件执行权限:echo "/path/to/start.sh" >> /etc/rc.d/rc.local chmod +x /etc/rc.d/rc.local - 创建systemd服务文件
- 第五步:启动Docker服务
现在可以用systemd命令管理Docker了:# 启动Docker systemctl start docker # 设置开机自启(可选) systemctl enable docker
内容的提问来源于stack exchange,提问作者SanjeethBoddi
相关产品推荐
相关产品推荐

