惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

SecWiki News
SecWiki News
罗磊的独立博客
U
Unit 42
I
InfoQ
B
Blog RSS Feed
Google DeepMind News
Google DeepMind News
J
Java Code Geeks
Blog — PlanetScale
Blog — PlanetScale
The GitHub Blog
The GitHub Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
B
Blog
S
SegmentFault 最新的问题
V
Visual Studio Blog
Engineering at Meta
Engineering at Meta
Microsoft Security Blog
Microsoft Security Blog
月光博客
月光博客
Vercel News
Vercel News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
A
About on SuperTechFans
博客园 - 三生石上(FineUI控件)
博客园_首页
腾讯CDC
F
Fortinet All Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Hugging Face - Blog
Hugging Face - Blog
MongoDB | Blog
MongoDB | Blog
阮一峰的网络日志
阮一峰的网络日志
D
Docker
N
Netflix TechBlog - Medium
云风的 BLOG
云风的 BLOG
Apple Machine Learning Research
Apple Machine Learning Research
Microsoft Azure Blog
Microsoft Azure Blog
Martin Fowler
Martin Fowler
人人都是产品经理
人人都是产品经理
酷 壳 – CoolShell
酷 壳 – CoolShell
爱范儿
爱范儿
大猫的无限游戏
大猫的无限游戏
V
V2EX
Last Week in AI
Last Week in AI
博客园 - 司徒正美
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
IT之家
IT之家
L
LangChain Blog
WordPress大学
WordPress大学
Y
Y Combinator Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
M
MIT News - Artificial intelligence
The Cloudflare Blog
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享

博客园 - 007少侠

使用Recaf编辑汇编代码直接修改java的编译代码class Centos Linux 更换源,原官方源已经不再提供服务 Centos Linux 7 搭建邮件服务器(postfix + dovecot) Ubuntu Linux 搭建邮件服务器(postfix + dovecot) 【WSL2】在Windows通过自定义域名访问wsl2中的服务 Python pip pip3 源设置成国内源,阿里云源,清华大学源 利用云服务器实现内网穿透(frp),开启个人电脑(windows)可远程桌面访问 使用docker安装centos7并挂载主机目录 Rust交叉编译Mac编译Linux/Windows平台 Linux下安装dart sdk并配置环境变量 Linux下安装JDK-openj9并配置环境变量 centos7 安装 bbr加速 linux环境常用命令和java/jvm常用命令 mybatis plus + druid多数据源(使用dynamic实现) docker将容器打包成镜像并传输至其他服务器部署(可用于容器重新run) .gitignore == git添加忽略不生效解决方案 jenkins自动构建项目源码git pull时出现冲突的终极解决方案(git远程覆盖本地分支) mysql查询,根据时间查询:几天前、几天内的数据 spring boot 使用aop实现拦截器
如何在Docker容器中的Linux系统(Ubuntu + Centos Linux)里面使用systemctl
007少侠 · 2024-08-09 · via 博客园 - 007少侠

前言

正常情况下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). 执行命令

(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). 执行命令

(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