来自http://www.jianshu.com/p/029a1ed4fd64

背景

因为笔者是在vagrant转移到docker的玩家,所以对系统镜像情有独钟。如果你是windows、mac用户,那么你可能就需要一个干净的系统镜像,来使用docker(docker依赖于linux内核)。

而在linux下开发的话,则无需再安装任何系统镜像,直接使用docker即可。

在此背景下,那么一个干净的系统镜像,就有了必要的意义。笔者开始搜索有关docker打包Ubuntu镜像的资料,得到了一些思绪。

本文受 http://www.jb51.net/article/101509.htm 启发而做,笔者对linux不精通,只能依靠查阅的资料去实现,如有错误之处,请多多指教。

了解封装镜像的基本知识

因为容器本身是共享宿主操作系统内核,所以容器基础系统镜像包本身就是一个标准的 Linux rootfs + 用户自定义的工具。根据这个思路,我们就可以构建一个自己的容器基础系统镜像。

rootfs 根文件系统

构建标准的 Linux rootfs 的方式有很多种方法,Redhat、Debian、SUSE等主流的发行版都有提供相应的工具支持,在Ubuntu中笔者使用的时debootstrap工具。

大致流程:

  1. 构建基础的 rootfs
  2. 配置基础系统参数
  3. 部署用户自定义软件
  4. 清理系统
  5. 打包为容器镜像
  6. 测试镜像
  7. 发布仓库

开始制作Ubuntu16.04系统镜像

  1. 安装 Debootstrap

    sudo apt install debootstrap
  2. 通过 Debootstrap 构建 Ubuntu 16.04 LTS 的 rootfs
    • 创建 rootfs 存放的位置,如我们把新的 rootfs 存放在 /opt/new_os:

      sudo mkdir -p /opt/new_os
    • 构建基础 Ubuntu 16.04 LTS 的 rootfs(Debootstrap 工具的参数使用 --help 查看)
      sudo debootstrap --verbose --arch=amd64 xenial /opt/new_os http://mirrors.aliyun.com/ubuntu
  3. 配置基础系统参数

    切换到新 rootfs

    sudo chroot /opt/new_os /bin/bash

    安装基础包(请根据实际需求安装)

    apt -y update && apt -y upgrade && apt -y install vim locales

    配置系统字符集(根据提示进行)

    dpkg-reconfigure locales

    配置时区

    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  4. 可选:配置第三方衍生系统版本信息(如:UbuntuKylin)
    tee /etc/ubuntukylin-release <<-‘EOF'
    DISTRIB_ID=Ubuntu Kylin
    DISTRIB_RELEASE=16.04
    DISTRIB_CODENAME=xenial
    DISTRIB_DESCRIPTION="Ubuntu Kylin 16.04"
    EOF
  5. 清理系统
    rm -Rf /tmp/* && apt clean
  6. 退出当前 rootfs
    exit
  7. 打包并创建 Docker 镜像(前置条件:当前系统已经配置了 Docker 运行时环境)
    sudo tar -C /opt/new_os/ -c . | sudo docker import - new_os
  8. 测试
    sudo docker run new_os cat /etc/lsb-release
  9. 发布到仓库(以发布到官方仓库为例,私有仓库请自行上传)
    sudo docker login shibingli@yeah.net
    ……
    sudo docker tag new_os shibingli/new_os
    sudo docker push shibingli/new_os
  10. 完成

  11. 补充,如果要把当前的系统环境打包为容器基础镜像,主要是 rootfs 的处理,可以参考以下命令

    tar --numeric-owner --exclude=/proc --exclude=/sys -cvf new_os.tar /
    cat new_os.tar | docker import - new_os

    sudo tar --numeric-owner --exclude=/proc --exclude=/sys -C / -c . | sudo docker import - new_os

制作ubuntu16.04的docker镜像的更多相关文章

  1. ubuntu16.04下docker安装和简单使用(转)

    ubuntu16.04下docker安装和简单使用   转自:https://www.cnblogs.com/hupeng1234/p/9773770.html 前提条件 操作系统 docker-ce ...

  2. Ubuntu16.04 添加 Docker用户组

    Ubuntu16.04 添加 Docker用户组 将用户添加到docker用户组就不用每次都 sudo了. ### 首先创建用户组 sudo groupadd docker 将用户加如组 sudo g ...

  3. Ubuntu16.04安装Docker、nvidia-docker

    Ubuntu16.04安装Docker.nvidia-docker Docker安装 1.更换国内软件源,推荐中国科技大学的源,稳定速度快(可选) sudo cp /etc/apt/sources.l ...

  4. 制作nginx+php的docker镜像方法

    制作nginx+php的docker镜像方法一.准备安装的工具工具:docker-17.06.0-ce.nginx-1.13.2.PHP-5.5.38 .supervisor配置思路:1.安装dock ...

  5. docker学习笔记(1)——ubuntu16.04安装docker(含如何彻底卸载docker,docker拉取镜像失败解决)

    参考博客: 1.官网教程:https://docs.docker.com/engine/install/   根据本机不同的信息选择不同的安装方式:  https://docs.docker.com/ ...

  6. ubuntu16.04下docker安装和简单使用

    前提条件 操作系统 docker-ce支持的ubuntu版本: Bionic 18.04 (LTS) Xenial 16.04 (LTS) Trusty 14.04 (LTS) 卸载旧版本docker ...

  7. Ubuntu16.04 下docker部署web项目

    概念性的请戳 第一步:更新apt-get update 第二步:安装环境 apt-get install \ apt-transport-https \ ca-certificates \ curl ...

  8. ubuntu16.04中docker安装curl拒绝连接问题

    在Ubuntu16.04中安装docker ce,安装步骤按照官网说明https://docs.docker.com/engine/installation/linux/docker-ce/ubunt ...

  9. ubuntu16.04安装docker CE

    如需开始在 Ubuntu 上使用 Docker CE,请确保您满足先决条件,然后再安装 Docker. 如需安装 Docker 企业版 (Docker EE),请转至获取适用于 Ubuntu 的 Do ...

随机推荐

  1. CodeForces D. Concatenated Multiples

    http://codeforces.com/contest/1029/problem/D You are given an array aa, consisting of nn positive in ...

  2. Lettcode Kth Largest Element in an Array

    Lettcode Kth Largest Element in an Array 题意:在无序数组中,寻找第k大的数字,注意这里考虑是重复的. 一直只会简单的O(nlogn)的做法,听说这题有O(n) ...

  3. linux下源代码分析和阅读工具比较

    Windows下的源码阅读工具Souce Insight凭借着其易用性和多种编程语言的支持,无疑是这个领域的“带头大哥”.Linux/UNIX环境下呢?似乎仍然是处于百花齐放,各有千秋的春秋战国时代, ...

  4. 【马克-to-win】—— 学习笔记

    声明 以下学习内容转载自:http://www.mark-to-win.com/ 社区,由马克java社区创始人---"马克-to-win"一人全部独立写作,创作和制作. 非常感谢 ...

  5. spring3创建RESTFul Web Service

    spring 3支持创建RESTFul Web Service,使用起来非常简单.不外乎一个@ResponseBody的问题. 例如:后台controller: 做一个JSP页面,使用ajax获取数据 ...

  6. 如何禁用Eclipse的Validating

    使用Eclipse开发项目,在加载项目.刷新项目.修改了某个代码的时候,经常出现Eclipse正在Validating的提示.项目比较大文件(js)较多的情况下,甚至出现Validating几分钟的盛 ...

  7. 更改Debian的console分辨率

    1.通过apt-get install hwinfo来安装 2.通过命令hwinfo --framebuffer来获取 eric@debian:~$ sudo sudo hwinfo --frameb ...

  8. MySQL5.7源码安装问题汇总

    编译安装mysql5.7版本,想试用一下新的版本特性,发现跟之前的5.6版本编译有了一些变化,总结一下避免以后继续入坑.5.6安装方式 cmake版本 5.7编译cmake要求版本最低为2.8,当前为 ...

  9. Linux忘记Mysql原来root的密码

    Linux忘记Mysql原来root的密码 1.首先需要有linux操作系统root的权限 2.ps aux | grep mysql (或者 systemctl status mysql) 发现my ...

  10. python和shell对比

    python和shell都是我们经常使用的脚本语言,平时python主要用来写一些小型的任务,shell则在使用liunx系统部署任务的时候用的比较多,由于两者有一些相似之处,时间长了容易混掉,所以这 ...