文档章节

docker commit 与 docker build

s
 spiders
发布于 2015/11/03 09:13
字数 1574
阅读 2786
收藏 2

在使用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中


本文转载自:http://jingyan.baidu.com/article/948f5924151366d80ff5f9dc.html

共有 人打赏支持
s
粉丝 2
博文 56
码字总数 14428
作品 0
北京
后端工程师
私信 提问
docker image 管理

通常我们在官方下载的镜像不能够切合的在我们生产环境中使用,比如缺包,和我们环境中所需要的环境软件版本不一致等,所以我们要自己制作镜像 制作镜像又两种方法: 启动docker容器后,把容器...

shy润物无声
2018/06/29
0
0
Docker学习笔记(二)

如何创建或者更新一个image? There are two ways you can update and create images. You can update a container created from an image and commit the results to an image. You can us......

遥借东风
2016/11/18
62
0
Docker笔记三 Docker镜像制作

Docker笔记三 Docker镜像制作 1.Docker镜像制作方法: docker commit 保存当前container的状态到镜像,生成image。 docker build 利用dockerfile自动化生成image。 2.制作方法 docker commi...

frogtwo
2017/06/15
0
0
利用 docker 配置 pinbot-crawl 环境

pinbot-crawl 是我在开发的一个爬虫项目,它应用到的东西相对较多,oursql, python3-memcached, gearman, python3。 docker 挺好玩的我就用了一下配置了运行环境,如下 $ # start a containe...

李孟君
2013/08/10
0
0
镜像的查看,获取,推送和构建

删除镜像 docker rmi 镜像名字 查找镜像: Docker Hub :http://registry.hub.docker.com docker search [options] term --automated =false --no-trunc=false 拉取镜像: docker pull [optio......

龙之天空
2016/10/09
5
0

没有更多内容

加载失败,请刷新页面

加载更多

IOS  学习记录

1.StackView=>IOS 9及以上支持 2.布局方式: AutoLayout / StackView 堆布局 (线性布局) 3.屏幕适配 (资源分辨率、设计分辨率、屏幕分辨率) Size Class技术 可以针对 屏幕的方向进行设置...

萨x姆
今天
4
0
第四次工业革命:自主经济的崛起

https://36kr.com/p/5170370.html

shengjuntu
昨天
3
0
Cloud Native 与12-Factor

12-Factor(twelve-factor),也称为“十二要素”,是一套流行的应用程序开发原则。Cloud Native架构中使用12-Factor作为设计准则。 12-Factor 的目标在于: 使用标准化流程自动配置,从而使...

waylau
昨天
9
0
java多线程2

“非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在线程安全问题。这是因为方法内部的变量都是私有造成的。 synchronized 获取的都是对象锁。如果多个线程访问多个...

一滴水穿石
昨天
4
0
今天的学习

1,document.location.href:获取整个url 2,str.split(' '):用字符分割字符串 3,$this->load->library(' '):引用图像处理类 4,$this->load->library(' '):引用Email类 5,特殊访问指针$th......

墨冥
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部