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