1. 创建 Dockerfile
创建一个名为 Dockerfile 的文件,并添加以下内容:
# sshd on archlinux
# 1.0.0
FROM archlinux:latest
MAINTAINER Ovsea Friends <supoort@ovsea.cfd>
# 复制软件目录到容器
COPY software /srv/
# 复制配置目录到容器
COPY config /srv/
# 安装 systemd、OpenSSH、sudo 及基本工具
RUN pacman -Syu --noconfirm && \
pacman -S --noconfirm systemd systemd-sysvcompat sudo openssh jdk-openjdk redis numactl nano && \
sed -i 's/#SystemMaxUse=/SystemMaxUse=50M/' /etc/systemd/journald.conf && \
sed -i 's/#SystemMaxFileSize=/SystemMaxFileSize=10M/' /etc/systemd/journald.conf && \
sed -i 's/#MaxRetentionSec=/MaxRetentionSec=1day/' /etc/systemd/journald.conf
RUN mv /srv/redis.conf /etc/redis/
# 安装MySQL
RUN pacman -U --noconfirm /srv/*.zst
# 初始化MySQL
RUN mv /srv/my.cnf /etc/mysql/ && \
mkdir -p /srv/mysql/{data,inno} && \
chown -R mysql:mysql /srv/mysql && \
mysqld --initialize --user=mysql --basedir=/usr --datadir=/srv/mysql/data --innodb_data_home_dir=/srv/mysql/inno --innodb_log_group_home_dir=/srv/mysql/inno > /tmp/mysql_init.log 2>&1 && \
sleep 10
# 获取临时密码
RUN TEMP_PASS=$(grep 'temporary password' /tmp/mysql_init.log | awk '{print $NF}') && \
echo "临时密码: $TEMP_PASS" && \
# 使用临时密码更改 root 密码
sed -i "s|^password.*|password = ${TEMP_PASS}|" /etc/mysql/my.cnf
# 文件清理
RUN cd /srv && rm -rf /srv/*.zst && \
pacman -Scc --noconfirm
# 允许 systemd 运行
VOLUME [ "/sys/fs/cgroup" ]
# 创建 SSH 运行用户(可选)
RUN useradd -m -s /bin/bash ovsea && \
echo 'ovsea:admin3579' | chpasswd && \
echo 'ovsea ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers && \
echo '127.0.0.1 db' >> /etc/hosts && \
echo '127.0.0.1 redis' >> /etc/hosts && \
echo '127.0.0.1 smb' >> /etc/hosts
# 配置 SSHD
RUN systemctl enable sshd && \
mkdir /run/sshd
# 配置 Redis
RUN systemctl enable redis && \
mkdir /srv/redis && \
chown -R redis:redis /srv/redis
# 配置 MySQL
RUN systemctl enable mysqld
# 暴露 SSH (22), MySQL (3306), Redis (6379) 端口
EXPOSE 22 3306 6379
# 设置默认启动命令
CMD [ "/usr/lib/systemd/systemd" ]
2. 构建 Docker 镜像
docker builder prune && docker build -t archlinux-systemd .
3. 运行容器
docker run --rm -it \
--privileged --cgroupns=host \
-v /etc/machine-id:/etc/machine-id \
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
--tmpfs /run --tmpfs /run/lock \
-v /tmp:/tmp \
-p 2222:22 -p 4306:3306 -p 7379:6379 archlinux-systemd
docker run --rm -it \
--privileged --cgroupns=host \
-v /etc/machine-id:/etc/machine-id \
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
--tmpfs /run --tmpfs /run/lock \
-v /tmp:/tmp \
-v /mnt/mysql_appmock:/srv/mysql \
-p 2222:22 -p 4306:3306 -p 7379:6379 archlinux-systemd
4.导出容器
docker save -o archlinux-redis-mysql-sshd.tar archlinux-systemd