如何在Docker容器中的Linux系统(Ubuntu + Centos Linux)里面使用systemctl
前言
正常情况下Docker容器里面运行的Linux是没有systemd进程的,所以不能正常开启systemctl
我们还是希望使用systemd来管理我们的服务,如何开启systemd呢?
通常,Docker 容器是为了运行单个应用程序而设计的,而不是一个完整的操作系统。因此,通常容器中不需要像 systemd
这样复杂的初始化系统。然而,有些场景下,特别是需要管理多个服务、模拟完整的操作系统环境,或者需要特定的服务依赖 systemd
,在这种情况下运行 systemd
是合理的。
通过在 Docker 容器中启动 systemd
,你可以在容器内使用服务管理工具(如 systemctl
)来管理服务,使得容器内的行为更加接近于完整的 Linux 系统。
实现方案:
systemd
作为初始化系统: 在容器内作为 PID 1 进程运行,负责管理容器内的所有服务和进程。exec
命令: 用于确保systemd
作为容器的主要进程,直接取代启动脚本的进程
正式教程
准备工作
1. 宿主机安装好Docker
一、Ubuntu
1. 创建 Dockerfile
(1). 在宿主机上新建Dockerfile构建文件,以下为Linux系统的宿主机执行命令,如果是Windows和MacOS自行修改(就是新建一个目录和一个构建文件Dockerfile)
# 进入用户目录 cd # 新建一个管理目录 mkdir ubuntu-systemd && cd ubuntu-systemd # 新建一个Docker配置文件 vim Dockerfile
(2). 粘贴如下内容并保存
# 使用 Ubuntu 22.04 作为基础镜像 FROM ubuntu:22.04 # 更新包列表并安装 systemd RUN apt-get update && \ apt-get install -y systemd systemd-sysv locales sudo vim make curl wget net-tools && \ locale-gen en_US.UTF-8 && \ dpkg-reconfigure locales && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* # 设置环境变量以使用 UTF-8 编码 ENV LANG=C.UTF-8 ENV LC_ALL=C.UTF-8 # 将启动脚本复制到容器中 COPY start.sh /start.sh RUN chmod +x /start.sh # 设置默认的启动命令 CMD ["/start.sh"]
2. 创建启动脚本 start.sh
(1). 执行命令
vim start.sh
(2). 粘贴如下内容并保存
#!/bin/bash
# 启动 systemd
exec /lib/systemd/systemd
3. 正式构建Ubuntu镜像
# 注:后面的点号别漏了 docker build -t ubuntu-systemd:22.04 .
4. 运行构建好的容器
docker run --privileged -d -p 22:22 --name ubuntu-systemd ubuntu-systemd:22.04
5. 进入容器
# 查看是否正常启动 docker ps # 进入容器 docker exec -it ubuntu-systemd /bin/bash # 如果想进入时提前执行一些命令,可以用如下方式进入 # docker exec -it ubuntu-systemd bash -c "service ssh restart && exec bash"
6. 之后可以用top命令查看是否成功(PID为1)
# 执行 top # 显示如下 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 99784 10608 8288 S 0.0 1.1 0:00.22 systemd
7. 配置东八区时区(可选)
(1). 安装
apt-get install -y tzdata # 选 Asia => Shanghai # 如果要为已安装tzdata的系统设置可用如下命令 timedatectl set-timezone Asia/Shanghai # 查看时间 date -R
(2). 同步时间
# 安装ntp sudo apt update && sudo apt install -y ntp vim /etc/ntp.conf # 配置如下 server 0.pool.ntp.org server 1.pool.ntp.org server 2.pool.ntp.org server 3.pool.ntp.org # 对于中国大陆用户,可以使用中国国家授时中心的NTP服务器 server ntp.ntsc.ac.cn # 设置好保存 # 检查NTP服务是否正在运行 sudo systemctl status ntp # 没运行先启动 sudo systemctl start ntp # 设置开机自启 sudo systemctl enable ntp ntpq -p # 如果想立即同步时间,可以使用ntpd命令与NTP服务器强制同步: sudo ntpd -gq
二、Centos
1. 创建 Dockerfile
(1). 在宿主机上新建Dockerfile构建文件,以下为Linux系统的宿主机执行命令,如果是Windows和MacOS自行修改(就是新建一个目录和一个构建文件Dockerfile)
# 进入用户目录 cd # 新建一个管理目录 mkdir centos7-systemd && cd centos7-systemd # 新建一个Docker配置文件 vim Dockerfile
(2). 粘贴如下内容并保存
# 使用 CentOS 7 作为基础镜像 FROM centos:7 # 替换镜像源为Vault CentOS镜像源 RUN sed -i 's|^mirrorlist=|#mirrorlist=|g' /etc/yum.repos.d/CentOS-Base.repo && \ sed -i 's|^#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-Base.repo # 安装必要的软件包,包括 systemd RUN yum update -y && \ yum -y install systemd systemd-libs systemd-sysv initscripts sudo vim make curl wget net-tools && \ yum clean all && \ rm -rf /var/cache/yum/* # 将启动脚本复制到容器中 COPY start.sh /start.sh RUN chmod +x /start.sh # 设置默认的启动命令 CMD ["/start.sh"]
2. 创建启动脚本 start.sh
(1). 执行命令
vim start.sh
(2). 粘贴如下内容并保存
#!/bin/bash
# 启动 systemd
exec /usr/sbin/init
3. 正式构建Centos镜像
# 注:后面的点号别漏了
docker build -t centos7-systemd .
4. 运行构建好的容器
docker run --privileged -d -p 22:22 --name centos7-systemd centos7-systemd
5. 进入容器
# 查看是否正常启动 docker ps # 进入容器 docker exec -it centos7-systemd /bin/bash # 如果想进入时提前执行一些命令,可以用如下方式进入 # docker exec -it centos7-systemd bash -c "service ssh restart && exec bash"
6. 之后可以用top命令查看是否成功(PID为1)
# 执行 top # 显示如下 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 43248 5116 4036 S 0.0 0.5 0:00.17 systemd
7. 配置东八区时区(可选)
(1). 安装
yum install -y tzdata # 选 Asia => Shanghai # 如果要为已安装tzdata的系统设置可用如下命令 timedatectl set-timezone Asia/Shanghai # 查看时间 date -R
(2). 同步时间
# 安装ntp sudo yum update && sudo yum install -y ntp vim /etc/ntp.conf # 配置如下 server 0.pool.ntp.org server 1.pool.ntp.org server 2.pool.ntp.org server 3.pool.ntp.org # 对于中国大陆用户,可以使用中国国家授时中心的NTP服务器 server ntp.ntsc.ac.cn # 设置好保存 # 检查NTP服务是否正在运行 sudo systemctl status ntpd # 没运行先启动 sudo systemctl start ntpd # 设置开机自启 sudo systemctl enable ntpd ntpq -p # 如果想立即同步时间,可以使用ntpd命令与NTP服务器强制同步: sudo ntpd -gq
三、一些基础服务(可选)
1. 系统日志服务
Ubuntu
# 安装 sudo apt-get install rsyslog -y # 设置开机自启 sudo systemctl enable rsyslog # 启动 sudo systemctl start rsyslog
Centos7
# 安装 sudo yum install -y rsyslog # 设置开机自启 sudo systemctl enable rsyslog # 启动 sudo systemctl start rsyslog