如何基于当前操作系统构建 Docker 系统基础镜像

2024-02-26 16:11:57 浏览数 (1)

写在前面


  • 博文内容为在华为云开发者认证实验中看到,整理分享
  • Demo 以华为云欧拉操作系统(Huawei Cloud EulerOS)为例,当然也适用于其他的 Linux 发行版系统构建基础镜像
  • 理解不足小伙伴帮忙指正

不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已经和从前不一样了。——村上春树


为什么需要基于当前操作系统构建基础镜像?

在日常生产中,我们可能下面一些诉求,比如企业上云,之前是通过华为云欧拉系统ECS直接部署的,但是后来要求容器化,那么考虑兼容性和稳定性,需要把当前 ECS 的环境做成基础镜像,供容器化使用,基于 HCE OS(Huawei Cloud EulerOS) 构建 HCE OS(Huawei Cloud EulerOS) 基础镜像可以确保与华为云平台的兼容性和稳定性。这意味着镜像可以更好地集成和运行在华为云环境中,确保系统的可靠性和性能。

同时华为云欧拉操作系统是华为云平台的一种操作系统,它可能专门针对特定的云环境和应用场景进行了定制。通过基于 HCE OS 构建 HCE OS 基础镜像,可以满足特定的业务需求和定制化要求。

容器安全性方面考虑,华为云欧拉操作系统通常会提供一些安全增强功能和机制,以确保在云环境中的数据和应用的安全性。基于 HCE OS 构建 HCE OS 基础镜像可以继承这些安全特性,以提供更高的安全级别

生态系统支持,华为云平台通常会提供一整套生态系统工具和服务,如监控、自动化部署、弹性伸缩等。基于 HCE OS 构建 HCE OS 基础镜像可以更好地集成这些工具和服务,以提供更完整的云解决方案。

实验环境

代码语言:javascript复制
[root@ecs-hce ~]# hostnamectl 
 Static hostname: ecs-hce
       Icon name: computer-vm
         Chassis: vm
      Machine ID: 91874445890c4df3958af4e0072eb5ff
         Boot ID: a6e3464ca4c646d9bfaceb94baa3a3cd
  Virtualization: kvm
Operating System: Huawei Cloud EulerOS 2.0 (x86_64)
          Kernel: Linux 5.10.0-60.18.0.50.r865_35.hce2.x86_64
    Architecture: x86-64
 Hardware Vendor: OpenStack Foundation
  Hardware Model: OpenStack Nova
[root@ecs-hce ~]# 

安装 Docker

添加桥接网卡

在安装 Docker 时添加桥接网卡是为了创建一个本地的网络环境,使 Docker 容器能够与主机和其他容器进行通信。

Docker 使用桥接网络模式作为默认网络模式。在桥接网络模式下,创建一个名为docker0的桥接接口,它充当 Docker 容器连接到主机网络的网桥。这个桥接接口允许Docker容器通过主机的网络接口与外部网络通信,并通过桥接接口互相通信。

代码语言:javascript复制
[root@ecs-hce ~]# ip link add name docker0 type bridge

创建了一个名为docker0的桥接接口。桥接接口是用于连接多个网络设备的虚拟设备,可以将多个网络设备组成一个局域网。

代码语言:javascript复制
[root@ecs-hce ~]# ip addr add dev docker0 10.0.0.1/8

为 docker0 接口添加了一个 IP 地址。具体来说,它将 IP 地址 10.0.0.1/8 分配给了 docker0 接口。IP 地址 10.0.0.1/8 表示一个具有 8 位子网掩码的 IPv4 地址,其中前 8 位是网络部分,后 24 位是主机部分

安装 Docker

代码语言:javascript复制
[root@ecs-hce ~]# dnf -y install docker >> /dev/null
Failed to set locale, defaulting to C.UTF-8
retrieving repo key for updates unencrypted from http://repo.huaweicloud.com/hce/2.0/updates/RPM-GPG-KEY-HCE-2
Importing GPG key 0xA8DEF926:
 Userid     : "HCE <support@huaweicloud.com>"
 Fingerprint: C1BA 9CD4 9D03 A206 E241 F176 28DA 5B77 A8DE F926
 From       : http://repo.huaweicloud.com/hce/2.0/updates/RPM-GPG-KEY-HCE-2
[root@ecs-hce ~]# which docker
/usr/bin/docker

修改 /etc/docker/daemon.json 配置文件,添加镜像仓库地址

代码语言:javascript复制
[root@ecs-hce ~]# vi /etc/docker/daemon.json
[root@ecs-hce ~]# cat /etc/docker/daemon.json
{
        "registry-mirrors": [
                "https://094f6e8c9700f3060f39c0043d3e15c0.mirror.swr.myhuaweicloud.com"
        ]
}

这里可能根据实际情况做一些其他的配置,比如修改镜像文件存放位置,最好配置到容量可扩展的位置,容器日志文件大小,保留数量、日志驱动等, cgroup驱动程序("systemd"或"cgroupfs")等相关配置

启动 Docker

代码语言:javascript复制
[root@ecs-hce ~]# systemctl enable docker --now
[root@ecs-hce ~]# systemctl restart  docker

确认配置结果

代码语言:javascript复制
[root@ecs-hce ~]# docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 18.09.0
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Hugetlb Pagesize: 2MB, 1GB, 2MB, 1GB (default is 2MB)
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: b552a1e4ad1fd899da8a91965aa23e64d0cb3713
runc version: 310245ac9b55f190f9c49642f524db4b089d5861
init version: N/A (expected: )
Security Options:
 apparmor
 seccomp
  Profile: default
Kernel Version: 5.10.0-60.18.0.50.r865_35.hce2.x86_64
Operating System: Huawei Cloud EulerOS 2.0 (x86_64)
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 3.33GiB
Name: ecs-hce
ID: JA2S:67TN:CCT2:BBVQ:RKF2:IAMC:BXM7:LQGS:X7VV:FKQM:NEUA:2KW6
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Registry Mirrors:
 https://094f6e8c9700f3060f39c0043d3e15c0.mirror.swr.myhuaweicloud.com/
Live Restore Enabled: true

制作 HCE-OS 基础镜像

制作 Docker 镜像本地源

创建一个名为/hce-x86-server 的目录,用于安装软件包。

代码语言:javascript复制
[root@ecs-hce ~]# mkdir /hce-x86-server && yum -y --releasever=2.0  --installroot=/hce-x86-server/ install yum net-tools bash-completion iputils vim >> /dev/null
Failed to set locale, defaulting to C.UTF-8

使用 yum 包管理器在指定的安装根目录/hce-x86-server 下安装了一些软件包。具体安装的软件包包括 :

  • yum(用于管理软件包)
  • net-tools(包含一些网络工具)
  • bash-completion(用于命令自动补全)
  • iputils(包含一些网络实用工具)
  • vim(文本编辑器)

上面的这个命令同时会把制作镜像涉及到的一些元数据下载下来。--installroot 会在指定的目录下生成一个根文件系统roofs--releasever=2.0 用于指定发行版

这里为什么选择 yum net-tools bash-completion iputils vim 这几个工具,因为一个发行版的容器镜像一般包含这几个,包管理器,外壳程序,一些网络测试,文本编辑的实用程序。将以上工具及其依赖安装到一个特定的目录,那么这个目录就可以作为rootfs使用

代码语言:javascript复制
[root@ecs-hce /]# ls
CloudrResetPwdAgent  boot  etc             home  lib64       media  opt   root  sbin  sys  usr
bin                  dev   hce-x86-server  lib   lost found  mnt    proc  run   srv   tmp  var
[root@ecs-hce /]# cd hce-x86-server/
[root@ecs-hce hce-x86-server]# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

这里其他的Linux发行版需要根据实际修改命令

拷贝系统环境变量到Docker镜像中

复制/etc/skel/目录下的.bash*文件到/hce-x86-server/root 目录,并清空/hce-x86-server/root/.bash_history 文件

代码语言:javascript复制
[root@ecs-hce ~]# cp /etc/skel/.bash* /hce-x86-server/root && echo " " >/hce-x86-server/root/.bash_history
代码语言:javascript复制
[root@ecs-hce hce-x86-server]# cd root/
[root@ecs-hce root]# ls
[root@ecs-hce root]# ls -a
.  ..  .bash_history  .bash_logout  .bash_profile  .bashrc  .viminfo
[root@ecs-hce root]#

进入到镜像文件目录,打包根目录

代码语言:javascript复制
[root@ecs-hce root]# cd /hce-x86-server
[root@ecs-hce hce-x86-server]# tar -zcvpf /root/hce-x86-server.tar --exclude=proc --exclude=sys --exclude=dev --exclude=run --exclude=boot .

导入镜像包至 Docker

代码语言:javascript复制
[root@ecs-hce hce-x86-server]# docker import /root/hce-x86-server.tar hce/hce-x86-server:202401
sha256:7b8fb730c9f615d167dfa29491cd1f27172d54ae8dc9f1095f46c87970a25ada
[root@ecs-hce hce-x86-server]# docker images|grep hce
hce/hce-x86-server   202401              7b8fb730c9f6        12 seconds ago      518MB

运行镜像测试

代码语言:javascript复制
[root@ecs-hce hce-x86-server]# docker run -itd  hce/hce-x86-server:202401 /bin/bash
ad84d622292583c9280c33b42ee25ef32b41b648478faf963da32a156bae4915
[root@ecs-hce hce-x86-server]# docker ps
CONTAINER ID        IMAGE                       COMMAND             CREATED             STATUS              PORTS               NAMES
ad84d6222925        hce/hce-x86-server:202401   "/bin/bash"         15 seconds ago      Up 12 seconds                           festive_matsumoto

进入容器执行命令测试

代码语言:javascript复制
[root@ecs-hce hce-x86-server]# docker exec -it ad84d6222925 bash
[root@ad84d6222925 /]# ls
bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  sbin  srv  sys  tmp  usr  var
[root@ad84d6222925 /]# exit
[root@ecs-hce hce-x86-server]#

到这里我们就基于当前系统环境创建了一个基础镜像

博文部分内容参考

© 文中涉及参考链接内容版权归原作者所有,如有侵权请告知:)


https://edu.huaweicloud.com/certificationindex/developer/9bf91efb086a448ab4331a2f53a4d3a1


© 2018-2024 liruilonger@gmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)

0 人点赞