如何在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

 

posted @ 2024-08-09 18:27  007少侠  阅读(460)  评论(0编辑  收藏  举报
友情链接:便宜vps(CN2GIA线路)
站长统计: