Docker 创建镜像Dockerfile

Docker镜像的创建方法

Docker镜像除了是Docker的核心技术之外也是应用发布的标准格式。一个完整 的Docker镜像可以支撑一个Docker容器的运行,在Docker的整个使用过程中,进入 一个已经定型的容器之后,就可以在容器中进行操作,最常见的操作就是在容器中安装应用服务,如果要把已经安装的服务进行迁移,就需要把环境以及搭建的服务生成新的镜像。
创建镜像的方法有三种,分别为基于己有镜像创建、基于本地模板创建以及基于 Dockerfile创建。
下面着重介绍这三种创建镜像的方法。

1:基于已有镜像创建

基于已有镜像创建主要使用docker commit命令。实质就是把一个容器里面运行的程序以及该程序的运行环境打包起来生成新的镜像。

命令格式:docker commit [选项]容器ID/名称仓库名称:[标签]

常用选项:
-m:说明信息
-a:作者信息
-P:生成过程中停止容器的运行
下面是如何使用一个已有镜像来创建新镜像的例子。
首先启动一个镜像,在容器里做修改,然后将修改后的容器提交为新的镜像,, 要记住该容器的ID号,如:
之后可以使用docker commit命令创建一个新的镜像,如:

创建容器
# docker create -it centos:7 /bin/bash
# docker ps -a   可看到创建状态的容器

# docker commit -m "new" -a "daoke" 容器ID daoke:centos
514a393b0cl999abbef373c991914341327006cc5e74ad435c30fae7b463cf97

创建完成后,会返回新创建镜像的ID信息。
査看本地镜像列表可以看到新创建 的镜像信息:

# docker images |grep daoke
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
daoke centos 514a393b0cl9 2 minutes ago 196.7 MB

2:基于本地模板创建

通过导入操作系统模板文件可以生成镜像,模板可以从OPENVZ开源项目下载, 下载地址为 http://openvz.org/Download/template/precreatedo
下面是使用docker导入命令将下载的debian模板压缩包导入为本地镜像的例子。

# wget http://download.openvz.org/template/precreated/debian -7.0-x86-minimal.tar.gz
# cat debian-7.0-x86-minimal.tar.gz |docker import - daoke:new
2eea 1 ad3459c280582be6fd55a7c57817fd5e5f4f91218df89e86e42e480dca0

导入操作完成后,会返回生成镜像的ID信息。
査看本地镜像列表可以看到新创 建的镜像信息。

# docker images |grep new
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
daoke new 2eealad3459c About a minute ago 214.7 MB

3:基于 Dockerfile 创建

除了手动生成Docker镜像之外,还可以使用Dockerfile自动生成镜像。Dockerfile 是由组指令组成的文件,其中每条指令对应Linux中的一条命令,Docker程序将读取Dockerfile中的指令生成指定镜像。
Dockerfile结构大致分为四个部分:基础镜像信息、维护者信息、镜像操作指令和 容器启动时执行指令。Dockerfile每行支持一条指令,每条指令可携带多个参数,支持 使用以“#"号开头的注释。

Docker镜像的分层
■Dockerfile中的每个指令都会创建一个新的镜像层
■镜像层将被缓存和复用
■当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
■某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效
■镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件

Dockerfile有十几条命令可用于构建镜像,其中常见的操作指令
Dockerfile操作指令
在这里插入图片描述
在编写Dockerfile时,有严格的格式需要遵循:
第一行必须使用FROM指令指明 所基于的镜像名称;
之后使用MAINTAINER指令说明维护该镜像的用户信息;
然后是镜像操作相关指令,如RUN指令,每运行一条指令,都会给基础镜像添加新的一层;
最后使用CMD指令,来指定启动容器时要运行的命令操作。

注意:
RUN 是在容器内部执行的
ADD是把外部的文件 复制到容器中
Dockerfile只能有一条CMD命令

使用Dockerfile 创建镜像并在容器中运行的完整步骤:
首先需要建立目录,作为生成镜像的工作目录,然后分别创建并编写Dockerfile文件,需要运行的脚本文件以及要复制到容器中的文件。

1)建立工作目录
# cd 
# mkdir apache
# cd apache
2)创建并编写Dockerfile文件
# vim Dockerfile
  #基于基础镜像 centos:7
FROM centos:7
  #维护镜像的用户信息
MAINTAINER this is test apache
  #镜像操作指令安装apache软件包
RUN yum -y update	
RUN yum -y install httpd
  #开启80端口
EXPOSE 80
  #复制首页到指定站点
ADD index.html /var/www/html/index.html
  #复制启动脚本到镜像中
ADD run.sh /run.sh
  #设置run.sh执行权限
RUN chmod 755 /run.sh 
  #启动容器时执行脚本
CMD ["/run.sh"]
3)编写执行脚本内容
#vim run.sh
#!/bin/bash
rm -rf /run/httpd/*     清理apache的缓存
exec /usr/sbin/apachectl -D FOREGROUND    启动apache服务
4)创建测试页面
#vim index.html
<h1>this is apache web</h1>

Dockerfile 、执行脚本、 测试页面 要在同一个路径
在这里插入图片描述

5)使用Dockerfile生成镜像
#docker build -t httpd:centos .
-t  : 指定镜像的标签信息

在这里插入图片描述
可以看到创建过程中,每运行一次Dockerfile指令,都会创建临时容器缓存层,都会给初始镜像加上新的一层。

6)使用新镜像运行容器
新镜像运行容器
# docker run -d --name web1 -p 1216:80 httpd:centos     
# docker ps -a    可看到web1做了端口映射
# setenforce 0
# ifconfig

在这里插入图片描述
测试:网页访问,宿主机的IP:1216,可看到首页内容
在这里插入图片描述
容器中的apache服务已经成功运行

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值