首页 > 系统相关 >如何在Docker容器中的Linux系统(Ubuntu + Centos Linux)里面使用systemctl

如何在Docker容器中的Linux系统(Ubuntu + Centos Linux)里面使用systemctl

时间:2024-08-09 18:27:46浏览次数:12  
标签:systemd Centos ntp sudo start systemctl && Linux

前言

正常情况下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

 

标签:systemd,Centos,ntp,sudo,start,systemctl,&&,Linux
From: https://www.cnblogs.com/007sx/p/18351278

相关文章

  • Linux字符设备驱动开发
    旧模板在2.3小节。新模版在5.3小节。应用程序和驱动的交互原理驱动就是获取外设或者传感器数据,控制外设。数据会提交给应用程序。Linux驱动编写既要编写一个驱动,还要编写一个简单的测试应用程序,APP。单片机下驱动和应用都是放在一个文件里面,杂糅到一起。Linux下驱动和应用......
  • Linux
    一、安装Centex和ubantu1.安装Centex:a:下载安装vm虚拟机平台。b:从开源网站下载Centex镜像文件,网易开源镜像网站http://mirrors.163.com/c:在vm上创建虚拟机。(Centex难用,命令行练习机)2.安装ubantu子系统:a:ubantu官网https://cn.ubuntu.com/download安装镜像文件。b:安装......
  • Linux 进程调度(二)之进程的上下文切换
    目录一、概述二、上下文切换的实现1、context_switch2、switch_mm3、switch_to三、观测进程上下文切换一、概述进程的上下文切换是指在多任务操作系统中,当操作系统决定要切换当前运行的进程时,将当前进程的状态保存起来,并恢复下一个要运行的进程的状态。上下文切换......
  • 【迅为电子】IMX6ULL开发板嵌入式linux开发指南第七章 Linux 常用命令第一部分
        物联网时代,各种传感器的采集和处理技术是需要我们掌握的,迅为IMX6ULL开发板标配了各种传感器设备,包括陀螺仪、重力加速度计和光传感器、红外接收、EEPROM存储,也可以选配温湿度传感器,其他如摄像头(含CMOS和USB两种)、VGA显示、GPS定位功能、RFID门禁、继电器输出、步进电......
  • Linux的一些常用指令
    记录了一些Linux常用的指令,包括基础指令,网络故障排查时的指令和系统故障排查时的指令。1.基础指令1.ls用于显示当前目录下的文件和目录。-l:以长格式显示,包括文件的详细信息,如权限、所有者、大小、修改时间等;-a:显示所有文件,包括隐藏文件(以.开头的文件);-h:以更易读的方式显示......
  • Linux内核及补丁编译
    Linux内核及补丁编译一、源码下载1、查看当前linux内核版本uname-r2、获取对应版本的linux源码方式1:源方式下载sudoaptsearchlinux-source##找到对应版本的linux-sourcesudoaptinstalllinux-source-5.4.0##以5.4.0举例mkdir~/Projectscd~/Projectssudocp......
  • Linux三剑客之sed
    工作原理sed是StreamEditor(流编辑器)的缩写,简称(行)流编辑器;用来处理文件的。首先sed读取文件中的一行内容,把其保存在一个临时内存空间中(也称为模式空间);然后根据需求处理临时缓冲区中的行,完成后把该行发送到屏幕上;默认不编辑源文件,只对模式空间做处理。(由于sed把每一行都存在......
  • Centos上Jenkins+git+allure使用教程
    1、Jenkins上下载allure 2、下载安装完成后重启Jenkins,然后查看allure插件安装成功,如下图所示 3、Jenkins服务器上,安装allure-2.26.0,安装完成后配置环境变量,vi/etc/profile配置环境变量添加exportPATH=$PATH:/usr/local/allure-2.26.0/bin保存环境变量source/etc......
  • Linux下如何安装配置Jupyter Notebook
    JupyterNotebook是一种交互式的开源编程环境,可以方便地创建和共享文档,其中包含实时代码、方程、可视化和叙述性文本。在Linux系统上安装和配置JupyterNotebook需要以下步骤:安装Python和pipJupyterNotebook是基于Python开发的,因此首先需要确保Python已经安装在您的系统上......
  • Linux:Linux权限解析
    一、Linux下的用户分类 在Linux下,有两种用户,一种是超级用户,一种是普通用户超级用户:可以再linux系统下做任何事情,不受权限限制(制定规则,但不需要遵守规则)普通用户:在linux下做有限的事情。(必须遵守相应的规则)超级用户的命令提示符是“#”,普通用户的命令提示符是“$”1、......