docker 容器运行Ubuntu16.04并使用systemd
报错
最近使用docker运行ubuntu16.04镜像,进入镜像后使用systemctl
命令后发现报错,报错如下:
1 |
|
原因
查到原因如下:
Docker的设计理念是在容器里面不运行后台服务,容器本身就是宿主机上的一个独立的主进程,也可以间接的理解为就是容器里运行服务的应用进程。一个容器的生命周期是围绕这个主进程存在的,所以正确的使用容器方法是将里面的服务运行在前台。
再说到systemd,这个套件已经成为主流Linux发行版(比如CentOS7、Ubuntu14+)默认的服务管理,取代了传统的SystemV风格服务管理。systemd维护系统服务程序,它需要特权去会访问Linux内核。而容器并不是一个完整的操作系统,只有一个文件系统,而且默认启动只是普通用户这样的权限访问Linux内核,也就是没有特权,所以自然就用不了!
因此,请遵守容器设计原则,一个容器里运行一个前台服务!
解决方法
但是有时候我们只是想去容器里面实现一些功能,我就是想运行后台服务怎么办? 网上大部分解决方法如下:
- 创建容器:
1 |
|
- 进入容器:
1 |
|
新的问题
但是我按照此步骤操作时遇到了下面的错误:
1 |
|
最终答案
看报错信息应该是不存在/usr/sbin/init/
这个文件。 原因是上面的解决方法只适用于Centos
系统,而我容器里面跑的是Ubuntu
系统,Ubuntu
里面的systemd
文件名实际路径为/sbin/init
。 所以解决方法如下:
- 创建容器:
1 |
|
- 进入容器:
1 |
|
这时候发现已经可以使用systemctl
命令了,问题解决!
docker 容器运行Ubuntu16.04并使用systemd
https://www.shangyexin.com/2020/01/20/docker-ubuntu-use-systemd/