要构建一个带有 systemd, sshd 的 Arch Linux Docker 镜像,需要遵循以下步骤:

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

关于Zeno Chen

本人涉及的领域较多,杂而不精 程序设计语言: Perl, Java, PHP, Python; 数据库系统: MySQL,Oracle; 偶尔做做电路板的开发,主攻STM32单片机
此条目发表在Linux分类目录。将固定链接加入收藏夹。

发表回复