本站所有文章均为原创,如对您有帮助,恳请帮忙点击任何一处广告
  • 首页
  • Docker
  • Docker运维教程(5)本地镜像制作与dockerfile

Docker运维教程(5)本地镜像制作与dockerfile

发布:TangLu2019-2-26 13:39分类: Docker 标签: docker dockerfile

虽然Docker仓库中提供了大量镜像,但是当我们找不到现成镜像或者需要在镜像中满足特定功能时,就需要自己来制作一套镜像。Docker提供了三种制作镜像的方式:docker save/load、docker commit命令和Dockerfile构建文件

一、使用Docker save保存本地镜像

该方式可以直接将本地已经做好的镜像保存好,然后在另外的主机上载入,如下:

docker save -o myimages.gz tanglu/centos:v1.1 tanglu/nginx:v14  #保存了2个镜像,名为myimages.gz
docker lode -i myimages.gz  #在另外的机器上载入即可,-i=input


二、使用docker commit命令制作(更新)镜像

docker commit命令是创建镜像最直观的方法,也可以说是在一个基础镜像上更新一个新的镜像。整个过程就是运行已有镜像、修改容器、保存容器为新镜像。

下面是一个操作示例,详细记录了在一个全新Centos镜像中安装一个VIM,并且将安装好VIM的容器保存为一个新镜像的过程:

1、运行一个基础镜像

docker run -it centos


2、在该容器中安装vim

yum install vim -y


3、使用commit提交镜像,centos_with_vim是新镜像的名字,加-p可以在打包时先暂停容器,避免数据不一致

docker commit centos centos_with_yum  #在centos这个容器基础上生成名为centos_ip的新镜像


4、查看镜像,发现生成新镜像,大小有了显著的变化,如图

docker_commit.png


三、使用Dockerfile制作镜像

由于docker commit是一种纯手工的制作方式,容易出错,效率也不够高,且无法得知别人镜像中包含了什么东西,有安全隐患。所以官方推荐使用Dockerfile来构建镜像。Dockerfile是一个纯文本文件,里面包含了各类Docker所支持的指令,支持读取系统环境变量。Docker运行时会自上而下去执行Dockerfile中的文件。所以只需要堆叠好相关指令就可以编写一个Dockfile。顺带提一句,在Docker hub的描述页中也是可以看到镜像的Dockerfile的

1、编写Dockerfile文件,默认文件名为Dockerfile(文件名首字母必须大写)。这里使用了一些常用的Dockerfile选项,在本文后面有作解释

vim /data/dockerfile1/Dockerfile

# Description: test image
FROM nginx:latest
EVN DOC_ROOT=/data/web/html
COPY index.html $DOC_ROOT
COPY yum.repos.d /etc/yum.repos.d/  #确保源文件在工作目录中,并且目录目录必须以/结尾
ADD http://nginx.org/download/nginx-1.15.2.tar.gz /usr/local/src #如果是本地tar包会解压到容器的目录中,URL的话则不会
WORKDIR /usr/local/soft/  #使用WORKDIR指定目录
ADD nginx-1.15.2.tar.gz ./  #这里就使用了上面的WORKDIR
VOLUME /data/web  
EXPOSE  80/tcp 80/udp  #将容器的80端口暴露给宿主机
USER  501  #UID可以是任意数字,但必须在/etc/passwd中存在


2、运行docker build命令创建镜像

docker build -t test:v1 .  
# -t指定镜像名
# -f指定dockerfile路径,默认为当前目录中的Dockerfile


3、查看并运行新的镜像

docker images
docker run --name test --rm test:v1 ls /etc/yum.repos.d/



四、Dockerfile编写说明与选项介绍

    FROM:该指令是重要且必须是Dockerfile文本第一个非注释行,用于指定基准镜像,比如centos,后续的指令都是根据基准镜像所运行

    MAINTAINER:可选项,用于提供制作者的相关信息。该选项可以使用LABLE代替

    COPY:从Docker宿主机中复制文件到新的镜像中。这些文件必须和Dockerfile保持同级或是其子目录;如果源文件是目录则会自动复制目录内的文件,而不包含目录本身;如果是压缩包的话会自动解压;如果目标路径不存在会自动创建;目录必须以/结尾。

    ADD:类似COPY指令都是在容器中添加文件,ADD支持URL路径,并且会自动解压

    WORKDIR:进入容器后的默认目录,可用于指定Dockerfile中所有RUN、CMD、ADD等指令的工作目录,可出现多次。

    EXPOSE:为容器打开指定要监听的端口以实现端口映射(docker -p选项的作用),默认为tcp协议,可一次暴露多个端口,只不过宿主机中的端口只能动态绑定。

    VOLUME:在容器中挂载一个卷实现数据持久化。而这个卷在宿主机中的路径无法在这里指定,是随机生成的,查看docker inspect中的mounts信息可以看到路径

   ENV:定义镜像所需的环境变量,可以被位于其后面的其他指令调用,如ADD、COPY

   RUN:在docker build过程中运行一个基于基础镜像的命令,该命令需要在基础镜像中存在,这是安装软件包的最佳实践方法

   CMD:镜像启动后自动运行的命令,通常只能有一个CMD指令,如果设置了多个CMD,只有最后一个会生效,如果运行docker run时指定了命令,则会覆盖CMD的配置

   ENTRYPOINT:类似于CMD指令,用于指定容器默认运行程序,但是该指令无法被docker run的命令所覆盖,docker run如果有配置命令的话也会被当做ENTRYPOINT的参数,除非加了--entrypoint选项。

   USER:运行镜像时任何指令所使用的用户名和UID,默认是root

温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,谢谢合作!
et_highlighter51
版权所有:《Linux运维技术学习站点
文章标题:《Docker运维教程(5)本地镜像制作与dockerfile
除非注明,文章均为 《Linux运维技术学习站点》 原创
转载请注明本文短网址:http://www.linuxe.cn/post-472.html  [生成短网址]

已有 0/724 人参与

发表评论:

欢迎分享Linux运维技术学习站点

欢迎使用手机扫描访问本站,还可以关注微信哦~