文档首页/ Huawei Cloud EulerOS/ 用户指南/ 制作Docker镜像并启动容器
更新时间:2024-09-14 GMT+08:00

制作Docker镜像并启动容器

本节介绍在HCE上制作HCE系统的Docker镜像并启动容器。

约束限制

  • 运行容器镜像的HCE系统版本和制作的HCE容器镜像版本须保持一致。

制作镜像归档文件

  1. 确认repo源配置正常。

    请检查默认的/etc/yum.repos.d/hce.repo配置文件中参数是否正确,正确的配置如下。

    [base]
    name=HCE $releasever base
    baseurl=https://repo.huaweicloud.com/hce/$releasever/os/$basearch/
    enabled=1
    gpgcheck=1
    gpgkey=https://repo.huaweicloud.com/hce/$releasever/os/RPM-GPG-KEY-HCE-2
    
    [updates]
    name=HCE $releasever updates
    baseurl=https://repo.huaweicloud.com/hce/$releasever/updates/$basearch/
    ......
  2. 新建临时目录作为Docker镜像的根系统文件,并将软件包安装到临时目录。
    rm -rf /tmp/docker_rootfs 
    mkdir -p /tmp/docker_rootfs 
    yum --setopt=install_weak_deps=False --installroot /tmp/docker_rootfs --releasever 2.0 install bash yum coreutils security-tool procps-ng vim-minimal tar findutils filesystem hce-repos hce-rootfiles cronie -y
    • 上述操作中的releasever需替换为HCE对应的版本号。
    • 也可在此处安装其他所需的软件包,但是要确保/tmp文件下的空间足够。
  3. chroot进入临时目录,进行如下配置。
    chroot /tmp/docker_rootfs

    1. 使用HCE security-tool.sh关闭不必要服务。
      export EULEROS_SECURITY=0
      echo "export TMOUT=300" >> /etc/bashrc
      /usr/sbin/security-tool.sh -d / -c /etc/hce_security/hwsecurity/hce_security_install.conf -u /etc/hce_security/usr-security.conf -l /var/log/hce-security.log -s

      执行过程中,有以下错误打印均为正常现象,报错的原因为:

      • 缺少服务文件。在chroot文件系统下没有启动服务导致。
      • 缺少引导系统的文件/etc/sysconfig/init。工具在系统启动阶段关闭服务,镜像rootfs不涉及系统启动。
      • 缺少/proc/sys/kernel/sysrq,这是系统启动后生成的调用节点,在chroot文件系统下不存在。

    2. 卸载security-tool、cronie、systemd软件包及其依赖软件包。
      cp -af /etc/pam.d /etc/pam.d.bak
      rm -f /etc/yum/protected.d/sudo.conf /etc/yum/protected.d/systemd.conf
      yum remove -y security-tool cronie systemd
      rpm -e --nodeps logrotate crontabs
      rm -rf /etc/pam.d
      mv /etc/pam.d.bak /etc/pam.d
      sh -c 'shopt -s globstar; for f in $(ls /**/*.rpmsave); do rm -f $f; done'
      [ -d /var/lib/dnf ] && rm -rf /var/lib/dnf/*
      [ -d /var/lib/rpm ] && rm -rf /var/lib/rpm/__db.*
    3. 移除/boot目录。
      rm -rf /boot
    4. 设置容器镜像语言为en_US。
      cd /usr/lib/locale;rm -rf $(ls | grep -v en_US | grep -vw C.utf8 )
      rm -rf /usr/share/locale/*
    5. 移除共享文件 man、doc、info和mime。
      rm -rf /usr/share/{man,doc,info,mime}
    6. 移除缓存日志文件。
      rm -rf /etc/ld.so.cache
      [ -d /var/cache/ldconfig ] && rm -rf /var/cache/ldconfig/*
      [ -d /var/cache/dnf ] && rm -rf /var/cache/dnf/*
      [ -d /var/log ] && rm -rf /var/log/*.log
    7. 移除java安全证书。
      rm -rf /etc/pki/ca-trust/extracted/java/cacerts /etc/pki/java/cacerts
    8. 移除/etc/machine-id。
      rm -rf /etc/machine-id
    9. 移除/etc/mtab。
      rm -rf /etc/mtab
  4. 退出chroot。
    exit
  5. 打包压缩临时目录,生成Docker镜像归档文件hce-docker.x86_64.tar.xz。
    归档路径为/tmp/docker_rootfs/hce-docker.x86_64.tar.xz
    pushd /tmp/docker_rootfs/
    tar cvf hce-docker.x86_64.tar .
    xz hce-docker.x86_64.tar
    popd
  6. 将镜像归档文件转换为带有layer信息的文件。

    上述生成的镜像归档文件没有layer信息,不能使用docker load命令加载镜像。需要用docker import命令先将归档文件生成为镜像,再用docker save命令保存为一个带有layer信息的镜像文件,这样就可以使用docker load命令来加载镜像了。下面以镜像名为my_image,归档文件为docker_save.tar.xz举例。

    docker import hce-docker.x86_64.tar.xz my_image:v1
    docker save -o docker_save.tar.xz my_image:v1

    此时生成的docker_save.tar.xz归档文件就可以用docker load命令来加载镜像。

    docker load -i docker_save.tar.xz

使用镜像归档文件启动容器

  1. 确认repo源配置正常。

    请检查默认的/etc/yum.repos.d/hce.repo配置文件中参数是否正确,正确的配置如下。

    [base]
    name=HCE $releasever base
    baseurl=https://repo.huaweicloud.com/hce/$releasever/os/$basearch/
    enabled=1
    gpgcheck=1
    gpgkey=https://repo.huaweicloud.com/hce/$releasever/os/RPM-GPG-KEY-HCE-2
    
    [updates]
    name=HCE $releasever updates
    baseurl=https://repo.huaweicloud.com/hce/$releasever/updates/$basearch/
    ......
  2. 安装docker软件包。
    yum install docker -y
  3. 使用镜像归档文件创建容器镜像。
    mv /tmp/docker_rootfs/hce-docker.x86_64.tar.xz .
    docker import hce-docker.x86_64.tar.xz

    执行docker images命令可查看到容器镜像ID为6cfefae3a541。

    创建镜像可使用如下命令指定镜像的REPOSITORY和TAG参数。

    docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

  4. 在容器中运行镜像bash文件。

    运行如下命令后,如果shell视图改变,表示成功进入容器bash。

    docker run -it 6cfefae3a541 bash