利用 dockerfile 封装 centos7 容器

封装一个最小化、定制版的 CentOS 7.9 容器,将其导出为一个 tar 包。任意 docker 环境导入该 tar 包,就可以快速拉起一台纯净的 CentOS 7.9(不会污染主机环境)用来测试。

封装过程

  • 第1步,安装 docker 29.0.0
curl -sL 'http://iso.sqlfans.cn/docker/install_docker_2900.sh' | bash
docker --version
  • 第2步,配置 docker 加速
mkdir -p /etc/docker
curl http://iso.sqlfans.cn/config/docker/daemon.202504.json > /etc/docker/daemon.json
systemctl daemon-reload
systemctl restart docker
  • 第3步,下载 centos 7.9 的原始镜像(大小 76.1MB)

注:centos:7 会始终指向 CentOS 7 系列的最新稳定版,也就是 7.9

docker pull centos:7
docker images
  • 第4步,编写 dockerfile 用于封装一个自定义的 centos7 镜像

注:若构建过程执行 yum install 报错 Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY,可添加 --nogpgcheck

cat > /opt/dockerfile-centos7.yml <<EOF
FROM centos:7
MAINTAINER sqlfans "78667417@qq.com"

#.配置时区及dns并更改yum源,不建议阿里云yum源
ENV TZ Asia/Shanghai
RUN echo "nameserver 223.5.5.5" > /etc/resolv.conf
RUN rm -f /etc/yum.repos.d/*.repo
RUN curl -sL https://mirrors.cloud.tencent.com/repo/centos7_base.repo -o /etc/yum.repos.d/CentOS-Base.repo
RUN yum clean all && yum makecache

#.安装service及ssh服务
RUN yum install -y -q --nogpgcheck initscripts curl net-tools
RUN yum install -y -q --nogpgcheck openssh openssh-server openssh-clients openssl openssl-libs

#.修改port并启用root登录
RUN sed -i "s/#Port/Port/" /etc/ssh/sshd_config
RUN sed -i 's/^Port.*/Port 23245/g' /etc/ssh/sshd_config
RUN sed -i "s/#PermitRootLogin/PermitRootLogin/" /etc/ssh/sshd_config
RUN sed -i 's/^PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config
RUN sed -i '/^ListenAddress/d' /etc/ssh/sshd_config
RUN sed -i "s/#UseDNS/UseDNS/" /etc/ssh/sshd_config
RUN sed -i 's/^UseDNS.*/UseDNS no/g' /etc/ssh/sshd_config
RUN sed -i "s/#GSSAPIAuthentication/GSSAPIAuthentication/" /etc/ssh/sshd_config
RUN sed -i 's/^GSSAPIAuthentication.*/GSSAPIAuthentication no/g' /etc/ssh/sshd_config
RUN cat /etc/ssh/sshd_config | egrep "(^Port|^PermitRootLogin|^ListenAddress|^UseDNS|^GSSAPIAuthentication)"

#.配置SSH密钥,示例root密码为 Admin_147
RUN ssh-keygen -A
RUN echo Admin_147 | passwd --stdin root
RUN systemctl enable sshd

#.声明容器监听的端口
EXPOSE 23245

#.启动SSH服务
CMD ["/usr/sbin/sshd", "-D"]
EOF
  • 第5步,使用 docker build 构建基础镜像,耗时约 00:01:48(慢在 yum 部分),新的镜像约 251 MB(大小可能会变)

注:执行 docker build 的命令最后有一个小数点,切不可丢失

time docker build -f /opt/dockerfile-centos7.yml -t centos7:7 .
docker images | grep centos
  • 第6步,利用新的镜像启动centos7容器,并将ssh端口映射为23245(避免与主机ssh端口冲突)

注:若在容器内使用systemctl报错 Failed to get D-Bus connection: Operation not permitted,可在启动容器添加 --privileged=true,同时将entrypoint设置为 /usr/sbin/init 即可

#.启动centos7容器
docker run -it -d -p 23245:23245 --privileged=true --name centos7 centos7:7 /usr/sbin/init
docker ps -a | grep centos

#.启动sshd服务
docker exec -it centos7 /bin/bash -c "/usr/sbin/sshd -t"
docker exec -it centos7 /bin/bash -c "/usr/sbin/sshd"
docker exec -it centos7 /bin/bash -c "/usr/bin/netstat -lnpt|grep 23245"
  • 第7步,确认端口已监听,并使用ssh连接容器,示例 root 密码为 Admin_147

注:在容器内执行 /usr/sbin/sshd -t 报错 bad addr or host: yes (Name or service not known),调整 /etc/ssh/sshd_config 参数即可。

[root@localhost ~]# docker images
IMAGE       ID             DISK USAGE   CONTENT SIZE   EXTRA
centos7:7   3632a6dbc020       1.05GB          251MB    U
centos:7    be65f488b776        301MB         76.1MB

[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE       COMMAND            CREATED         STATUS         PORTS                                             NAMES
b68962ff0c21   centos7:7   "/usr/sbin/init"   2 minutes ago   Up 2 minutes   0.0.0.0:23245->23245/tcp, [::]:23245->23245/tcp   centos7

[root@localhost ~]# netstat -lnpt | egrep "(22|23245)"
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1/init
tcp        0      0 0.0.0.0:23245           0.0.0.0:*               LISTEN      22359/docker-proxy
tcp6       0      0 :::22                   :::*                    LISTEN      1/init
tcp6       0      0 :::23245                :::*                    LISTEN      22367/docker-proxy

root@localhost:~# ssh root@localhost -p 23245
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
root@localhost's password: Admin_147
Last login: Mon Jun  1 18:01:38 2026 from 172.17.0.1

#.已进入容器内
[root@b68962ff0c21 ~]#

快速拉起新容器

  • 将封装的新容器导出为一个tar包(大小 240 MB)
docker save -o /opt/centos7.tar centos7:7
  • 等需要的时候,在新的机器上导入该tar包并启动容器,通过端口23245、root密码Admin_147 就可以ssh登录一台纯净的centos容器(不会污染主机环境)
docker load -i /opt/centos7.tar
docker run -it -d -p 23245:23245 --privileged=true --name centos7 centos7:7 /usr/sbin/init
docker exec -it centos7 /bin/bash -c "/usr/sbin/sshd"
docker ps -a | grep centos
  • 彻底清理 centos7 容器的步骤如下:
docker stop $(docker ps -a | grep centos | awk '{print $1}')
docker rm $(docker ps -a | grep centos | awk '{print $1}')
docker rmi -f $(docker images | grep centos | awk '{print $2}')
docker images
Copyright © www.sqlfans.cn 2021 - 2026 All Right Reserved更新时间: 2026-06-01 19:36:21

results matching ""

    No results matching ""