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

007少侠發表於2024-08-09

前言

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

相關文章