利用 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