企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
# :-: docker基础镜像制作-服务器版 | 适用范围 | 适用版本 | 人员 | 发布时间 | 文档版本 |备注 | | --- | --- | --- | --- | --- |--- | | 服务器操作系统 | V10-SP1、V10-SP2 | 王国武 |2022.3.22| V1.0|发布| | 服务器操作系统 | V10-SP1、V10-SP2 | 张志勇 |2022.3.22| V1.1|模板调整| ### 经测试,该方案有效可行 ***** ## 1. 背景 客户的一些应用需要部署运行在docker上,常需要服务器系统的docker基础镜像来制作docker应用镜像,以往可以通过将系统根目录打包的方式直接制作镜像,但这种方式制作的docker镜像过大,即使裸系统也差不多达到10个G大小,这样不方便后续扩展维护,本篇描述制作小型化docker系统镜像的方式,大小可以缩减为1个G左右。为描述方便本文用银河麒麟V10高级服务器系统x86镜像为例,arm及其他CPU架构制作方式类似。 ## 2. 制作过程 ### 1.搭建本地yum源 外网源有很多更新部分,因此不利于缩减镜像大小,因此最好用原始系统镜像制作docker基础镜像,这就需要将外网yum源暂时关闭使用本地源,这也符合一些客户内网环境的需求。 #### 1)将镜像通过光盘或U盘挂载到/mnt目录下 如`mount /media/kylin/xxx.iso /mnt` #### 2)修改/etc/yum.repo.d/ kylin_x86_64_local.repo文件内容如下 `cd /etc/yum.repos.d` `cp –a kylin_x86_64.repo kylin_x86_64_local.repo` `vim kylin_x86_64_local.repo` ![](https://img.kancloud.cn/0e/42/0e42001ed0d1c21549d2420080e86351_408x123.png) 关闭外网yum源,修改/etc/yum.repo.d/ kylin_x86_64.repo,将其中的enabled项值都改为0 ![](https://img.kancloud.cn/07/97/079767ebfd3df52ac513e7c4fb538467_554x253.png) 查看所有仓库状态如下,则正常切换到本地源 ![](https://img.kancloud.cn/60/01/6001b034b5067cad79aba770a69415a0_571x65.png) ### 2. 配置docker系统镜像本地源 #### 1)在指定目录中生成根目录文件 `cd /` `mkdir /ky10-docker-server` `yum -y --installroot=/ky10-docker-server install yum` 执行完上述命令后/ky10-docker-server目录中就生成了根目录文件 ![](https://img.kancloud.cn/1d/ff/1dff754ea5a73cc30bb0831b5ed696af_554x35.png) #### 2)修改制作根目录中的yum源为本地yum源 该步必须有,不然无法连接外网时,会报yum源有问题,无法使用命令将软件安装到docker镜像中。 与前面配置本地yum源的方式相同,只不过是修改/ky10-docker-server/etc/yum.repo.d中的yum配置文件 ![](https://img.kancloud.cn/4a/12/4a12ff169052728ae6070bd0ca281c39_554x95.png) ### 3. 将基础软件安装到docker系统镜像中 如果用上述目录制作成系统镜像,几乎是什么都没有安装,很多命令都无法使用,而且也没有常用的jdk环境,因此我们需要安装一些常用的软件,以方便之后的使用,这里安装4个软件,net-tools、iproute、openjdk、vim,这样制作好的镜像作为容器启动后就可以正常使用网络命令、编辑配置文件并拥有jdk环境了。可以使用chroot /ky10-docker-server/ 来将系统根目录切换到/ky10-docker-server/ 再执行相关命令,来测试安装软件是否成功。 `yum -y --installroot=/ky10-docker-server install net-tools iproute java-1.8.0-openjdk vim` 将系统环境变量拷贝到docker镜像中 `cp /etc/skel/.bash* /ky10-docker-server/root/` `echo "" > /ky10-docker-server/root/.bash_history` ### 4. 将根目录打包 `cd /ky10-docker-server/` `tar -cvpf /root/system.tar --directory=/ky10-docker-server/ --exclude=proc --exclude=sys --exclude=dev --exclude=run --exclude=boot .` 此时的system.tar文件其实就是docker基础镜像了 ### 5. 将tar包导入docker V10服务器系统默认docker是启动的,执行systemctl status docker 看是否docker正常运行 `docker import /root/system.tar ky10-server:src ` `docker images` ![](https://img.kancloud.cn/5e/16/5e16a31caed029d41d9f7affbafff818_554x42.png) 可以看到基础镜像只有1个G左右 ### 6. 用docker镜像启动容器 `docker run -it ky10-server:src /bin/bash` ![](https://img.kancloud.cn/9d/68/9d68a6e0f82859760b786b78e9f66e48_554x76.png) 可以看到命令可以正常执行 -it 后面也可以接IMAGE ID,如这里可以 `docker run -it 7f657787425f /bin/bash` 注意前2个docker run 命令是用镜像新建容器并进入,如果想进入已存在的容器就不能用上述命令了,需要使用docker exec 命令,可以使用exit命令退出当前容器。 `docker ps -a 查看所有容器` `docker ps 查看正在运行的容器` ![](https://img.kancloud.cn/e5/e4/e5e4b99d792615aff9dc09f7996661a6_553x42.png) 启动并进入已存在的容器,使用容器号(CONTAINER ID)进入 `docker start 29f31b9a3bae && docker exec -it 29f31b9a3bae /bin/bash` ![](https://img.kancloud.cn/9c/1a/9c1a1887b0b74441b04cac4a026f5527_554x39.png) &&符可以连接多条命令进行多步操作 停止容器 `docker stop 29f31b9a3bae` ### 7. 将容器导出成docker基础镜像 进入容器后可以做一些配置,安装软件,然后将容器导出成文件方便后续使用,这里我们不做任何操作,直接将该容器导出做成基础镜像。 `docker export -o /root/ky10-server-base.tar 29f31b9a3bae` 后面也可以接容器对应的名字(NAMES) ![](https://img.kancloud.cn/41/6f/416f276f49b05e207ba7d55cafe22917_554x48.png) 导出成文件后也可以导入测试一下 ![](https://img.kancloud.cn/6e/7d/6e7d66f2127e45a678aaa45a96c6184f_554x67.png) 这样基础镜像就制作完成了,可以把制作的tar包拷贝到需要的地方供需要时使用。 制作镜像时为了简化步骤也可以用Dockerfile来完成,然后用docker save –o命令来导出镜像,可以根据项目需要选择对应的解决方案,这里不再做详细说明。 ### 8. docker端口映射 在启动docker容器时一般需要做端口映射,以使外部网络可以通过宿主机网络访问到docker的端口,也是通过这种方法外部网络可以访问到docker内部。 如docker上运行tomcat,要外部访问到docker的8080端口,可以用下命令实现 `docker run -it -d -p 8888:8080 --name mytomcat ky10-server-base /bin/bash` 这条命令也是通过镜像创建容器并启动容器,之后再访问该容器不能再使用docker run命令,可以通过docker exec 命令来进入容器。