制作自己的 Docker 镜像

在使用Docker的过程中,我们除了从Docker Hub上下载已经做好的镜像,很多时候需要我们自己制作镜像。下面想在这个文章中说明一下镜像的制作方法。

操作方法

  • 01

    在使用Docker的过程中,我们除了从Docker Hub上下载已经做好的镜像,很多时候需要我们自己制作镜像。下面想在这个文章中说明一下镜像的制作方法。 制作镜像的方式主要有两种: 通过docker commit 制作镜像 通过docker build 制作镜像 这两种方式都是通过改进已有的镜像来达到自己的目的。制作基础镜像,会在另外一篇文章“从零开始制作基础镜像”中介绍。 docker commit docker commit 是往版本控制系统里提交一次变更。使用这种方式制作镜像,本质上是运行一个基础镜像,然后在基础镜像上进行软件安装和修改。最后再将改动提交到版本系统中。 选择基础镜像 基础镜像的选择要结合自己的需求。可以选择已有的应用镜像来改造,也可以选择Ubuntu,Debian,OpenSuse这类基础系统镜像 我们以ubuntu为例子来说明 步骤1:运行ubuntu 镜像 docker run -i -t ubuntu /bin/bash 步骤2:安装软件并修改软件配置, 比如:安装apache2 apt-get -yqq update apt-get -y install apache2 安装完成后,对apache2进行配置和修改 步骤3:退出docker并保存镜像 使用“exit”命令退出容器 运行docker comit 命令, 进行保存 docker commit 61412230ae46 own-apache2 docker commit 命令参数说明 命令格式 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] OPTIONS: -a, --author=        提交的镜像作者 -c, --change=[]    Apply Dockerfile instruction to the created image, 没用过 -m, --message=   提交时的说明文字 -p, --pause=true  在commit时,将container 暂停 CONTAINER: 可以使用container 的名字或者ID REPOSITORY 指定镜像仓库,上述例子中,指定的是本地存储 可以指定远程镜像仓库,如docker hub。也可自建仓库来存放image TAG: 镜像TAG docker build 使用docker build创建镜像需要编写Dockerfile. 步骤: 编写自己的Dcokerfile 运行docker build 命令打包镜像 仍然以apache打包为例子。以下是Dockerfile的例子 FROM ubuntu:latest MAINTAINER sky #Add 163 mirror for apt ADD sources.list /etc/apt/sources.listADD .bashrc /root/.bashrcENV DEBIAN_FRONTEND noninteractive# PackagesRUN rm -rf /var/lib/apt/listsRUN apt-get update -q --fix-missingRUN apt-get -y upgrade#ubuntu wwwRUN apt-get install -y apache2 curl libapache2-mod-php5 php5-curl php5-gd php5-mysql rsync mysql-client -qqRUN apt-get autocleanRUN rm -rf /var/lib/apt/lists/*# Setup environmnt for apache's init scriptENV APACHE_CONFDIR /etc/apache2ENV APACHE_ENVVARS $APACHE_CONFDIR/envvarsENV APACHE_RUN_USER www-dataENV APACHE_RUN_GROUP www-dataENV APACHE_RUN_DIR /var/run/apache2ENV APACHE_PID_FILE $APACHE_RUN_DIR/apache2.pidENV APACHE_LOCK_DIR /var/lock/apache2ENV APACHE_LOG_DIR /var/log/apache2ENV LANG CRUN mkdir -p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIRRUN find "$APACHE_CONFDIR" -type f -exec sed -ri ' \        s!^(\s*CustomLog)\s+\S+!\1 /proc/self/fd/1!g; \        s!^(\s*ErrorLog)\s+\S+!\1 /proc/self/fd/2!g; \' '{}' ';'EXPOSE 80CMD ["apache2", "-DFOREGROUND"] 编辑完成后,在与Dockerfile同一目录下运行docker build 命令 docker build -t apache-img . 如果没有命令出错,docker build会持续运行直到镜像创建完成 而创建的过程本质上是运行一个镜像,然后在镜像中按序执行在Dockerfile中的命令,直到执行结束。 如果中间有命令执行失败,镜像创建会停止。这时就需要看log,并修改Dockerfile,然后再次执行docker build 注:两种镜像创建方式的对比: docker commit docker build 难度相对容易,适合新手和对Linux不熟悉的用户相对难,要求有一定的linux和脚本基础知识 文档化 文档化在通过其他文件来实现 Dockerfile本身就是比较好的文档,可读和可理解性比较强。也可配合其他文档带来详细说明 升级,维护 后续升级和维护麻烦,需要再次运行镜像并对内部软件进行升级或者安装新软件增加特性 后续升级和维护会相对简单,可以直接在dockerfile中更改并增加新特性 具体选择哪种方式来制作镜像需要结合实际情况来选择 Dockerfile 关键字详解 FROM FROM用来指定基础包。在上面的例子中,基础包用的是ubuntu。 MAINTAINER 镜像作者信息,或者维护人员信息 ADD 将文件拷贝到Container内文件系统对应的路径 格式 ADD <src file> <dst file> 所有拷贝到Container中的文件和文件夹权限为0755,uid和gid为0 如果需要修改owner用户或者权限,需要使用RUN进行修改 ADD文件,文件路径要在docker build<PATH>中指定的<PATH>下 RUN 创建镜像时执行 ENV 用来设置环境变量 EXPOSE Container内部服务开启的端口 主机上如果要使用,还需要在启动Container时,做host-container的商品映射 使用EXPOSE后,一些自动化布署工具可以直接读取这个信息,自动进行端口映射 EXPOSE可以有多条,指定多个端口 WORKDIR 切换工作目录,可进行多次切换(相当于cd命令) 切换目录对RUN,CMD,ENTRYPOINT有效 USER 执行container的用户,如未指定,则默认使用root用户 ENTRYPOINT Container启动时执行的命令,一个Dockerfile中只能有一条ENTRYPOINT ENTRYPOINT没有CMD的可替换特性 CMD Container 启动时执行的命令,一个Dockerfile 中只能有一条CMD命令,如果有多条则只执行最后一条CMD 如果有多条命令希望在启动后执行,可以考虑使用shell 脚本 与ENTRYPOINT的区别 CMD的主要用途是为可执行的container提供默认命令 CMD在运行时是可替换的,比如 在ubuntu中,CMD指定的是/bin/bash。默认情况下运行ubuntu,container中的/bin/bash会被执行 如果使用docker run指定运行命令,那CMD会被替换掉 如:docker run ubuntu /bin/echo "this is a echo". 这时,container 启动后会执行echo 而不是/bin/bash了 ENTRYPOINT是不会替换的,如果在ubuntu镜像中加入ENTRYPOINT,那ENTRYPOINT在启动后会先被执行 CMD可以为ENTRYPOINT来提供参数 例子: FROM ubuntu:14.10 ENTRYPOINT ["top", "-b"] CMD ["-c"] VOLUME 语法:VOLUME [PATH] VOLUME指令用来设置一个挂载点,可以用来让其他容器挂载以实现数据共享或对容器数据的备份、恢复或迁移 可以将本地文件夹或者其他Container的文件夹挂载到Container中

(0)

相关推荐

  • 如何制作多合一系统镜像

    一个个分开来是微软系统镜像的风格(特别是不同系统架构),并且有的标是企业版,但包含了其它版本,其实制作多合一系统镜像可以省掉很多存储空间,因为除了install.wim文件外,其它大部分都是重复的.这 ...

  • 四步制作Win7 SP2 ISO镜像 在不怕重装补丁多问题

    对于Win7用户来说,自从SP1之后就没有过新的服务包发布.虽然2016年发布过“便捷更新包”,但并未被集成到镜像中.用户可以自己动手制作所谓的“SP2”ISO镜像,使用该镜像安装Windows7后, ...

  • 使用UltraISO制作U盘系统镜像的方法

    前面有讲过将U盘制作为PE工具,对电脑进行启动,重装系统的方法.下面为大家介绍一下,直接将U盘制作为镜像安装系统的方法. 操作方法 01 首先,准备一个U盘,至少在16G以上(方便文件存储及运行),插 ...

  • U大师U盘启动盘制作工具 启动ISO镜像文件网络版

    操作方法 01 大家系统都装好了吗?装好系统之后知道如何启动自定义ISO/IMG文件吗?只有启动镜像文件系统才能正常使用,所以今天小编要教大家如何安装自定义ISO/IMG镜像文件,用U盘装系统的朋友看 ...

  • 美图秀秀制作一张画中画镜像图

    首先,请大家跟小编一起熟悉一下我们将要使用的作图软件:美图秀秀 美图秀秀是一款非常大众化的作图软件(好吧小编承认名字确实有些任性了=-=),不但功能强大,而且十分实用,一直受到广大使用者的好评。它不像 ...

  • 美图秀秀如何制作一张画中画镜像图

    美图秀秀是一款非常大众化的作图软件(好吧小编承认名字确实有些任性了=-=),不但功能强大,而且十分实用,一直受到广大使用者的好评。它不像photoshop(也就是我们大众所熟悉的PS)那么专业,界面通 ...

  • 如何制作完整的Ubuntu本地源镜像(以Ubuntu12.04为例)

    本地部分源镜像的优点是占用空间比较小,一个部分软件包源根据系统需要所占的空间大概也就在1G~2G之间.能满足系统备份还原的基本需求,凡是备份下来的软件包都能安装.但是它的缺点和局限性也是很明显的,它只 ...

  • docker pull 下来的镜像文件存放的位置

    docker pull 下来的镜像文件存放的位置

  • win10系统原生镜像U盘制作(可作为恢复盘使用)

    win10是微软最新的操作系统,它兼顾着win7和win8.1的特性为一体,同时也带来了很多新的功能.网络上很多ghost版系统傻瓜式安装,但缺乏安全性,同时容易携带病毒和广告,下面教大家自己制作wi ...